Mercurial合并导致文件被标记为修改,但它们是二进制相等的。

5

我正在进行合并操作,此时我已经准备好提交,但是TortoiseHg的提交对话框显示许多文件已被修改,但当我与父版本进行比较时,所有文件都是二进制相等的。

  • I do not have and have never had the eol extension enabled.
  • Revert changes nothing, the file is still registering as modified.
  • hg parents shows two parents for the file.
  • hg stat shows the file as modified, e.g.

    c:\Projects\MyProject>hg stat Authorization\AuthorityGroups.cs  
    M Authorization\AuthorityGroups.cs  
    
  • hg diff --git shows nothing, e.g.

    c:\Projects\MyProject>hg diff --git Authorization\AuthorityGroups.cs   
    c:\Projects\MyProject>   
    
我已经在两台不同的机器上尝试过两个独立的克隆,但发现了相同的问题。是否有其他想法可以诊断或解决这个问题?显然有些改变发生了,但如果它在hg diff --git中没有显示出来,我如何确定可能的更改内容呢?
更新2014/12/10:
我对两个父版本的历史记录进行了更多检查,我认为我知道为什么它会混淆了。
我们在默认分支上添加了原始父文件。
在Apple分支上,该文件已被重命名以将其移动到新位置。
在Orange分支上,该文件的添加是为了将其移动到相同的新位置。
因此,两个分支上的文件是二进制相同且位于相同的位置,但Mercurial似乎将其标记为要合并的差异,因为它们通过不同的方式到达了相同的位置。
因此,问题变成了:
是否有任何方法可以事后修复将移动视为添加和删除的长期提交更改集(新提交可以,但我无法编辑历史记录),还是我只需要让它在合并中 through 过去就行了?

我认为你已经这样做了,但以防万一,对每个父级分别进行差异比较,因为它可能与第一个父级二进制相等,但与第二个不同。(只需右键单击第二个父级并执行“diff to local”即可。) - Edward
不幸的是,它确实报告了二进制等于两个父级,但是我已经按照您建议的对每个父级进行了单独的差异比较,但是两者都没有返回任何内容,因此就 hg diff --git 而言,这些文件看起来确实是相同的。 - Nanhydrin
你能发布一下 hg stat 的结果吗? - bbaja42
c:\Projects\MyProject>hg stat Authorization\AuthorityGroups.cs
M Authorization\AuthorityGroups.cs
- Nanhydrin
1个回答

1
有没有办法在一个长时间提交的变更集中,回顾性地修复将移动视为添加和删除的情况(新提交可以,但我无法编辑历史记录)?
嗯……有点。更新到文件具有旧名称的最新Orange提交(如果您不确定何时发生此情况,则可以使用hg bisect),使用hg rename将其重命名为新名称,提交,然后将其合并到当前的Orange头部。Mercurial应该足够聪明,能够正确注册文件的重命名,并且不会引起冲突(因为我们知道更复杂的Apple / Orange合并没有出现冲突)。
还是需要让它在合并中通过吗?
这更容易。Mercurial的合并算法非常智能。它可以很好地处理这种情况。

除非您有第三个分支,其中文件从未移动,否则第二个选项不太可能引起问题。如果您确实有这样的分支,则只要将其合并到苹果重命名的后代(或从这样的后代合并),您就应该没问题了。主要困难在于与橙色分支进行合并。


这个策略听起来很有道理。最终我还是让合并通过了,当然一切都很好。我还有几个要做,也许会尝试一下这种方法。当然,这种策略的缺点是我必须手动重新命名,而且可能有很多需要重命名的文件,所以最终懒惰成为决定因素! - Nanhydrin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接