Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在git后期合并挂钩中列出更改的文件_Git_Githooks - Fatal编程技术网

在git后期合并挂钩中列出更改的文件

在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

有没有一种方法可以让合并后的钩子得到一个列表,列出所有被合并更改的文件,即使它是快进的?

我认为在这一点上,最好的选择是重新登录。如果您刚刚快进,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认为危险操作的最后一次提交。看看这个答案: