解决Windows中的Mercurial Case-Folding Collision

时间:2012-05-10 10:12:35

标签: mercurial

我已经在StackOverflow上看到了其他Mercurial案例折叠答案 - 他们说如果您可以访问像unix这样的区分大小写的文件系统,那么请在那里查看它应该修复它。问题是,我无法访问unix框,我是开发Windows应用程序的Windows开发人员。

如何在没有Unix盒的情况下解决这个问题?

9 个答案:

答案 0 :(得分:26)

正在处理的filesystem帮助主题将包含在下一版Mercurial中:

https://www.mercurial-scm.org/pipermail/mercurial-devel/2012-April/039522.html

  

重命名碰撞文件

     

在不区分大小写的文件系统上,更新到具有的版本   具有案例冲突的文件将中止,即使使用   --check--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的内部,所以你应该避免它,除非作为最后的手段。

答案 1 :(得分:13)

我们通过发出HG重命名命令而不依赖于区分大小写的文件系统来解决这个问题。假设你遇到麻烦,因为“Foo.txt”需要被称为“foo.txt”:

hg rename Foo.txt Foo.txt.renamed
hg rename Foo.txt.renamed foo.txt

我们在删除文件时遇到此问题,然后在主存储库中重新创建具有相同名称但不同大小写的文件。尽管已经从主存储库中删除了更改集,但是在这些更改之前创建的分支存储库无法合并。

答案 2 :(得分:3)

为了在Windows上获得一个案例折叠问题,我猜你在repo中的不同分支或头部有不同的情况,并且在合并时会出现问题。我无法看到(在Windows上)如何在不通过unix框的情况下在同一版本中实际获得两种不同的情况。

因此,如果它们处于不同的版本中,那么您可以执行以下操作:

hg update <some rev>
hg remove -A -f "Some File"

然后合并就可以了。 -A代表'after',而-f代表'强制'。

答案 3 :(得分:3)

Windows中常见的问题是不使用区分大小写的文件系统。如果要在安装TortoiseHg Workbench的情况下执行此操作,请搜索文件并重命名:

右键单击/ TortoiseHg /重命名文件

它会将文件重命名为您想要的右侧区分大小写的名称。下一张图片显示了我如何更改XMLConverter

XmlConverter

enter image description here

然后在Workbench中,您可以提交文件更改:

enter image description here

  

一周后更新了

提供的解决方案可能会在以后从另一台PC更新整个存储库时遇到问题。因此解决问题的最终方法可能是提交2次:

  1. 一个用于将具有不需要名称的文件重命名为某个临时名称。 例如: XMLConverter2
  2. 另一个用于将临时文件重命名为新名称。例如: XmlConverter
  3. 所以它是这样的:

    renaming the temporary files to the new names

    这实际上是它不再在Windows中发生冲突的方式。它看起来很难看但很有效。

答案 4 :(得分:1)

如果您使用的是Bitbucket.org,您可以浏览问题分支上的源代码,转到该文件,通过编辑单击下拉列表,重命名该文件(或者在我们的示例中重命名该目录)提交这些更改并拉动。

谢谢Bitbucket团队!

答案 5 :(得分:1)

我用一种更简单的方法解决了:

  1. 列表项
  2. 剪切重命名的文件夹文件并将其粘贴到临时位置(即桌面)
  3. 提交“ R ”更改
  4. 再次粘贴文件夹
  5. 设置“ ”状态

真正引起问题的原因是试图同时创建和删除在不区分大小写的系统中可能相同的文件/文件夹。

答案 6 :(得分:0)

我遇到了这个问题,但使用* nix系统不是一个选择。我能够在these instructions之后解决它。


在Windows上,目前(在Mercurial 1.1之前)可能会在repo中引入阻止您检出存储库的案例冲突。

修复此类存储库的一种方法是在区分大小写的Unix系统上检查它,删除有问题的文件,然后再次提交。

如果无法做到,您可以执行以下操作:

hg clone --noupdate repo repair
cd repair
hg debugsetparents <bad revision>
hg debugrebuildstate

此时,Mercurial会认为您检出了错误的修订版并且所有文件都丢失了(状态'!')。要修复回购,我们只需要这样做:

hg remove --after <file causing the collision>

现在,hg状态应该显示状态为“R”的麻烦文件和状态为“!”的所有其他文件。现在我们可以检查我们的修复:

hg commit --message "fix case collision"

要重新获取所有文件,我们只需再次结帐:

hg update tip

参考:https://www.mercurial-scm.org/pipermail/mercurial/2008-June/019921.html

答案 7 :(得分:0)

我知道这是一个古老的问题,但这对我有用,我希望它对某人有用。在我的情况下,我有一个遗留仓库,我需要关闭旧分支。

我曾经使用Windows 10的Windows bash shell解析此lxrun /install,然后在设置时我安装了mercurial sudo apt-get install mercurial这将使您可以通过mnt文件夹访问您的文件系统,并且您可以从命令行使用mercurial。

在我的情况下,我可以轻松更新到有问题的分支并关闭它。

答案 8 :(得分:-1)

正如劳伦斯霍尔斯所说,重命名通过临时文件系统的文件夹/文件对我有用。

$ hg rename a.txt tmp
$ hg rename tmp A.TXT

但要使其工作,并避免在合并期间发生文件错误,我必须在重命名后进行PURGE