在git后期合并挂钩中列出更改的文件
有没有一种方法可以让合并后的钩子得到一个列表,列出所有被合并更改的文件,即使它是快进的?我认为在这一点上,最好的选择是重新登录。如果您刚刚快进,HEAD的reflog的第一行将如下所示:在git后期合并挂钩中列出更改的文件,git,githooks,Git,Githooks,有没有一种方法可以让合并后的钩子得到一个列表,列出所有被合并更改的文件,即使它是快进的?我认为在这一点上,最好的选择是重新登录。如果您刚刚快进,HEAD的reflog的第一行将如下所示: 63e21fb HEAD@{0}: merge origin/master: Fast-forward 因此,您应该能够只打印第一行(git reflog-n1),检查它是否匹配merge.*:Fast forward$,如果匹配,请执行git diff HEAD@{1}HEAD。(您确实希望查看reflog
63e21fb HEAD@{0}: merge origin/master: Fast-forward
因此,您应该能够只打印第一行(
git reflog-n1
),检查它是否匹配merge.*:Fast forward$
,如果匹配,请执行git diff HEAD@{1}HEAD
。(您确实希望查看reflogs以验证是否存在快进合并,除非您可以从脚本中确信这是现在唯一的可能性。)列出更改文件的正确Git命令是
也可以使用ORIG_头
和头
:
git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD
(另见:)
[upd]
也许最好使用HEAD@{1}
代替ORIG_HEAD
。即:
git diff-tree -r --name-only --no-commit-id HEAD@{1} HEAD
在使用
git pull--ff only
命令的情况下,当可以添加多个提交时,HEAD@{1}
(在post merge hook中)给出此命令之前的最后一个提交,而ORIG_HEAD
只给出HEAD^
提交(至少在git 2.1.4中)。也许我遗漏了一些东西,但沿着这些思路,为什么不直接做git diff--name only HEAD@{1}HEAD?@Mark:修改后解决这个问题。啊,谢谢你们两位。我不知道@{}
符号。我想如果它是非快进合并,那么diff仍然会产生合理的结果,所以你根本不需要检查它是否是ff。@马克:我想我在考虑一些特殊情况,例如邪恶合并,在那里你可以通过git show
获得更完整的diff输出,但是你是对的,如果你只是查看更改的文件列表,这并不重要。记住,ORIG_HEAD和HEAD@{1}并不总是一回事。HEAD@{1}始终是最后一次提交,而ORIG_HEAD是Git认为危险操作的最后一次提交。看看这个答案: