2

我想找出哪个提交引入了一个文件。我目前正在做:

git log --reverse --pretty="%h" <filename> | head -n 1

但我意识到这是非常昂贵的。有没有办法更快(使用更便宜的管道命令)?也许通过平分历史?

4

4 回答 4

2

这应该可以解决问题:

git log --oneline <filename> | tail -1
于 2013-02-13T15:24:09.997 回答
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必要的方法比仅通过管道调用heador 或tail.

于 2013-02-13T18:14:02.970 回答
0

使用 diff-filter=A

git log --reverse --format=%H --name-status --diff-filter=A -- file1 file2 | grep ^A | cut -f2

对于任意数量的文件,您将在一次遍历中获得所需的排序。

于 2013-05-26T09:09:49.213 回答
0

如果您对添加文件的时间有一个粗略的了解,可以尝试

git log --reverse --until 2012-06-01 -n 1 -- <filename>

如果您相当确定该文件不是在 2012 年 6 月 1 日之后引入的。--reverse和的组合-n 1仅显示早于给定日期的第一次提交。如果你没有得到任何结果,你的估计太早了,你需要稍后再试。

鉴于git存储历史的方式(使用有向无环图),我认为git log通过将较低级别的管道命令串在一起所需的工作量并不会显着增加。

于 2013-02-13T15:43:39.123 回答