获取 git merge 中的完整文件路径
我正在开发一种工具来分析合并许多主题分支的输出并生成详细的冲突报告。我遇到了一个小问题,有时 Git 会在合并命令的输出中生成截断的文件名,例如
Merge made by recursive.
.../somepath/anotherpath/toolong/default.css | 2 +-
当在其他情况下它给出完整路径时,
Auto-merging thefullpath/to/myfile/default.jsp
我希望始终拥有可用的完整路径以匹配文件合并之间。
I'm working on a tool to analyse the output of merging many topic branches and produce a detailed conflict report. I've run into a slight problem in that sometimes Git will produce a truncated file name in the merge command's output, such as
Merge made by recursive.
.../somepath/anotherpath/toolong/default.css | 2 +-
When in other cases it gives the full path
Auto-merging thefullpath/to/myfile/default.jsp
I would like to always have the full path available in order to match files between merges.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我对你的最终目标有点困惑,但我想我无论如何都能提供答案。
如果您想在合并遇到冲突时获得良好的更改报告,即当所有内容仍未提交时,您应该使用 git status --porcelain 。它提供了一个很好的、机器可读的所有文件及其状态(包括合并冲突状态)的列表,并且有详细记录 在手册页中。根据您的用例,您甚至可以使用 git merge --no-commit 来确保您有机会在继续(提交)之前检查合并结果。您还可以使用 git diff HEAD --numstat 来获取按文件添加/删除的行数的机器可读报告。
如果您想在事后检查合并,那么这是
git diff-tree
:-c
告诉它对父级进行比较合并提交,--numstat
像以前一样为您提供良好的机器可读输出。最后,如果您想生成极其详细的冲突报告,您可以传递
-p
而不是--numstat
,从而为您提供完整的补丁输出。这是您将在 gitk 中看到的那种补丁,其中每行开头有两个字符,指示该行是否相对于每个父级添加/删除。仅来自一个父级的更改只有一个符号(例如'+ '
、' -'
、添加引号以使空格可见),而手动更改的行作为冲突的一部分分辨率有两个 (--
,++
)。如果确实需要的话,你可以自己解析它。 (不幸的是,我认为没有像--numstat
这样的东西可以用于合并提交。)I'm a little confused by your end goal, but I think I can provide an answer anyway.
If you want to get a good report of changes when a merge runs into conflicts, i.e. while everything is still uncommitted, you should use
git status --porcelain
. It gives a nice, machine-readable list of all files and their statuses (including merge conflict states) and is well-documented in the manpage. Depending on your use case, you might even usegit merge --no-commit
to ensure you have the chance to inspect the merge result before proceeding (committing). You could also usegit diff HEAD --numstat
to get a machine-readable report of the added/removed line counts by file.If you want to examine merges after the fact, it's a very good use case for
git diff-tree
:The
-c
tells it to diff merge commits against both parents, and the--numstat
gets you a nice machine-readable output as before.Finally, if you wanted to generate extremely detailed conflict reports, you could pass
-p
instead of--numstat
, giving you full patch output. This is the kind of patch you'll see ingitk
, where there are two characters at the start of each line, indicating whether the line was added/removed relative to each parent. Changes coming from just one parent have just one symbol (e.g.'+ '
,' -'
, quotes added to make spaces visible), while lines changed manually as part of conflict resolution will have two (--
,++
). You could parse it yourself if you really had to. (Unfortunately I don't think there's anything like--numstat
on steroids for merge commits.)