在git的post-merge钩子中列出更改的文件

10

在合并后的钩子中,是否有一种方法可以获取所有被更改的文件列表,即使它是快进式合并?

2个回答

14

列出修改文件的正确 Git 命令是 diff-tree

此外,也可以使用 ORIG_HEADHEAD 快捷方式

git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD

(另请参见:列出Git提交中的所有文件)

[更新]

也许使用 HEAD@{1} 代替 ORIG_HEAD 会更好。 即:

git diff-tree -r --name-only --no-commit-id HEAD@{1} HEAD

在使用git pull --ff-only命令时,如果有许多提交可以添加,那么HEAD@{1}(在合并后钩子中)将给出此命令之前的最后一个提交,而ORIG_HEAD只给出HEAD^提交(至少在Git 2.1.4中是如此)。


1
请记住,ORIG_HEAD和HEAD@{1}并不总是相同的。 HEAD@{1}始终是最后一次提交,而ORIG_HEAD是Git认为危险操作的最后一次提交。请参见此答案:https://dev59.com/h3NA5IYBdhLWcg3wbNQ4#967611 - Kioshiki

3

我认为你在这种情况下最好的选择是参考日志。如果你只是快进了,HEAD的参考日志的第一行将如下所示:

63e21fb HEAD@{0}: merge origin/master: Fast-forward

因此,你应该能够仅打印第一行 (git reflog -n 1),检查它是否与 merge .*: Fast-forward$ 匹配,如果匹配,则执行 git diff HEAD@{1} HEAD。(你可能需要查看 reflogs 来验证是否存在快进合并,除非你可以从脚本中确信现在它是唯一的可能性。)


7
也许我有所遗漏,但为什么不直接使用git diff --name-only HEAD@{1} HEAD 呢? - Mark Longair
@Mark:已经修改以解决这个问题。 - Cascabel
啊,谢谢你们两个。我不知道 @{} 符号的用法。 - mckeed
我认为如果是非快进合并,diff仍然会产生合理的结果,因此您根本不需要检查它是否是ff。 - Mark Longair
@Mark:我想我在考虑边角情况,例如恶意合并,你可以通过git show <merge commit>获得更完整的差异输出,但是你是对的,如果你只看变更文件列表,那就无所谓了。 - Cascabel

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