Version control 如何检测在mercurial';中手动合并的文件;什么是历史?

Version control 如何检测在mercurial';中手动合并的文件;什么是历史?,version-control,mercurial,merge,Version Control,Mercurial,Merge,我是新使用mercurial的团队的一员,我们发现,当发生合并时,手动合并的文件中会出现更多错误。是否可以从mercurial日志(即,在有人完成合并并将合并更改集推送到中央存储库之后)检测哪些文件是手动合并的?注意,我不知道这是否是万无一失的。此外,它还需要一份尚未完成的Mercurial library for.NET的副本,可能只在Windows上运行,而且边缘有点粗糙 注意:我假设“手动合并”,您的意思是“Mercurial没有为我们自动合并文件” 这样的文件仍然可以通过外部工具自动或完

我是新使用mercurial的团队的一员,我们发现,当发生合并时,手动合并的文件中会出现更多错误。是否可以从mercurial日志(即,在有人完成合并并将合并更改集推送到中央存储库之后)检测哪些文件是手动合并的?

注意,我不知道这是否是万无一失的。此外,它还需要一份尚未完成的Mercurial library for.NET的副本,可能只在Windows上运行,而且边缘有点粗糙

注意:我假设“手动合并”,您的意思是“Mercurial没有为我们自动合并文件”

这样的文件仍然可以通过外部工具自动或完全自动地合并,但如果上述假设足够好,请继续阅读

然而,我所做的是有效地运行测试存储库中的所有合并,重新进行合并,并要求Mercurial仅使用其内部合并工具,如果Mercurial无法自动合并文件,则会留下未解析的文件,然后报告所有未解析的文件,清理合并,然后转到下一个合并变更集

您需要的库(目前只有源代码形式,我告诉过您它还没有完成):

  • (我的开源项目,托管于)
我在底部附加了一个zip文件,其中包含所有内容、测试存储库、脚本和库的二进制副本

脚本(我用来编写和测试它,测试存储库的输出如下):

包含所有内容的Zip文件(LINQPad脚本、Mercurial.Net程序集,如果您不信任我,请编译它,以及我在上面执行它的测试存储库):


大警告:仅在存储库的克隆中运行此操作!如果这损坏了您的存储库,我将不承担任何责任,无论我认为可能性有多大。

这是answer的shell脚本变体:

示例输出:

analyzing merge #7 between revisions #5 and #6
analyzing merge #10 between revisions #9 and #8
merge changeset #10 between revisions #9 and #8 had 1 unresolved file(s)
  test1.txt
> mergetest.sh --destroy-my-working-copy
-------------------------
examine 7
-------------------------
examine 11
-------------------------
examine 23
-------------------------
examine 31
-------------------------
examine 37
merging test.py failed!

为什么合并文件中会出现错误?当然,您至少要编译代码,并希望在提交(任何内容)之前运行单元测试?严重的编译类型错误不是问题所在。更微妙的问题是,我们有限的单元测试或手动测试直到后来才发现(遗留代码…没有借口,只有现实)。我认为,但我不是100%肯定,一个可以告诉你哪些文件(甚至可能是所述文件的哪些部分)需要手动合并的程序必须有效地尝试再次执行合并,并查看需要解析的文件。这也许可以实现自动化,也可以使用Mercurial Python代码轻松实现,但我对这些库不是很在行。
#!/bin/bash

test "$1" = "--destroy-my-working-copy" || exit

hg log -r 'merge()' --template '{parents} {rev}\n' | sed -e 's/[0-9]*://g' | while read p1 p2 commit
do
        echo "-------------------------"
        echo examine $commit
        LC_ALL=C hg up -C -r $p1 >/dev/null
        LC_ALL=C hg merge -r 26 --config ui.merge=internal:merge 2>&1 | grep failed
done

hg up -C -r tip > /dev/null
> mergetest.sh --destroy-my-working-copy
-------------------------
examine 7
-------------------------
examine 11
-------------------------
examine 23
-------------------------
examine 31
-------------------------
examine 37
merging test.py failed!