【问题标题】:git merge fails with "Untracked working tree file" on case changegit merge 在案例更改时因“未跟踪的工作树文件”而失败
【发布时间】:2011-10-08 02:20:27
【问题描述】:

在 Mac OS X 上,我有两个分支 - 比如说 A 和 B - 我想将 A 合并到 B。当我尝试在 B 上执行 git merge A 时,我得到:

error: Untracked working tree file 'path/file.php' would be overwritten by merge.  Aborting

这是由于 A 中的某些更改重命名了文件 - 即 B 具有文件 path/File.php 而 A 将其重命名为 path/file.php。由于 Mac OS X 文件系统不区分大小写,这可能会使 git 感到困惑。有没有办法让 git 正确地进行合并?

更新:为澄清起见,分支 B 没有任何未提交的更改,并且在两个分支中都会跟踪相关文件(当然,使用不同的名称)。

【问题讨论】:

  • 注意:使用 git2.0.1+,这个合并现在应该可以工作了。见my answer below

标签: git macos case-insensitive branching-and-merging


【解决方案1】:

如果你在B 上做一个git mv path/File.php path/file.php 怎么样?这应该让 git 知道它是同一个文件,但名称不同。

【讨论】:

  • 不起作用,给出:fatal: destination exists, source=path/File.php, destination=path/file.php
  • 你能git stash你未跟踪的更改,而不是git stash pop在合并后关闭它们吗?
  • 我没有任何未跟踪的更改,这就是问题所在。
【解决方案2】:

也许这个对另一个问题的回答会有所帮助;您可能只想暂时启用该选项……

git mv and only change case of directory

【讨论】:

  • 实际上,对我有用的是将 ignorecase 设置为 true,但无论如何,问题解决了,谢谢。
【解决方案3】:

从 git 2.0.1(2014 年 6 月 25 日)开始,该合并将不再失败。

commit ae352c7f37ef2098e03ee86bc7fd75b210b17683David Turner (dturner-tw)

merge-recursive.c: 修复大小写合并错误

在不区分大小写的文件系统上,合并时,如果传入的提交将文件重命名为仅更改其大小写,则该文件将被错误地从工作树中删除。
合并重命名时,旧名称的文件将被删除 - 但由于文件系统认为旧名称与新名称相同,因此实际上将删除新文件。

我们通过在第 0 阶段不删除索引中具有案例克隆的文件来避免这种情况。

【讨论】:

    【解决方案4】:

    好的,经过一整天的挖掘,这是我找到的解决方案:

    ==========情况===========

    我正在我的分支“Hotdog”上开发

    我的同事将他的工作推送到我们的 master 分支,包括一个名为“Hamburgersrule”的文件

    我将 master 合并到我的 Hotdog 分支中。

    我的同事将“Hamburgersrule”更改为“HamburgersRule”,并将其推送到 master。

    ========== 问题==========

    当我尝试在 Hotdog 和 Master 之间切换时,Git 认为发生了一些变化。 HamburgersRule 的情况看起来与 Git 不同,但 windows 认为它​​很好。每次我尝试合并或签出另一个分支时,Git 都会警告我,我将丢失未暂存的文件。

    我可以通过将 git config core.ignorecase 设置为 true 来隐藏消息,但根本问题仍然存在,忽略大小写差异是我们首先陷入困境的原因。

    ========== 解决方案==========

    1:在 Master 上进行三次重命名(以确保新文件名正确) HamburgersRule -> HamburgersRule_Rename -> HamburgersRule

    2:将该更改合并到 Hotdog 分支。要使合并生效,您需要删除您的“Hamburgersrule”版本(使用您的操作系统,而不是 git)

    3:清理 Hotdog 上剩余的文件。检查合并是否按预期工作。您可能需要从 Master 分支签出 HamburgersRule:

    git checkout master HamburgersRule

    编辑: 重要的提示。如果您不想一遍又一遍地解决此问题,请确保您的同事都将 ignorecase 设置为 false

    git config core.ignorecase false

    如果有人忽略区分大小写,他们的 git 客户端将忽略更改,并继续检查坏名。

    【讨论】:

      猜你喜欢
      • 2011-05-26
      • 2018-06-16
      • 1970-01-01
      • 2012-12-16
      • 2011-03-11
      • 2014-02-12
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多