查找在git合并提交期间发生冲突或在本地编辑的文件

查找在git合并提交期间发生冲突或在本地编辑的文件,git,merge,pre-commit,Git,Merge,Pre Commit,背景:我正在开发一个预提交工具。作为一名开发人员,拉另一个开发人员的分支,让预提交钩子大声抱怨我甚至没有碰过的文件,这可能会让人非常沮丧 在我的实现中,我希望能够做到的是,在合并提交的情况下,只在合并冲突期间发生冲突或由我在本地手动编辑的文件上运行钩子 到目前为止,我所尝试的: git diff--staged-这是当前解决方案所做的,但不正确,因为它包含所有文件,包括干净合并的文件 git diff MERGE\u HEAD-这非常接近,但是如果我正在合并的分支是在我合并之后从master分

背景:我正在开发一个预提交工具。作为一名开发人员,拉另一个开发人员的分支,让预提交钩子大声抱怨我甚至没有碰过的文件,这可能会让人非常沮丧

在我的实现中,我希望能够做到的是,在合并提交的情况下,只在合并冲突期间发生冲突或由我在本地手动编辑的文件上运行钩子

到目前为止,我所尝试的:

  • git diff--staged
    -这是当前解决方案所做的,但不正确,因为它包含所有文件,包括干净合并的文件
  • git diff MERGE\u HEAD
    -这非常接近,但是如果我正在合并的分支是在我合并之后从master分支出来的,那么它包含了我尚未合并的master的所有更改
  • .git/MERGE\u MSG
    包含冲突文件的列表。这似乎是一个很好的起点,但不包含本地编辑的文件
  • 提交后,
    git show--name only
    会得到我想要的东西。但那太晚了(毕竟我正在实现预提交:D)

当您
git add
以解决冲突时,您会删除冲突记录。因此,要保留此信息而不必重建它,请保留索引文件:

cp .git/index .git/preserved-merge-index
然后

GIT_INDEX_FILE=.git/preserved-merge-index git ls-files --unmerged
将向您显示冲突,以及

GIT_INDEX_FILE=.git/preserved-merge-index git diff-files --name-only
将显示工作树中自记录在合并索引中以来已更改的所有内容

从注释中,您还可以直接在合并中添加文件。要捕获这些冲突,在解决所有合并冲突后,您可以

GIT_INDEX_FILE=.git/preserved-merge-index git diff-index --name-only `git write-tree`

我相信解决方案是
gitdiff-m
。我发现这上面的文件很混乱,所以这是我的总结。给定命令
git diff-m child parent1 parent2..
您将看到一个多父diff,显示如何从每个父级到子级
parent1
[+-]
的第一列中表示,依此类推。这里的主要障碍是你问题中的孩子没有可引用的名字
git写树
来这里解围;它为当前暂存的文件创建一个名称,并将其打印出来

请注意,如果存在任何未合并的文件,写树将失败,这可能是您想要的,但在这种情况下,您需要确保您的系统执行一些可理解的操作

$current\u ADDED=`git write tree`
$git diff-m$当前添加的头合并头
diff--cc自述文件
索引2ef4a65,8e2e466..be3d46e
---a/自述
+++b/自述
@@@ -1,10 -1,5 +1,10 @@@
-仅在中删除
+仅添加在
-仅在中删除
+仅添加在
--合并期间删除
++合并期间添加

这会产生同样的结果(在我的小测试用例中),而且看起来更简单。使用.git/files是一个负数。“
MERGE\u HEAD
也是一个.git/文件
git-stash
并不是为了完成你让它做的事情而构建的。在垃圾堆周围包装一层用于其他事情的命令只是一种阻碍。(更具体地说:
GIT_INDEX_FILE
是一个已发布的接口。GIT就是这样使用的,它的内部结构非常简单,非常健壮,因此值得使用。命令集不是一个抽象,它是一个工具包。存储库结构是帮助您使用的工具,但没有法律或理由不这样做(需要做什么)事实上…我回去尝试了这个方法,但无法重现我想要的行为。下面是我的简单测试和输出:我希望输出中包含
conflict\u file
commit\u\u file
。合并后您需要立即保留索引文件,因此此后所做的工作显示为差异。对于该场景在您的问题中(冲突和无偿编辑),但它不会捕获在合并提交中无偿添加的文件。我也添加了一些内容来捕获这些文件。
git diff-m`git write tree`HEAD merge\u HEAD