我将文件名从小写更改为大写,然后尝试合并。
失败了,所以我补充一下
git config --local core.ignorecase false
Run Code Online (Sandbox Code Playgroud)
然后就变成了gitlab中同名的两个文件(一个大写,一个小写)。
如果我克隆该项目,它将全部小写。
我尝试在gitlab中删除小写的,但是如果我再次拉取,文件将是空的。
不知道如何修复它。
解决此问题的最佳方法是使用小写和大写不同的系统。例如,如果您无法使用 Windows,请启动 WSL 或使用 VirtualBox 或类似工具来创建 Linux 系统,将存储库克隆到其他操作系统中,修复问题,提交并推送新的提交。(然后您可以关闭 WSL 或 VirtualBox 实例。)
\n你滥用了core.ignoreCase
:你对 Git 撒谎,Git 得到了报复。
这里有一个关键概念有点棘手,不幸的是,很多 Git 文档都不清楚,很多 Git 教程和介绍材料都不是很好,甚至非常糟糕,这可能会引导你走上这里的花园小路。。以下是您需要了解的内容:
\n任何给定的 Git 存储库都会存储提交(以及名称,例如分支名称和标记名称,可帮助您和 Git找到提交,但在这里我们将专门关注提交)。
\n提交存储文件\xe2\x80\x94,但它们以一种特殊、奇怪、Git 独有的格式进行。提交不存储目录(文件夹),仅存储文件;每个文件都有一个名称,并且该名称由任意字节序列组成,只有一些限制:具体来说,该名称不能以(正)斜杠开头,并且不能有两个相邻的正斜杠,并且不能包含 NUL 字节(b\'\\0\'
Python 风格编码中的a )。两个不同的字节序列代表不同的文件名,因此path/to/file
和path/TO/FILE
是两个不同的文件;path/TO/file
是第三个不同的文件,依此类推。请注意,这里没有文件夹名称:path/to/file
是一个文件名,它只是在您完成实际工作时碰巧包含像文件夹名称一样的东西,而不是在 Git 中闲逛。
要签出提交(使用git checkout
或git switch
),Git 会将提交中的文件提取到 Git 所谓的工作树中中。这里的文件将是普通计算机上的普通文件,以便普通程序可以用它们做普通的事情。
Git 实际上从 Git 所谓的索引或暂存区域(或者有时称为缓存)构建新的提交。这个东西保存文件,其格式与 Git 用于提交的格式相同,因此索引中的文件具有区分大小写的长名称 ( ) ,无论您的系统是否区分大小写。path/to/file
因此,存储提交(存储文件)的 Git 存储库可以包含具有两个仅大小写不同的文件的提交,例如readme.md
和README.md
。这始终是正确的:您在 Git 中设置的任何设置都无法阻止这一点。
大多数操作系统和/或文件系统对文件的显示方式都有限制。此处并非所有操作系统和文件系统都相同:特别是 Windows,在将长path/to/file.ext
字符串分解为组件path
、to
、 和file.ext
(然后将其表达为path\\to\\file.ext
稍后!)后,禁止将该file
部分命名为aux
。尝试为 C 或 C++ 程序创建一个aux
or文件,或者为 Python 程序创建一个文件,然后看看会发生什么。这在 Linux 和 macOS 上运行良好,但在 Windows 上则不然。1aux.h
aux.py
默认情况下,在大多数文件系统中,Windows 和 macOS 都会保留新创建的文件或文件夹的大小写,因此,如果您创建一个名为 的新文件README.md
,它实际上名为README.md
. 但从那时起,两个系统都会将创建或使用readme.md
(全部小写)的尝试视为使用现有README.md
文件的请求。也就是说,这些操作系统和/或文件系统 会忽略您使用的大小写,而支持某些现有文件或文件夹的大小写。
这意味着,如果您有一个包含 README.md
和 readme.md
的提交,则检查此提交只能提取这两个文件之一。Git首先创建的文件名将是您在工作树中看到的名称。具体来说,GitREADME.md
首先创建。第二个文件将简单地覆盖第一个文件,只留下一个名为 的文件README.md
,其中包含readme.md
文件的内容。
(作为一个配置变量,忽略core.ignoreCase
大小写,以便您可以设置core.ignorecase
或core.IGNORECASE
如果您愿意)的目的是告诉 Git 系统的行为方式。更改它不会改变系统的行为方式!这是一个描述性设置,而不是规定性设置。
临时更改设置来欺骗 Git偶尔(尽管很少)有用。在 Git 完美的理想世界中,您永远不必这样做,但那个世界根本不存在(也永远不会)存在。所以你会发现偶尔的 StackOverflow 答案会让你暂时改变core.ignoreCase
并做一些事情。 完成后请务必将其更改回来,因为 Git相信该设置。如果设置错误,Git 将出现异常行为。说“改变它”的答案是故意对 Git 撒谎,让它以一种方式行为不当,结果证明这一次是有用的,也许会再次有用,只要你有相同版本的 Git 和相同的版本。版本的 Windows或者它仍然碰巧以这种方式工作。
特别是,当您关闭core.ignoreCase
(将其设置为false
)时,Git 认为操作系统可以保存某些文件的大写和小写变体。您通常会这样做来操作 Git 的索引。git add file.ext
现在运行将添加小写版本,运行git add FILE.EXT
将添加大写版本(运行git add FiLe.eXt
将添加混合大小写的第三个版本)。运行git rm --cached
将使您从 Git 索引中删除任何一种特定的案例版本,同时相信该案例很重要。完成此操作后,您应该恢复设置,core.ignoreCase
以便它描述您的系统的实际工作方式。
您可以使用git ls-files --stage
(或者甚至不使用--stage
,--stage
只是使输出更加详细)来查看Git 索引中现在有哪些文件。请注意,此命令会生成每个文件的完整列表,在大型存储库中,该列表可能会很长,因此您可能需要使用 bash 样式的重定向:
$ git ls-files --stage > output.tmp\n
Run Code Online (Sandbox Code Playgroud)\n然后使用文件查看器output.tmp
,然后删除output.tmp
在完成后将其删除。
1虽然 macOS 避免了一些 Windows 问题,但大小写折叠功能仍然有效,除非您创建区分大小写的文件系统。制作一个可安装的很容易.dmg
,如果您使用 Mac,那么最好有一个这样的文件,以便您可以处理在 Linux 上制作的 Git 存储库。
请注意,macOS 对于某些 Unicode 序列有一个相当不同的问题,这在 macOS 中与aux.h
Windows 上的问题一样难以克服。因此,您可能仍然需要可以在 Mac 上运行的 Linux。
归档时间: |
|
查看次数: |
2165 次 |
最近记录: |