如何获取 git 个自动合并文件的列表
How to get list of git auto merge files
有没有办法确定 'git merge' 在用户解决文件冲突并执行 git [=] 之后成功自动合并了哪些文件16=]?如果用户在同一提交中更新了任何成功自动合并的文件,那么也很高兴知道这一点。我有一个预接收挂钩,只需要 运行 手动合并的文件。
好的,根据澄清评论,我会说没有 完美的 答案,但是您可以通过简单地重复合并来获得一个可能足够好的近似值,使用 --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
的实际输出因合并冲突而异。例如,modify/modify 合并冲突(在 fileB
中):
100644 7531cd0643738673e94e850c07a681aedd008bca 1 fileB
100644 85159a3450148691cd6eec96eb06263240990850 2 fileB
100644 bbf71554709c5a9ae8d253b8e15270534f40e3f7 3 fileB
但存在 rename/delete 冲突(fileB
在 "main" 分支中重命名为 fileE
,但在被合并的 "side" 分支中删除):
100644 7531cd0643738673e94e850c07a681aedd008bca 2 fileE
(在此特定情况下没有第 1 阶段或第 3 阶段变体)。其他组合也是可能的:请参阅 git read-tree
documentation 并特别注意“3 向合并”部分。
一旦你有来自 git ls-files -u
的输出(如果 git 可以告诉所有东西都干净地合并,它是空的——这并不意味着合并是正确的,它甚至可能是完整的garbage if git 在语义上确实是错误的——但它是 git 现在可以自动执行的操作,这大概与 git 那时也可以自动执行的操作相同),中止 in -progress合并并恢复适当的分支:
$ git merge --abort
$ git checkout <original-branch>
如果(如 "pre-receive hook" 建议的那样)这一切都在 --bare
存储库中完成,您将需要一个临时工作树(或整个克隆)来执行合并,我真的没有时间在这里试验。
您需要 git checkout
的两个有问题的 SHA-1 只是合并的两个父代。 (请注意,所有这一切都假设一个 2-parent 合并:章鱼合并是正确的。)
如果进行合并的人有 运行 和 -s ours
或某些 -X
选项,这不会重复他们所做的,并且可能会给你一个无用的答案,这就是为什么这无论如何都不完美。不过,我怀疑这是您可以获得完全自动化的最佳选择。
(另请注意,如果您想要一些可能有意义的细微变化,您可能只想单独使用 git read-tree -m
,而不是完整的 git merge
。这只是基于我的 "suspicion of intent" 在这里。我还认为,无论你想出什么,充其量也只是边际效用,最好让你的用户在推送之前自己检查一下。)
有没有办法确定 'git merge' 在用户解决文件冲突并执行 git [=] 之后成功自动合并了哪些文件16=]?如果用户在同一提交中更新了任何成功自动合并的文件,那么也很高兴知道这一点。我有一个预接收挂钩,只需要 运行 手动合并的文件。
好的,根据澄清评论,我会说没有 完美的 答案,但是您可以通过简单地重复合并来获得一个可能足够好的近似值,使用 --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
的实际输出因合并冲突而异。例如,modify/modify 合并冲突(在 fileB
中):
100644 7531cd0643738673e94e850c07a681aedd008bca 1 fileB
100644 85159a3450148691cd6eec96eb06263240990850 2 fileB
100644 bbf71554709c5a9ae8d253b8e15270534f40e3f7 3 fileB
但存在 rename/delete 冲突(fileB
在 "main" 分支中重命名为 fileE
,但在被合并的 "side" 分支中删除):
100644 7531cd0643738673e94e850c07a681aedd008bca 2 fileE
(在此特定情况下没有第 1 阶段或第 3 阶段变体)。其他组合也是可能的:请参阅 git read-tree
documentation 并特别注意“3 向合并”部分。
一旦你有来自 git ls-files -u
的输出(如果 git 可以告诉所有东西都干净地合并,它是空的——这并不意味着合并是正确的,它甚至可能是完整的garbage if git 在语义上确实是错误的——但它是 git 现在可以自动执行的操作,这大概与 git 那时也可以自动执行的操作相同),中止 in -progress合并并恢复适当的分支:
$ git merge --abort
$ git checkout <original-branch>
如果(如 "pre-receive hook" 建议的那样)这一切都在 --bare
存储库中完成,您将需要一个临时工作树(或整个克隆)来执行合并,我真的没有时间在这里试验。
您需要 git checkout
的两个有问题的 SHA-1 只是合并的两个父代。 (请注意,所有这一切都假设一个 2-parent 合并:章鱼合并是正确的。)
如果进行合并的人有 运行 和 -s ours
或某些 -X
选项,这不会重复他们所做的,并且可能会给你一个无用的答案,这就是为什么这无论如何都不完美。不过,我怀疑这是您可以获得完全自动化的最佳选择。
(另请注意,如果您想要一些可能有意义的细微变化,您可能只想单独使用 git read-tree -m
,而不是完整的 git merge
。这只是基于我的 "suspicion of intent" 在这里。我还认为,无论你想出什么,充其量也只是边际效用,最好让你的用户在推送之前自己检查一下。)