如何找到Mercurial存储库中存在冲突的所有合并?

时间:2013-03-29 16:50:59

标签: version-control mercurial awk grep

我正在研究开源项目中的合并。

我最近问了How can I find all the commits that have multiple parents in a Mercurial repository?,得到了一个非常好的答案。

现在我需要缩小查询范围,才能找到有冲突的提交。

对于冲突,我的意思是在两个贡献提交中修改了相同的文件。

另外,如果我能找到一个mercurial或bash(grep,awk?)命令,它只会给我两个贡献者修改同一行的提交,这将非常有用。

想法是找到无法自动解析的提交。

那么,我怎样才能找到Mercurial存储库中存在冲突的所有合并?

4 个答案:

答案 0 :(得分:2)

没有简单的方法可以找到这些,因为合并中没有记录任何内容以指示合并是否存在冲突。

请注意,在两个分支中修改的文件不一定构成冲突,如果文件是:

,则只会导致冲突
  1. 不可合并(即二元或类似)
  2. 或者,文件中的至少一个区域在两个分支中都已更改
  3. 如果你在一个分支中更改文件的顶部,而在另一个分支中更改底部,并且它们彼此相距足够远(通常在更改之间有几行就足够了),那么这将合并而不会发生冲突。

    您唯一的选择是重播包含两个分支中已更改的文件的每个合并,并记下哪些合并,mercurial无法合并而不会发生冲突。

    另外,我不知道如何使用内置查询语法来查找在两个分支中更改相同文件的合并。我想你必须自己去挖掘日志(也就是一些代码)。

答案 1 :(得分:1)

对于每个合并修订,您可以检索相对于第一个和第二个父修订的已更改文件列表。出现在两个列表中的文件可能都是冲突。

以下是一个示例:

for rev in $(hg log -r "merge()" --template '{rev}\n'); do
    hg status --rev "p1($rev)" --rev $rev --no-status | sort > /tmp/p1
    hg status --rev "p2($rev)" --rev $rev --no-status | sort > /tmp/p2
    echo Conflicts in $rev:
    comm -1 -2 /tmp/p1 /tmp/p2
done

注意:这可能无法处理重命名的文件。您可以尝试在“hg status”调用中添加“--copies”。

答案 2 :(得分:0)

您可以使用过滤器隔离所有合并文件及其父项。但是,您需要对父母进行区分以查看是否存在任何合并冲突。

答案 3 :(得分:0)

  1. 是的,您必须重播merge-parents之间的每个合并
  2. 合并后检查合并的返回代码
  3.   

    成功时返回0,如果有未解析的文件则返回1。