git分支和ls远程中的不同文件夹套管

git分支和ls远程中的不同文件夹套管,git,Git,我的git存储库有问题。分支文件夹名称的大小写不同git branch-rgit-ls-remotegit-ls-remotegit-branch-r给了我/blablabla这对所有远程用户都是正确的/ 为什么会发生这种情况,如何使这两个命令都返回小写版本 命令: git branch -r | grep US/blabla origin/US/99867_blabla git ls-remote origin US/99867_blabla git ls-remote origin u

我的git存储库有问题。分支文件夹名称的大小写不同
git branch-r
git-ls-remotegit-ls-remotegit-branch-r给了我/blablabla这对所有远程用户都是正确的/

为什么会发生这种情况,如何使这两个命令都返回小写版本

命令:

git branch -r | grep US/blabla
origin/US/99867_blabla
git ls-remote origin US/99867_blabla
git ls-remote origin us/99867_blabla
git branch
返回:

git branch -r | grep US/blabla
origin/US/99867_blabla
git ls-remote origin US/99867_blabla
git ls-remote origin us/99867_blabla
git branch
命令:

git branch -r | grep US/blabla
origin/US/99867_blabla
git ls-remote origin US/99867_blabla
git ls-remote origin us/99867_blabla
git branch
返回
无任何内容

命令:

git branch -r | grep US/blabla
origin/US/99867_blabla
git ls-remote origin US/99867_blabla
git ls-remote origin us/99867_blabla
git branch
返回

`12312362b8f4e6dc0e1c34880f96d525d2d19d30        refs/heads/us/blabla`
* master
命令:

git branch -r | grep US/blabla
origin/US/99867_blabla
git ls-remote origin US/99867_blabla
git ls-remote origin us/99867_blabla
git branch
返回

`12312362b8f4e6dc0e1c34880f96d525d2d19d30        refs/heads/us/blabla`
* master

origin/US/99867_blablabla
是存在于本地存储库中的远程跟踪分支,
refs/heads/US/blabla
返回的
git ls remote
是存在于远程存储库中的分支

从这3个命令的输出中,我们可以猜测
US/99867_blabla
不再存在于远程存储库中。它可能已被重命名或删除。如果是这样,则本地
origin/US/99867_blabla
可以忽略不计,也没有用处

尝试
git fetch--prune
,它将创建
origin/us/blabla
并删除
origin/us/99867_blablabla

git本身认为所有大写字母总是不同于所有小写字母。因此,名为
NAME
的文件或分支始终与名为
NAME
的文件或分支不同。名为
INCLUDE/IP.H
的文件与名为
INCLUDE/IP.H
的文件不同。请注意,这两个名称中有一个斜杠。这里没有名为
INCLUDE
INCLUDE
的文件夹,只有名为
INCLUDE/IP.H
INCLUDE/IP.H
的文件。分支名称也是如此:
FEATURE/NAME
FEATURE/NAME
没有任何文件夹;它们只是两个不同的分支名称

但是,在不同的时候,您的计算机会强制Git将这些文件或分支名称放入计算机的文件和/或文件夹名称中。1如果您的计算机提供的文件系统要求斜杠表示文件夹,Git此时会为您创建一个文件夹,以便保存完整名称。如果您的计算机提供的文件系统将大小写混用,因此
NAME
NAME
被视为“同一个文件”,而
INCLUDE
INCLUDE
是“同一个文件夹”,那么Git试图在此处创建和使用的各种文件和文件夹将混合在一起

Git对这些有问题的案例所做的是让你这个用户感到痛苦。编写和支持Git代码的人已经做出了各种尝试,试图让体验变得不那么可怕,但没有一个真正解决了问题,因为没有一个令人满意的解决方案如果可以的话,你最好完全避免这种情况。如果不能,你必须忍受这种奇怪的生活,直到你设法重命名所有东西以摆脱这种糟糕的情况

确保您在使用大写或小写时保持一致。处理所有这些问题的一个相对简单的方法是获得一个Linux系统(或者一个带有私有文件系统的Linux VM),或者在您的计算机上创建一个区分大小写的文件系统,这样当Git创建一个名为
NAME
的文件夹或文件以及另一个名为
NAME
的不同文件夹或文件时,它最后有两个不同的文件夹/文件。在这个系统上使用Git可以很好地工作,并且可以让您摆脱使用“错误”案例的文件和/或分支

记住,在Git中,历史就是提交。提交包含文件(从不包含任何文件夹,仅包含文件,即使其名称中有斜杠),并且这些文件具有名称,并且此处的大写字母与小写字母始终不同。旧提交无法更改,因此,如果您的文件仅在这些旧提交中的大小写不同,则它们在旧提交中仍将如此。只需在问题不再存在的情况下进行新的提交,并避免在有问题的计算机/文件系统上使用旧的提交。如果有必要,您甚至可以“重写历史”,将旧的有问题的提交复制到新的和改进的提交,以避免问题,然后使您的分支和标记以及其他名称只记住新的提交。请记住,任何具有旧提交的Git存储库都会将它们重新引入到您的固定Git存储库中,因此,如果您确实重写了历史记录,那么每个具有坏历史记录克隆的人都必须以某种方式摆脱坏历史记录,通常是完全放弃旧克隆

幸运的是,在您的例子中,问题只是分支名称。不幸的是,分支名称也会通过克隆进行复制。幸运的是,它们只是复制到远程跟踪名称。所以,一旦您确定了痛苦的原始来源,您就可以在每个克隆上删除所有远程跟踪名称,然后重新获取它们,可能使用:

git remote remove origin
其次是:

git remote add origin <url>
git fetch origin
git远程添加源
git获取源
使用适当的URL(您可以在执行
git remote remove
操作之前保存它)


1由于Git最终将把有关名为
feature/name
的分支的信息放入名为
feature
的文件夹中,该文件夹包含名为
name
的文件,如果您有名为
feature/name
的分支,Git将不允许您创建名为
feature
的分支。这适应了这样一个事实,即即使在具有区分大小写文件名的Linux系统上,Git也不能同时创建名为
feature
的文件和名为
feature/name
的文件。如果Git总是以编码的名称存储所有分支信息,而不仅仅是使用分支的名称作为路径名,那么这个特殊的问题就会像案例折叠问题一样消失。在我看来,这是解决所有问题的正确方法