我想找出哪个提交引入了一个文件。我目前正在做:
git log --reverse --pretty="%h" <filename> | head -n 1
但我意识到这是非常昂贵的。有没有办法更快(使用更便宜的管道命令)?也许通过平分历史?
我想找出哪个提交引入了一个文件。我目前正在做:
git log --reverse --pretty="%h" <filename> | head -n 1
但我意识到这是非常昂贵的。有没有办法更快(使用更便宜的管道命令)?也许通过平分历史?
这应该可以解决问题:
git log --oneline <filename> | tail -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
or 或tail
.
使用 diff-filter=A
git log --reverse --format=%H --name-status --diff-filter=A -- file1 file2 | grep ^A | cut -f2
对于任意数量的文件,您将在一次遍历中获得所需的排序。
如果您对添加文件的时间有一个粗略的了解,可以尝试
git log --reverse --until 2012-06-01 -n 1 -- <filename>
如果您相当确定该文件不是在 2012 年 6 月 1 日之后引入的。--reverse
和的组合-n 1
仅显示早于给定日期的第一次提交。如果你没有得到任何结果,你的估计太早了,你需要稍后再试。
鉴于git
存储历史的方式(使用有向无环图),我认为git log
通过将较低级别的管道命令串在一起所需的工作量并不会显着增加。