【问题标题】:Switching GIT Branches randomly changes filename case切换 GIT 分支随机更改文件名大小写
【发布时间】:2021-04-23 21:06:22
【问题描述】:

我对 GIT 有一个奇怪的问题。

我有一个 git repo 用于我正在进行的一个小项目。没有遥控器,这只是为了我自己的工作。直到几天前,我的开发甚至还没有任何分支。

我终于需要为一些实验代码创建一个分支。完成后,我只需签出 master 分支以返回我所在的位置。这就是问题开始的地方。

有六个文件在新分支和主分支之间发生变化。每次我切换/签出任一分支(在两者之间切换)时,这六个文件名中的大多数都会更改大小写。

例如,如果文件应该是 someCode.py

  • 有时文件名会切换为 somecode.py(不正确)
  • 有时文件名会切换为 someCode.py(正确)

无论我选择哪个分支,每次的结果都不一样。每次都有哪些不同的 CaSe 文件。

一开始我怀疑我使用的 VSCode 的 GIT 插件(GIT Graph),但它也发生在包含的 GIT GUI 中,甚至如果我从命令行使用“git switch”也会发生。

我了解了 core.ignorecase 设置;它被设置为真。我尝试将其设置为 False,但问题仍然存在。

有人知道发生了什么吗? 谢谢

详情:

  • GIT 2.30.0.windows.2
  • Windows 10
  • 文件位于映射的网络驱动器上
  • 文件系统为 NTFS

【问题讨论】:

  • 难以置信的是,今天我刚刚合并到某人成立一年多的分支中,我遇到了同样的问题。它的表现略有不同,我注意到的第一件事是一个带有我无法撤消或重置的未决更改的文件——它不断返回为具有不同内容的更改。我使用我写的评论(2 天前!)来诊断问题,并准确指出了原因。我只是将它纳入我的答案,因为我现在已经确认它发生在现实生活中......

标签: windows git visual-studio-code git-gui


【解决方案1】:

Git 本身就区分大小写,因此您可以拥有两个不同的文件,分别命名为 filename.txtFileName.txt。在某些操作系统(例如 Linux)上可以正常工作,而在其他操作系统(Windows)上则不行。请注意,分支名称也是如此;你不能有两个不同的分支,仅在 Windows 上因大小写而异。原因是分支名称作为文件存储在您的驱动器上。

您的问题很可能是有问题的文件在两个分支上具有不同的名称,但仅因大小写而异。如果是这样,选择你想要的(可能是master),然后在另一个分支上重命名这些文件以完全匹配大小写。如果它们实际上应该是不同的文件,那么不仅仅是通过大小写来更改它们的名称。

另一种可能性是,两个(或多个)名称因大小写而异的文件只存在于同一个分支中,切换分支只会导致问题暴露。请注意,它可能是文件本身,也可能是这些文件路径中的任何目录也可能有不同的大小写。要确定这是否是问题所在,请在 Git Bash 中导航到存储库的根目录并运行以下命令:

git ls-tree -r HEAD | grep -i [filename-without-path]

如果您看到两个或多个名称相同但大小写不同的文件,则表明您已发现问题。

【讨论】:

  • 感谢您的建议。但是,要使用您的示例,这些文件从未被称为“filename.txt”。事实上,该分支只涉及一些(次要)代码更改。没有添加、删除或重命名文件。
  • 你可以在master 分支上查看你的repo,看看它认为文件名应该是什么。然后您可以查看驱动器上的文件(可能使用不同的工具甚至不同的机器)以查看文件名实际是什么。我怀疑它们是不同的。
  • 而且,由于它是共享驱动器 - 有人/其他人可以重命名它们吗?
  • 不确定您所说的“查看主分支上的 repo 以了解它认为文件名应该是什么”是什么意思。我对命令行上的 GIT 不是很熟悉。但是,我可以在 GIT GUI 中使用 Browse master's Files 选项。它显示了我期望的文件名,并带有正确的文件大小写。使用 Windows 资源管理器,或 VSCode 中的文件浏览器,或命令提示符,将文件名显示为他们这次决定的任何名称。并且共享驱动器来自私人服务器,因此没有其他人会更改文件。
  • @Maculin 有趣的是,差异没有显示分支之间的问题。也许问题一直存在,但切换分支只会导致问题暴露。也许回购实际上有两个(或更多!)这些文件的副本(即使在一个分支上)。请注意,它可能是文件本身,也可能是这些文件路径中的任何目录也可能有不同的大小写。在 Git Bash 中导航到您的存储库的根目录并尝试以下操作:git ls-tree -r HEAD | grep -i [filename-without-path]。我认为您的每个文件都会以不同的大小写显示两次。
【解决方案2】:

看来我已经解决了这个问题 - 至少在一定程度上。

我创建了一个新分支,手动修复了 Windows 资源管理器中的文件名。现在,在 master 和 newBranch 之间切换可以按预期进行。

但是,如果我从问题切换到 firstBranch,问题就会重新出现。该分支似乎存在问题,并且切换进出该分支会导致问题。

我仍然不知道为什么。

编辑:好的,也许不是。 Repo 似乎在其他分支上又遇到了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 2012-05-18
    • 2021-09-30
    • 2016-12-18
    • 2016-11-24
    • 2016-05-15
    相关资源
    最近更新 更多