【发布时间】:2021-05-15 08:16:12
【问题描述】:
在深入探讨这个问题之前,先来一点背景知识:
几个月前,我的团队将我们的存储库从 Team Foundation Server 迁移到 Azure DevOps。 上周,我们注意到 TFS 上的一个分支已经完成了现在需要的工作。因此,我们决定将该分支带到 Azure,以避免再次进行上述工作。
我在我的机器上从 TFS 克隆了 repo,更改了原始 url 以匹配 Azure 的 URL,然后尝试通过以下步骤推送分支:
- 从 TFS 克隆
- 从我感兴趣的分支创建一个新分支
- 添加远程源(称为 origin-azure)
- 添加一个虚拟文件并提交更改
- 将分支推送到 origin-azure
它给了我以下错误信息:
error: remote unpack failed: error The tree object 1234 was rejected: The folder 'myfolder' and the folder 'MyFolder' pushed differ in case. You must remove or rename one of them or disable case-enforcement (see https://aka.ms/git-platform-compat). To https://urlOfRepoOnAzure ! [remote rejected] ExportBranche -> ExportBranche (The tree object 5678 was rejected: The folder 'myfolder' and the folder 'MyFolder' pushed differ in case. You must remove or rename one of them or disable case-enforcement (see https://aka.ms/git-platform-compat).) error: failed to push some refs to https://urlOfRepoOnAzure
我删除了文件夹“myfolder”并再次尝试。同样的错误。 但我可以毫无问题地推送到 TFS。
我不明白发生了什么。尤其是为什么推到 Azure 被拒绝,因为我正在推一个新的分支。
【问题讨论】:
-
这是微软添加到他们系统中的一项特殊功能。没有正常的 Git 通知或关心。事实上,普通的 Git 不会注意到或关心 对于 Windows 用户来说是个问题(并非总是如此,但通常足以引起关注),这就是他们添加此功能的原因。如果此功能妨碍您完成工作,并且您很乐意让 Windows 用户遇到麻烦,请关闭此功能。
-
嗨@torek,我确保远程仓库和本地仓库上的文件夹名称和大小写相同,但我仍然收到错误消息。此外,如果我创建
find myfolder则不会返回任何结果。所以我应该没有任何问题推送到远程,因为文件夹在两边都有相同的名称。 -
问题不在您的工作树中。它是在您正在上传的某些 commit 中。请记住,Git 不存储文件。 Git 存储 commits(然后存储文件)。每个提交都有每个文件的完整快照。您有一些具有大写名称的提交和一些具有小写名称的提交,这就是 Microsoft 添加的特殊功能检测到的。
-
感谢@torek 的解释!我忘记了真正的承诺是什么!尽管如此,关闭该功能后,我还是无法推送到新的原点(仍然是错误)。我们最终使用了与@WaitingForGuacamole 提出的相同的解决方案。
-
是的,这是解决问题的一种方法。新奇的
git filter-repo可能也有一些功能,或者可以添加一个:它具有能够解决这个问题的正确洞察力,并且作为一个 Python 程序,做到这一点应该不会太难.