我想知道哪个提交引入了一个文件。我现在正在做:
git log --reverse --pretty="%h" <filename> | head -n 1
但我意识到这非常昂贵。有没有办法更快地完成它(使用更便宜的插入命令)?或许可以将历史分成两部分?
答案 0 :(得分:2)
这应该可以解决问题:
git log --oneline <filename> | tail -1
答案 1 :(得分:1)
也许您不需要git log
,只需要git rev-list
:
git rev-list HEAD -- <filename> | tail -n 1
或
git rev-list --reverse HEAD -- <filename> | head -n 1
基本上与git log
相同的命令,但它只返回
提交的SHA-1,因此格式化日志消息的开销
迷路了。与步行相比,这种开销是否显着
历史是另一个问题。
可以使用git rev-list --bisect
来实现自己的
二进制搜索,但几乎必须重复调用git rev-list
肯定会比单一呼叫head
或tail
更慢。
答案 2 :(得分:0)
如果您大致了解添加文件的时间,可以尝试
git log --reverse --until 2012-06-01 -n 1 -- <filename>
如果您确定在2012-06-01之后未引入该文件。 --reverse
和-n 1
的组合仅显示早于给定日期的第一个提交。如果你没有得到任何结果,你的估计太早了,你需要尝试以后的日期。
考虑到git
存储历史记录的方式(使用有向非循环图),我认为git log
通过将较低级别的管道命令串联在一起所做的工作量远远超过你需要做的工作量
答案 3 :(得分:0)
使用diff-filter = A
git log --reverse --format=%H --name-status --diff-filter=A -- file1 file2 | grep ^A | cut -f2
对于任意数量的文件,您将在一次遍历中获得所需的排序。