0

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

我最近问如何在 Mercurial 存储库中找到所有具有多个父项的提交?,并得到了很好的答案。

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

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

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

这个想法是找到无法自动解决的提交。

那么,如何在 Mercurial 存储库中找到所有发生冲突的合并?

4

4 回答 4

2

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

注意,一个在两个分支中修改过的文件并不一定会构成冲突,只有当文件是:

  1. 不可合并(即二进制或类似)
  2. 或者,文件中的至少一个区域在两个分支中都发生了更改

如果您在一个分支中更改文件的顶部,而在另一个分支中更改底部,并且它们之间的距离足够远(通常更改之间的几行就足够了),那么这将合并而不会发生冲突。

您唯一的选择是重播包含在两个分支中更改的文件的每个合并,记下 mercurial 无法在没有冲突的情况下合并哪些合并。

此外,我不知道有什么方法可以使用内置查询语法来查找在两个分支中更改了同一个文件的合并。我认为您必须自己去挖掘日志(即使用一些代码)。

于 2013-03-29T20:45:14.417 回答
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

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

于 2013-04-05T12:21:28.790 回答
0

您可以使用过滤器来隔离所有合并的文件以及它们的父文件。但是您随后需要区分父母以查看是否存在任何合并冲突。

于 2013-03-29T21:52:08.623 回答
0
  1. 是的,您必须重播合并父级之间的每次合并
  2. 合并后检查合并的返回码

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

于 2013-04-02T19:45:36.323 回答