Git - 找到文件创建的提交记录

24
什么是确定某个文件在哪个提交中被添加到代码库中的最简单方法?
4个回答

34

很容易。下面的命令显示了将文件添加到存储库的第一个提交。

git log --oneline filename | tail -1

10

如果你真的想找到引入文件的提交,你必须考虑重命名。因此,请使用

git log --follow --diff-filter=A -- <filepath>

--diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]
选择只列出添加的文件 (A),复制的文件 (C),删除的文件 (D),修改的文件 (M),重命名的文件 (R) ...

--follow
继续列出文件的历史记录,包括重命名(仅适用于单个文件)。

最后,您还必须调整 --find-renames 阈值。

--find-renames[=]
如果生成差异,则检测并报告每个提交的重命名。要在遍历历史记录时跟踪跨重命名的文件,请参见 --follow。如果指定了 n,则它是相似性指数的阈值(即相对于文件大小的添加/删除量)。例如,-M90% 表示 Git 应该认为删除/添加对是重命名,如果文件中超过 90% 的内容没有更改。没有 % 符号,数字应该被读作分数,并在其前面加上小数点。例如,-M5 变成了 0.5,因此与 -M50% 相同。类似地,-M05 与 -M5% 相同。要将检测限制为精确重命名,请使用 -M100%。默认的相似性指数为 50%。


3

你可以这样说:

git log -1 --reverse --pretty=oneline filename

这应该是第一次提交。

来自git help

   -<n>
       Limits the number of commits to show. Note that this is a commit
       limiting option, see below.

   --reverse
       Output the commits in reverse order. Cannot be combined with
       --walk-reflogs.

为了删除提交信息,请执行以下操作:
git log -1 --format="%H" --reverse filename

1
虽然对于“正常”情况(文件添加后反复修改)来说,这可能是最好的解决方案,但如果文件例如被添加、修改、移除,然后在以后重新引入,或者文件作为一系列重命名的结果出现,我不确定是否有一个好的解决方案。 - twalberg
2
请注意,这些选项是在提交排序和格式化选项(例如--reverse)之前应用的。您的限制将在反转之前应用于1个提交。 - Alexander

1
可能最简单的事情就是一些简单的东西:

git log FILE | grep commit | tail -1 | awk '{ print $NF }'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接