我在 StackOverflow 上看到了其他 Mercurial case-folding Answers - 他们说,如果您可以访问像 unix 这样的区分大小写的文件系统,那么请在那里查看并修复它。问题是,我无法访问 unix 机器,我是一名开发 Windows 应用程序的 Windows 开发人员。
我如何在没有 Unix 机器的情况下解决这个问题?
我在 StackOverflow 上看到了其他 Mercurial case-folding Answers - 他们说,如果您可以访问像 unix 这样的区分大小写的文件系统,那么请在那里查看并修复它。问题是,我无法访问 unix 机器,我是一名开发 Windows 应用程序的 Windows 开发人员。
我如何在没有 Unix 机器的情况下解决这个问题?
正在处理的filesystem
帮助主题将包含在 Mercurial 的下一版本中:
https://www.mercurial-scm.org/pipermail/mercurial-devel/2012-April/039522.html
重命名冲突文件
在不区分大小写的文件系统上,更新到包含大小写冲突文件的修订版将中止,即使使用
--check
or--clean
。要修复此类修订,您应该为区分大小写的文件系统上的一个或两个冲突文件指定新名称,并提交它们以创建新的冲突安全修订。
.. 注意:: 如果您想(或需要)在不区分大小写的文件系统上浏览或修复此类修订,请参阅“手动更新”部分。
如果 :hg:
merge
被中止,但 :hg:update --check
对每个修订成功,则在要合并的修订之间发生冲突。在这种情况下,应重命名其中一个或两个中的文件以避免在合并之前发生冲突。
使用最近的 Mercurial,您可以通过以下步骤安全地更改文件名的大小写,即使在不区分大小写的文件系统上:
$ hg rename a.txt tmp $ hg rename tmp A.TXT
手动更新
如果您想(或需要)通过在不区分大小写的文件系统上导致大小写冲突的修订来更新工作目录,例如重命名冲突文件或浏览此类修订中的内容,请参阅下面的 Wiki 页面::
https://www.mercurial-scm.org/wiki/ManualCheckout
对于非专业 Mercurial 用户,不建议这样做。
此处描述了另一种类似的手动方法:
https://www.mercurial-scm.org/wiki/FixingCaseCollisions
不过,这也会深入到 Mercurial 内部,因此除非万不得已,否则您应该避免使用它。
我们通过发出 HG 重命名命令解决了这个问题,而无需使用区分大小写的文件系统。假设您遇到了麻烦,因为“Foo.txt”需要被称为“foo.txt”:
hg rename Foo.txt Foo.txt.renamed
hg rename Foo.txt.renamed foo.txt
当一个文件被删除然后在主存储库中重新创建时,我们遇到了这个问题,名称相同,但大小写不同。尽管已从主存储库中提取了变更集,但无法合并在这些更改之前创建的分支存储库。
为了在 Windows 上解决案例折叠问题,我猜你在 repo 的不同分支或头部有不同的案例,合并时它会成为一个问题。我看不出(在 Windows 上)你实际上会如何在同一个版本中得到两个不同的情况,而无需通过 unix 框。
因此,如果它们处于不同的修订版中,那么您可以执行以下操作:
hg update <some rev>
hg remove -A -f "Some File"
那么合并就会成功。-A 表示“之后”,-f 表示“强制”。
这是 Windows 中不使用区分大小写的文件系统的常见问题。如果要使用已TortoiseHg Workbench
安装的文件执行此操作,请搜索文件并重命名:
右键单击/TortoiseHg/重命名文件
它会将文件重命名为您想要的正确区分大小写的名称。下一张照片显示了我是如何改变XMLConverter
的XmlConverter
然后在 Workbench 中,您可以提交文件更改:
这是一周后更新的
提出的解决方案可能会给您以后从另一台 PC 更新整个存储库带来问题。因此,解决它的最终方法可能是进行 2 次提交:
所以它变成了这样:
这实际上是它不再在 Windows 中产生冲突的方式。它看起来很丑,但很有效。
如果您使用的是 Bitbucket.org,您可以浏览问题分支上的源代码,转到文件,通过编辑单击下拉菜单,重命名文件(或在我们的例子中重命名目录)提交这些更改并拉取。
感谢 Bitbucket 团队!
我以更简单的方式解决了:
真正导致问题的原因是尝试同时创建和删除在不区分大小写的系统中可能相同的文件/文件夹。
我遇到了这个问题,但不能选择使用 *nix 系统。我能够按照这些说明解决它。
在 Windows 上,目前(在 Mercurial 1.1 之前)可能会在存储库中引入大小写冲突,从而阻止您检出存储库。
修复此类存储库的一种方法是在区分大小写的 Unix 系统上检查它,删除有问题的文件,然后再次提交。
如果这不可能,您可以执行以下操作:
hg clone --noupdate repo repair
cd repair
hg debugsetparents <bad revision>
hg debugrebuildstate
此时,Mercurial 会认为您已签出错误的修订版并且所有文件都丢失了(状态为“!”)。要修复 repo,我们只需要做:
hg remove --after <file causing the collision>
现在 hg status 应该显示状态为“R”的麻烦文件和状态为“!”的所有其他文件。现在我们可以检查我们的修复:
hg commit --message "fix case collision"
要取回我们所有的文件,我们只需再次签出:
hg update tip
参考:https ://www.mercurial-scm.org/pipermail/mercurial/2008-June/019921.html
我知道这是一个老问题,但这对我有用,我希望它对某人有用。在我的情况下,我有一个旧版仓库,其中有一个需要关闭的旧分支。
我曾经使用 Windows 10 的 Windows bash shell 来解决这个问题lxrun /install
,然后在设置时我安装了 mercurialsudo apt-get install mercurial
这将使您可以通过 mnt 文件夹访问您的文件系统,并且您可以从命令行使用 mercurial。
就我而言,我可以轻松地更新到有问题的分支并关闭它。
正如 Laurens Holst 所说,重命名通过临时文件系统的文件夹/文件对我有用。
$ hg rename a.txt tmp
$ hg rename tmp A.TXT
但是为了使它工作,并避免在合并过程中发生冲突文件错误,我必须在重命名后清除