【问题标题】:Make Git internals (.git directory) be case insensitive compatible使 Git 内部(.git 目录)不区分大小写兼容
【发布时间】:2021-08-01 12:55:45
【问题描述】:

我想在 Linux/Mac/Windows 之间同步相同的存储库,所以我需要 Git 内部(基本上是 .git 内部的内容)不区分大小写(所以我不希望只有大小写不同的重复文件)。

我的主要工作机器在 Linux 上,我想从那里将​​这些 Git 存储库同步到 Mac/Windows。

我注意到 Linux 上的 .git/logs/refs/remotes/origin/ 目录有时包含与原始名称相同的分支名称(如 TICKET-123-fix-this-thing)但也小写(ticket-123 -修复这个东西)。

有没有办法避免这种行为(可能还有我还没有注意到的其他行为),以便我可以在 Mac 和 Windows 上使用同一个存储库?所以基本上,我需要做些什么才能使 .git 目录在 Linux/Mac/Windows 之间完全兼容(就大小写而言)。

谢谢!

【问题讨论】:

  • git config --global core.ignorecase 为真?可能有帮助吗?
  • @D3PSI 这真的有帮助吗?从我读到的内容是指Git将如何处理存储库中的文件(例如,如果存在多个仅大小写不同的文件,则将它们视为同一个文件),因此似乎不是指Git内部(.git目录)。
  • 您也可以手动将.git/refs/heads/ 目录(存储分支)中的所有文件重命名(或编写一些脚本为您完成)为小写
  • @D3PSI 问题是我真的不知道 Git 对这些文件做了什么以及它们是如何变成这样的,所以我不想弄乱它们。只是认为有一种更简单的方法可以启用您提到的兼容模式,但它的内部结构位于 .git 目录中。

标签: git


【解决方案1】:

你不能这样做。 core.ignorecase 设置通知 Git 你的系统如何工作。它不会改变您系统的工作方式。简单地覆盖设置 mis-informs Git,随后会出现异常行为(以可预测的方式,偶尔有用,但在这里对您没有帮助)。

在 macOS 系统上,您可以做的就是让自己成为一个区分大小写的文件系统。在这里,您的 Git 的行为方式与在标准 Linux 文件系统上的行为方式相同。见my answer here

在 Linux 系统上,您可以将自己设置为区分大小写的文件系统;this ServerFault question

【讨论】:

  • 我认为同一个 repo 应该是可移植的——这些文件只是数千个文件中的几个,而且它们是空的。也许您或其他人可以了解 Git 对这些文件做了什么,以及它们是如何以两个版本(小写和原始)存在的。
  • Git 分支名称区分大小写。 macOS 和 Windows 上的 Git 实现存在缺陷,因为它有时无法区分这些不同的分支(由于默认文件系统行为)。结果是这些操作系统上的不良行为。这个问题正在慢慢修复;某些未来版本的 Git 将区分分支 FOO 和分支 Foo,即使在默认的 Windows 或 macOS 设置上,您也可以同时拥有这两个分支。
  • 当有人在 Windows 或 macOS 上尝试使用分支 FOO 或分支 foo,但拼写为 Foo 时,这些东西就会出现。这对他们工作(有点),如果你在Linux上,他们会为你搞砸。或者,当 Linux 上的某个人故意创建仅以大小写不同的分支时,它们就会出现。这对他们有效,如果你在Linux上,他们会为你搞砸。
  • 有时,Git 将分支名称存储在名为 .git/packed-refs 的“平面文件”伪数据库中。这样做时,分支名称始终区分大小写: 在 Linux 和其他系统上工作方式相同,分支 FOO 和 Foo 和 foo 是三个不同的分支。
  • 但只要我小心避免使用冲突的文件名和冲突的分支名等(我会这样做),Git 是否也会确保存储库在 Linux 和 Mac 之间可移植?
猜你喜欢
  • 1970-01-01
  • 2012-02-12
  • 2023-03-25
  • 2016-11-24
  • 1970-01-01
  • 2016-08-16
  • 2013-02-02
  • 2016-04-19
  • 2016-05-15
相关资源
最近更新 更多