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
。大概是在Linux机器上完成的。这是在2008年xyz
- 默认分支修订版3-35:各种其他更改,没有问题
- 修订36:新增要素分支
- feature branch,第71版:注意,在Windows上,Sourcetree报告说
已被删除,所以我将其提交,这将成为李>xyz
- 功能分支,第72版:这是明确删除
和xyz
xyz
xyz
根本不在repo中时,更新回版本1以外的任何其他版本。显然,从2到71的每一个变更集都被这两个文件“污染”,我只能在Windows和Mac计算机上以1的形式签出
通常建议的解决方案——不起作用:它说“hg状态应显示状态为'R'的麻烦文件和状态为'!'的所有其他文件”,但当我按照步骤操作时,它实际上显示状态为'M'的所有其他文件,这显然不是我想要的,并且意味着如果我继续操作,将发生一些数据丢失
此外,我怀疑我永远无法在Windows或MacOS上执行所需的合并,因为我需要修订版35处于可用状态,然后才能将任何内容放入其中
我能做些什么来修复它吗?我的所有文件都是安全的,我也愿意丢失
xyz
文件中的所有数据和修订,以使此repo重新工作,但我真的不希望完全丢失repo和changelog。我找不到合适的修复方法,因此我不得不借用Linux设备来获得区分大小写的文件系统。然后解决办法是:
步骤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