如何解决 Git 分支名称中的大小写问题?

paj*_*vic 5 git github

我在 Github 存储库中有一个分支,名称如下:feature/X/mybranch。一位同事对我的分支进行了更改,但将其提交给feature/x/mybranch. Github 似乎区分大小写,在他的提交中创建了一个单独的分支。

现在的问题是我的 Git 客户端只能看到一个分支(我在 macOS 上),即原来的大写分支。这会带来各种各样的问题。最初,我什至看不到他的提交,并且在不知道真正的问题是什么的情况下,我尝试了不同的方法,最终能够在git reset --hard. 然而,一些副作用仍然存在。例如,我的客户不断告诉我,我有尚未推送的提交,尽管我可以在 Github 中看到它们。

理想情况下,我只想将他的分支合并到我的分支中并删除它(或者甚至只是删除,因为我很确定我拥有他的所有更改),但我不知道该怎么做。如前所述,我的客户(在终端和 Sourcetree 中都尝试过)只看到一个分支,而且我真的不知道如果删除它会发生什么。

tor*_*rek 3

有几个相互关联的问题,所有这些问题都源于一个问题:macOS文件系统默认大小写折叠,因此README可以使用 name 打开名为 的文件readme,反之亦然。

\n

Git 有时将分支名称和值集存储在单个文件 ( .git/packed-refs) 中,并且当这样做时,名称区分大小写,因此feature/X/mybranchfeature/x/mybranch是不相关的分支名称。但是 Git有时将名称存储为文件名(其中斜杠成为文件夹名称分隔符),哈希 ID 包含在该文件中,在这里,任何将feature/X其与 分开的尝试都feature/x将失败,因此您最终只有一个文件命名mybranch在一个名为 或 的文件夹xX命名的文件。

\n

到目前为止,修复它的最简单方法是在区分大小写的文件系统上的 Git 中工作。例如,如果您有一台 Linux 计算机\xe2\x80\x94 或虚拟机\xe2\x80\x94,则启动该 Linux 系统,克隆 GitHub 存储库,现在一切正常,并且您拥有两个不同的分支名称,并且可以修复一切都很轻松,更新 GitHub、删除不需要的名称等等。这还涵盖了所有提交内的文件名问题,因为您现在可以拥有两个名称分别为README和的不同文件readme

\n

不过,您不需要使用单独的虚拟机,因为 macOS 允许您创建区分大小写的磁盘映像并安装它。然后您可以在这个已安装的卷中完成您的工作。这解决了大部分问题;其余的是分解的 VS 组合的 Unicode(agr\xc3\xa9able例如两种不同的文件命名方式),Linux 允许,但 macOS 仍然禁止。

\n

要创建区分大小写的磁盘映像,请参阅我之前另一个问题的回答。这涵盖的情况比您眼前的情况要多得多。

\n
\n

不过,考虑到您当前的情况,有一种简单直接的方法可以通过在 GitHub 本身上完成大部分工作来完成此操作,而无需担心 Linux VM 或区分大小写的文件系统。这有点棘手,因为您需要确保本地有正确的提交,但 a可以获取它们。然后,您需要使用在 \xe2\x80\x94 中写入\xe2\x80\x94的文件来提取特定的哈希 ID。git fetch originFETCH_HEADgit fetch.git/FETCH_HEAD

\n

的内容.git/FETCH_HEAD大多是不言自明的。它包含在另一个 Git 上看到的分支名称,以及哈希 ID(加上一些其他内容):每行一个条目,在多行上,对应于另一个 Git 中的分支名称。

\n

从您自己的 Git,您可以:

\n
git push origin <hash-id>:<good-name>\ngit push --delete origin <bad-name>\n
Run Code Online (Sandbox Code Playgroud)\n

到 GitHub 上的 Git。第一个命令\xe2\x80\x94--force在某些情况下可能需要(如果需要,请小心,并考虑使用)\xe2\x80\x94将使用所需的大小写创建或更新所需的分支名称,使用 GitHub 的事实本身具有大小写敏感性。因此,您现在可以使用“正确”的分支名称,并将其设置为正确的哈希 ID。第二个命令将删除带有不需要的大小写的名称。--force-with-lease=refname:hash:

\n

git branch -r -d如果远程跟踪名称大小写错误,您可能还想使用删除它:

\n
git branch -r -d <bad-name>\n
Run Code Online (Sandbox Code Playgroud)\n

您自己的 Git 现在可以处理 GitHub 上的 Git 存储库,因为它只需处理好名称,所以现在:

\n
git fetch origin\n
Run Code Online (Sandbox Code Playgroud)\n

表现良好,并做您需要的事情。

\n

(以上均未经过测试;可能存在拼写错误。)

\n