给定 git 存储库中的单个分支,我如何获取文件的所有版本?最终所需的输出是每个版本一个新的输出文件(尽管将所有版本打印到 STDOUT 也可以,只要很容易确定每个版本的范围)。
这是我目前正在使用的:
branch=master
filename=...whatever...
myids=( $(git rev-list --objects $branch -- $filename | grep $filename | perl -e 'for (<>) { print substr($_, 0, 40) . "\n"; }') )
for (( i=0,j=1; i < ${#myids[@]}; i++,j++ ))
do
echo $i $j
name="output_$j.txt"
git cat-file -p ${myids[$i]} > $name
done
解释我在做什么:
- 用于
rev-list
查找相关哈希 - 去除提交和树的哈希值,只留下文件的哈希值(这些行还包括文件名)
- 剥离文件名
- 运行哈希
cat-file
并生成输出文件
我遇到的两个主要问题是 1)它不健壮,因为它grep
可能有误报,我不确定它是否会跟随文件重命名,以及 2)感觉超级 hacky。
有没有更好的方法来做到这一点,也许可以更好地利用 git 的 API?