我们正在使用位于办公室的Linux服务器上的远程Git存储库。 所有的客户端都是安装有Git Extensions的Windows PC作为客户端(使用msysgit运行)。
在客户端系统上,如果我尝试执行以下操作:
git branch Branch1 git branch branch1
第二个命令会失败,告诉我具有该名称的分支已经存在。 这是我所期望的,因为我在git config
中将core.ignorecase
设置为true。
但是,如果我直接login到Linux系统并运行相同的命令,即使core.ignorecase
标志设置为true,也会创build两个分支。
我会期望第二个命令也失败,因为我configuration存储库忽略的情况下,但标志在Linux系统上什么都不做,或者我错过了什么。
任何人都可以帮助我理解这个问题,因为我们计划将SCM从Source Safe迁移到Git,这个问题让我们感到害怕。 如果两个开发人员创build具有相同名称但不同情况的分支,并将结果推送到Linux存储库,会发生什么情况?
我想添加@ meagar的答案更多的细节:
FAT32 / NTFS是保留大小写的文件系统。 也就是说,如果你命名一个文件“Foo.txt”,它将被存储为“”Foo.txt“。如果你保存一个文件为”foo.txt“,它将被保存为”foo.txt“。因为它是不区分大小写的,所以“Foo.txt”和“foo.txt”实际上是相同的,并且你不能将两个文件放在同一个目录中。
在你的Windows版本库中,如果你把名字从“Foo.txt”改成“foo.txt”,如果你不把git显示为一个改变,你可以设置core.ignorecase
配置为true,git不会看到这是一个变化。 如果你把它设置为false,它会。 (但由于文件系统和git的性质,它看起来像是一个新的文件foo.txt被添加,添加到Windows的混淆)。
这是core.ignorecase
的目的
来到分支。 分支只是提交的指针。 这些指针只是文件。 这些文件存储在.git/refs/heads
。 当你创建一个分支时,比如bar
,创建一个名为.git/refs/head/bar
的文件。 现在,在Linux中,当您创建一个名为Bar
的分支时,它可以继续并创建一个文件.git/refs/head/Bar
,从而允许创建分支。 但在Windows上,您不能创建.git/refs/head/Bar
,因此当条形图存在时,您将无法创建条形分支。 意识到core.ignorecase
是处理仓库中的文件 – 你的代码库 – 并且不影响git的元数据文件。
所以你将不得不忍受和适应这样一个事实,在Linux中,你可以创建具有相同名称的分支,但是在Windows中,你不能。
如何使“git分支”尊重Linux上的“core.ignorecase”标志?
你不能,因为国旗不符合你的想法。
core.ignorecase
如果为true,这个选项启用了各种解决方法,使git可以更好地处理不区分大小写的文件系统,如FAT。
core.ignorecase
与您所描述的行为无关,与分支名称的区分大小写无关。 Git无法区分Windows上Branch1
和branch1
的区别与是否设置了core.ignorecase
,它的行为方式是一样的。
…但是这个标志在Linux系统上什么都不做,或者我错过了一些东西。
你没有错过任何东西。 该标志在Linux系统上什么都不做。 core.ignorecase
并不是让操作系统不区分大小写,而是让Git能够在不区分大小写的操作系统上工作。 Linux从根本上是区分大小写的,Git也是如此。 你应该试着去处理这个问题,并且要求你的开发者使用小写字母来表示他们的分支名字。 你不应该试图让Git模仿其他操作系统的破坏行为。
如果两个开发人员使用相同的名称创建分支,但情况不同,并将结果推送到Linux存储库,会发生什么情况?
那么你会有两个完全不同的分支,一个是小写字母,另一个是错误命名的 ,有人会被迫合并并丢弃错误的分支。 这是你常常会做的事情,作为使用Git的一个副作用。