Merge 如何解决涉及分支的Mercurial case折叠碰撞?

Merge 如何解决涉及分支的Mercurial case折叠碰撞?,merge,mercurial,case-sensitive,Merge,Mercurial,Case Sensitive,今天我将一个分支合并回一个旧分支,结果被告知由于案例折叠冲突,我无法更新到原始分支 我的回购协议看起来有点像这样: 默认分支,修订版1:添加大多数文件 默认分支,修订版2:添加文件xyz和xyz。大概是在Linux机器上完成的。这是在2008年 默认分支修订版3-35:各种其他更改,没有问题 修订36:新增要素分支 feature branch,第71版:注意,在Windows上,Sourcetree报告说xyz已被删除,所以我将其提交,这将成为 功能分支,第72版:这是明确删除xyz和xyz

今天我将一个分支合并回一个旧分支,结果被告知由于案例折叠冲突,我无法更新到原始分支

我的回购协议看起来有点像这样:

  • 默认分支,修订版1:添加大多数文件
  • 默认分支,修订版2:添加文件
    xyz
    xyz
    。大概是在Linux机器上完成的。这是在2008年
  • 默认分支修订版3-35:各种其他更改,没有问题
  • 修订36:新增要素分支
  • feature branch,第71版:注意,在Windows上,Sourcetree报告说
    xyz
    已被删除,所以我将其提交,这将成为
  • 功能分支,第72版:这是明确删除
    xyz
    xyz
此时,我想将功能分支合并回默认版本,但它不允许我更新回版本71,或者当
xyz
根本不在repo中时,更新回版本1以外的任何其他版本。显然,从2到71的每一个变更集都被这两个文件“污染”,我只能在Windows和Mac计算机上以1的形式签出

通常建议的解决方案——不起作用:它说“hg状态应显示状态为'R'的麻烦文件和状态为'!'的所有其他文件”,但当我按照步骤操作时,它实际上显示状态为'M'的所有其他文件,这显然不是我想要的,并且意味着如果我继续操作,将发生一些数据丢失

此外,我怀疑我永远无法在Windows或MacOS上执行所需的合并,因为我需要修订版35处于可用状态,然后才能将任何内容放入其中


我能做些什么来修复它吗?我的所有文件都是安全的,我也愿意丢失
xyz
文件中的所有数据和修订,以使此repo重新工作,但我真的不希望完全丢失repo和changelog。

我找不到合适的修复方法,因此我不得不借用Linux设备来获得区分大小写的文件系统。然后解决办法是:

  • 将整个存储库复制到安装了Mercurial的Linux机器上
  • 恢复/更新到默认分支上的最新版本,该分支在工作副本中有两个名称冲突的文件,并将它们重命名为不冲突的名称。此后重新应用任何其他更改
  • 更新到另一个分支上的修订,执行相同的操作
  • 正常执行合并
  • 将repo和工作目录复制回Windows
  • 删除/重命名/修改2个重命名的文件,以便只保留1个,并使用所需的名称

  • 步骤4和步骤5可能按任意顺序完成。

    如OP所述,管理所述类型案例冲突的主要指导资源为

    这里给出的说明可能没有可能的那么清楚,所以这里有一份基于其中一个程序的注释成绩单

    我们从一个名为“repo”的存储库开始,它有两个文件:
    a.txt
    a.txt
    。在远程计算机上:

    REMOTE_MACHINE $ hg files
    A.txt
    a.txt
    
    现在让我们假设
    repo
    以某种方式被克隆到本地机器(发生箱子折叠问题的计算机)上。这可能是使用以下命令完成的:

    $ hg clone --noupdate "ssh://REMOTE/DIRECTORY/repo" # illustrative
    
    如果您不想在本地计算机上更改
    repo
    ,则可以(例如)克隆它,如下所示:

    $ hg clone --noupdate repo xrepo  # illustrative and optional 
    
    现在将cd放入要修改的存储库目录中,例如

    $ cd repo   # or perhaps: cd xrepo
    
    您可能需要验证存储库的完整性:

    $ hg verify
    
    接下来是两行黑魔法:

    $ hg debugsetparents tip 
    $ hg debugrebuildstate
    
    此时,Mercurial会认为您已经签出了
    提示
    , 并且所有文件都已丢失(状态为“!”)。就我们而言:

    $ hg st -dram
    ! A.txt
    ! a.txt
    
    现在我们将运行一些普通的hg命令来解决箱子折叠问题。让我们从手动提取感兴趣的文件开始:

    $ hg cat a.txt > lc.a.txt
    $ hg cat A.txt > uc.A.txt
    
    现在从repo中删除两个有问题的文件:

    $ hg -v remove --after a.txt A.txt
    removing A.txt
    removing a.txt
    
    (上面的
    --after
    选项实际上指示Mercurial处理被删除(从存储库中)的文件不在磁盘上的事实。)

    现在我们又恢复正常了。我们可能要签入重命名的文件:

    $ hg -v add lc.a.txt uc.A.txt
    adding lc.a.txt
    adding uc.A.txt
    
    $ hg st -dram
    A lc.a.txt
    A uc.A.txt
    R A.txt
    R a.txt
    
    $ hg commit --message "renamed a.txt to lc.a.txt and A.txt to uc.A.txt"
    $ hg files
    lc.a.txt
    uc.A.txt
    
    $ cat lc.a.txt
    lowercase a
    $ cat uc.A.txt
    uppercase A
    $
    
    # Verify that the original files are still there:
    $ hg files --rev 0
    A.txt
    a.txt
    

    此时,要签出所有其他文件,您可以运行:hg revert--all

    我已经有一段时间没有这样做了,但我以前使用了转换扩展名来清理Windows上的大小写折叠

    注意:我假设这是一个基本上私有的存储库,您可以独占访问它。如果是这样的话,那么这种方法就行了。(即使不是这样,这在技术上仍然有效,但您必须将其作为新的回购协议发布给其他人,因为下面描述的转换将生成所有新的变更集ID。)

    您可以使用convert extension to Mercurial和
    filemap
    选项来实现这一点

    转换可以。。。在转换过程中重命名文件,如果 通过--filemap选项为其提供映射

    filemap是一个指定要包括哪些文件的文件, 重命名或省略

    每行可以包含以下指令之一:

    rename指令重命名文件或目录。改名 子目录放入存储库的根目录中,使用。作为通往 重命名为

    执行此操作的命令行类似于:

    hg convert
    --filehmap filemap.txt
    path\to\source\repo
    path\to\converted\repo

    其中
    filemap.txt
    必须包括以下内容:

    将path\to\XYZ path\to\XYZ\u重命名为大写的

    转换过程应该重命名所有分支上XYZ的所有“实例”,因此我认为涉及分支的事实变得无关紧要

    你总是可以这样做的,梅格
    rename from/file to/file