在Windows上使用Git:重命名文件后无法切换分支(仅更改大小写)。

14

我正在Windows系统上使用git,并且在我的仓库中有一个文件,例如 "foo.txt"。今天我想将此文件重命名为 "Foo.txt"(大写字母)。按照这个SO问题的建议,我使用了 git mv -f foo.txt Foo.txt,并得到了期望的结果。然后我继续提交更改到我的仓库中。
编辑:我希望这是一个永久性的更改,并且仍然能够检出先于这个更改的提交。

然而,在尝试切换分支时,我遇到了一个错误:

# I'm on branch1  
git checkout branch2  
Aborting  
error: The following untracked working tree files would be overwritten by checkout:  
Foo.txt  
Please move or remove them before you can switch branches.  

经过一番探索,我发现我的.git/config文件具有以下设置:

[core]  
    ignorecase=false  

将此设置为true似乎可以解决问题,并且允许我像平常一样在分支之间切换。

因此,关于此事,我想知道:

  1. 这个设置有什么不良影响吗?在Windows上它应该总是为真吗?如果我与其他开发人员一起工作,他们没有设置相同的值会怎样?
  2. 是否有另一种方法来重命名文件而无需更改此设置?
  3. 为什么首先会发生这种情况?当我提交更改时,git正确地识别了文件实际上已被重命名(没有删除一个文件然后添加另一个)。那么当我尝试切换分支时到底发生了什么?

谢谢!

2个回答

4
如 "无法解决的Git错误:以下未跟踪的工作树文件将被覆盖 "中提到的,设置core.ignorecasetrue是允许检出继续进行的有效方法。

但是,我更喜欢像 "GIT:以下未跟踪的工作树文件将被覆盖" 中那样:

  • git add 我刚修改的内容(在您的情况下,git mv可能已经将重命名的文件添加到索引中)
  • git stash,保存索引
  • git checkout -b anotherBranch:由于索引干净,这应该可以正常工作
  • git stash pop,如果要在新索引上恢复大小写更改。

好的,但我想提交重命名。问题是,如果我这样做,之后就无法切换分支了。 - avivr
@avivr,即使将core.ignore设置为false,提交后也无法切换吗? - VonC
不好意思,就像我之前说的,只有在设置为 true 时才能切换分支。而且,当我根据你的建议隐藏了重命名后,尝试弹出隐藏修补时还是出现了相同的错误。因此,这个隐藏修补是“无法弹出”的,我只能放弃它了。 - avivr
@avivr 抱歉,我的意思是设置为 true。 - VonC

3

一种简单(但不太优雅)的方法来解决这个问题,而不必更改配置设置,就是删除文件并再次检出。在我的情况下,这使得我的更改可以正常分支。

编辑:正如Avivr所指出的,我提出的解决方法并不能永久地解决问题。我仍然不会删除这个答案,因为它可能在某些情况下作为临时热修复有所帮助。


1
这意味着每次我想要切换分支,从现在开始直到永远,我都必须删除该文件。对吧?这似乎有点不方便... - avivr
你真的试过了吗?在我的情况下它是有效的,但我不会声称我可以完全重现你的情况。 - bigge
是的,至少我假设我理解你的意思了。我用 git 重命名了文件,然后提交了更改。然后我删除了文件(只是用 rm),并使用 git checkout . 来恢复它。之后,在更改分支时仍会出现相同的错误。 - avivr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接