我有一个git仓库,每个仓库几乎每天都会添加一个新的提交。Git提取作为单独的文件提交
我想提取文件的副本,因为它查看每个提交到新目录的文件。
理想情况下,文件将根据提交时间进行日期标记(2017_08_24.txt
)。
我已经试过git format-patch -o directory --root HEAD
,但是这会导出更改日志,而不是完整的文件,因为它会查看提交时间。
感谢
我有一个git仓库,每个仓库几乎每天都会添加一个新的提交。Git提取作为单独的文件提交
我想提取文件的副本,因为它查看每个提交到新目录的文件。
理想情况下,文件将根据提交时间进行日期标记(2017_08_24.txt
)。
我已经试过git format-patch -o directory --root HEAD
,但是这会导出更改日志,而不是完整的文件,因为它会查看提交时间。
感谢
git show <commit>:<file>
会像指定的提交散列一样影响文件的内容。您可以使用git log
获取文件上的所有提交,然后使用xargs
将它们传递到git show
。
下面的命令行会提取一系列文件与原来的名称和提交哈希串连对他们说:
$ git log --format="%H" /path/to/file | \
xargs -I % sh -c "git show %:/path/to/file > /path/to/target/filename.%"
对于一个具体的承诺,你可以检索文件的版本是这样
git show 23uggf2f8g:myfile.txt > backupDir/oldVersion.txt
但我认为你必须写一个脚本做自动为每个提交
这里有一个bash脚本。它没有完全测试。你可以随意修改它。
#!/bin/bash
branch=$1
file=$2
git log --pretty=%H $branch | while read hash;do
object="$branch:$file"
objecthash=$(git rev-parse $object 2>/dev/null)
if [ "$object" != "$objecthash" ];then
git cat-file -p $objecthash > $(git log -1 --pretty=%cd --date=format:%Y%m%d_%H%M%S $hash).txt
else
echo "$file does not exist in $hash"
fi
done
我打算把它作为一个重复项来关闭,因为有足够的问题涉及如何从特定修订版获取文件版本。创建脚本来检索并保存文件的所有版本的任务留给OP(请记住,这不是代码写入服务)。结合'git log'(可以调用它显示commit id),这应该不会太难。 – poke