Git中的文件路径错误 - 路径包含反斜杠(\)而不是正斜杠

4
所以,我们在使用Git时遇到了一个奇怪的问题,其中一个文件路径出现了问题。以下是屏幕截图以说明问题: Screenshot 问题在于截图中第二个文件的路径为“Frontend\UserType.php”(反斜杠作为分隔符),而应该是“Frontend/UserType.php”(像顶部那样)。不知何故,我们同时看到了这两个文件。当我运行git ls-files时,会得到“Frontend\UserType.php”作为文件。
我的同事正在使用Windows 7和TortoiseGit,而我在Debian上只是使用命令行中的git。我不确定问题最初是从哪里开始的,但它变得非常令人沮丧。我们尝试删除文件并推送,但它总是会以某种方式重新出现。
现在它已经影响了许多分支。有没有人知道到底发生了什么?我们如何跨多个分支修复它?

这个故障是什么意思?一个全空路径组件?如果你在Debian盒子上运行ls-tree -r HEAD命令,它会显示带有“有趣”字符(如\123)的路径名吗?你可以在同事的Windows机器上使用纯Git for Windows在控制台窗口中尝试这个命令。我猜测a)已经提交了一些带有非ASCII字符的目录路径名,并且某些东西进一步破坏了它(例如,TortoiseGit过时且不支持Unicode)。无论如何,我们需要进一步的信息。 - kostix
看起来名称/路径中的正斜杠已被替换为反斜杠。这是你所指的吗?你的截图是否列出了存储库中的两个单独文件? - Gavin Smith
抱歉,我可能没有表达清楚。问题在于屏幕截图中的第二个文件名为“Frontend\UserType.php”,而应该是“Frontend/UserType.php”(与顶部相同)。我们不知道为什么会看到这两个文件。当我运行git ls-files时,我得到了一个名为“Frontend\UserType.php”的文件。图片中被涂黑的部分是用Photoshop隐藏项目细节,但路径的那一部分在两个地方都是相同且正确的。 - scootstah
你能详细解释一下你尝试如何删除这个文件吗?例如,你是否已经运行了 "git rm" 和 "git commit" 命令从分支中删除这个文件? - Gavin Smith
我建议你尝试彻底删除 Frontend\\UserType.php 文件,可能可以使用你的 Debian 系统来完成此任务。但首先请确保该文件的副本不包含比正确文件更新/更相关的内容。 - kostix
2个回答

3
没有完整的日志记录,很难准确说明发生了什么。根据评论讨论,看起来您提交了一个名为“Frontend\UserType.php”的文件。
Git使用正斜杠("/")作为路径分隔符,在文件名中包含反斜杠对于Git来说没有问题。但如果您在Windows系统上尝试检出,则可能会造成混乱。
最好的选择可能是在Linux/Unix下克隆存储库,或者可能使用Cygwin,然后删除/重命名错误命名的文件。理想情况下,您可能还希望从历史记录中删除它们(否则,如果检出旧版本,可能会导致问题),但这可能并非必要。

3

对于感兴趣的人,我们通过删除所有分支上的文件,然后使用以下命令将所有内容推送回远程来解决了问题:

git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch path/to/file' \
  --prune-empty --tag-name-filter cat -- --all

git push origin --all --force

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