在git merge中获取完整的文件路径

时间:2011-04-12 15:56:14

标签: git version-control merge build-process

我正在开发一种工具来分析合并多个主题分支的输出并生成详细的冲突报告。我遇到了一个小问题,因为有时Git会在merge命令的输出中产生一个截断的文件名,例如

Merge made by recursive.
 .../somepath/anotherpath/toolong/default.css     |    2 +-

在其他情况下,它会提供完整路径

Auto-merging thefullpath/to/myfile/default.jsp

我希望始终拥有完整路径,以便在合并之间匹配文件。

1 个答案:

答案 0 :(得分:2)

我对你的最终目标感到有些困惑,但我认为无论如何我都可以提供答案。

如果您希望在合并遇到冲突时获得有关更改的良好报告,即在所有内容仍然未提交的情况下,您应该使用git status --porcelain。它提供了一个很好的,机器可读的所有文件及其状态列表(包括合并冲突状态),并且有详细记录in the manpage。根据您的使用情况,您甚至可以使用git merge --no-commit来确保在继续(提交)之前有机会检查合并结果。您还可以使用git diff HEAD --numstat按文件获取已添加/删除的行数的机器可读报告。

如果您想在事后检查合并,那么git diff-tree是一个非常好的用例:

git diff-tree -c --numstat <commit>

-c告诉它对两个父母进行差异合并提交,而--numstat可以像以前一样为你提供一个很好的机器可读输出。

最后,如果您想要生成非常详细的冲突报告,则可以传递-p而不是--numstat,从而为您提供完整的补丁输出。这是您在gitk中看到的那种补丁,其中每行的开头有两个字符,表示是否相对于每个父项添加/删除了该行。仅来自一个父级的更改只有一个符号(例如'+ '' -',添加引号以使空格可见),而作为冲突解决的一部分手动更改的行将有两个(--++)。如果你真的需要,你可以自己解析它。 (不幸的是,我不认为类似提交的类固醇有--numstat。)