如何获取git自动合并文件列表

时间:2015-04-12 21:58:19

标签: git merge

有没有办法通过' git merge'来确定哪些文件已成功自动合并? AFTER 用户解决了文件冲突并执行了git add / commit?如果用户在同一次提交中更新了任何成功自动合并的文件,那么也很高兴知道这一点。我有一个预接收挂钩,只需要在手动合并的文件上运行。

1 个答案:

答案 0 :(得分:2)

好的,根据澄清评论,我说没有完美的答案,但你可以通过简单重复得到一个可能足够好的近似值合并,使用--no-commit阻止合并完成,然后使用git ls-files -u查找当前未合并的文件:

$ git checkout <first-commit-id>
[output indicates detached HEAD]
$ git merge --no-commit <second-id>
[output includes any merge issues]
$ git ls-files -u

git ls-files的实际输出因合并冲突而异。例如,修改/修改合并冲突(在fileB中):

100644 7531cd0643738673e94e850c07a681aedd008bca 1   fileB
100644 85159a3450148691cd6eec96eb06263240990850 2   fileB
100644 bbf71554709c5a9ae8d253b8e15270534f40e3f7 3   fileB

但是存在重命名/删除冲突(fileB已重命名为&#34; main&#34;分支中的fileE,但已删除&#34; side&#34;分支正在合并):

100644 7531cd0643738673e94e850c07a681aedd008bca 2   fileE

(在这个特殊情况下,这里没有第1或第3阶段的变体)。可以使用其他组合:请参阅git read-tree documentation并特别注意&#34; 3向合并&#34;部分。

一旦你得到git ls-files -u的输出(如果所有东西干净地合并到git可以告诉它是空的 - 这并不意味着合并是正确的,如果git是,它甚至可能是完全垃圾关于语义的真正错误 - 但它现在可以自动执行git,这可能与git自动执行的操作相同),中止正在进行的合并并恢复适当的分支:

$ git merge --abort
$ git checkout <original-branch>

如果(作为&#34; pre-receive hook&#34;建议)这一切都在--bare存储库中完成,那么您需要一个临时工作树(或整个克隆)哪个是合并的,我没有时间在这里试验。

有问题的两个SHA-1,你需要git checkout,只是合并的两个父母。 (请注意,所有这些都假定为2父合并:章鱼合并正好。)

如果合并的人使用了-s ours或某个-X选项,则不会重复他们所做的事情,并且可能会给您一个无用的答案,这就是为什么无论如何都不完美。我怀疑它是最好的,你可以完全自动化。

(另请注意,如果您想要一些可能有意义的细微变化,您可能只想单独使用git read-tree -m,而不是完整的git merge。这只是基于我的&#34怀疑意图&#34;在这里。我也认为,无论你提出什么,最多都可能是边际效用,你可能最好只是让你的用户在推动之前自己检查一下。)