Git 在 MacOS 上区分大小写:无法锁定引用

Git on MacOS case sensitivity: cannot lock ref

我相信一位队友有一个名为 Fix/my-fix 的功能分支,然后将其重命名为 fix/my-fix,更改大小写,并将其推送到我们的中央仓库。

现在,每次我做 git pull,我都会看到

error: cannot lock ref 'refs/remotes/origin/fix/my-fix': is at addd9e22effc39t86eca875a1db74f4cc2d09747 but expected cec2dce30eb3a5tf370c3d3b39540f9d2e347020
 ! cec2dce30..addd9e22e  fix/my-fix                 -> origin/fix/my-fix  (unable to update local ref)

如果我执行 git remote prune origingit fetch --all --prune,那么问题就解决了,这样我就可以 一次成功拉取 但是我第二次拉取我再次收到错误。所以基本上我必须在每次拉动之前 prune

有什么方法可以在本地解决这个问题,而不用从我们的中央 git 存储库中删除他的功能分支?我根本不关心他的分支,所以一个可接受的解决方法是告诉 git 以某种方式永久忽略它;我只需要能够始终如一地 pull 而不必 prune.

我也试过了

git update-ref -d refs/remotes/origin/fix/my-fix

git gc --prune=now

而那些同样只是暂时解决了问题。

我在 this article.

中阅读了有关区分大小写文件系统的背景知识

根据您的描述,分支 的大写拼写版本不应 返回(以便 one-time git fetch -pgit remote prune 应该是一个永久的解决方案)。但是,如果它只工作一次,您可以将它作为 default 操作在您的 Mac:

上为这个存储库启用
git config fetch.prune true

所有 的存储库1 在您的 Mac:

git config --global fetch.prune true

这相当于让所有git fetch条命令成为git fetch -p条命令。

(没有特别好的理由 到 运行,fetch.prune 设置为 true。我自己这样做:我有我的全局配置这样设置。)


1从技术上讲,这将是所有存储库 除了 任何在本地用 fetch.prune=false 覆盖的存储库。一般来说——有一些特定和重要的例外——你用 git config --global 设置的东西会被你用 git config 设置的任何东西覆盖,因为 Git 所做的是:

  • 先读取系统配置文件,获取设置。
  • 阅读您的全局配置文件以进行设置。您在此处设置的任何已设置的内容现在都将被您的全局设置覆盖。
  • 阅读存储库的配置文件以进行设置。您在此处设置的任何已设置的内容现在都将被存储库的设置覆盖。
  • 从命令行应用任何 -c key=value 参数。您在此处设置的任何已设置的内容现在都被 command-line 设置覆盖。

如果您从事咨询工作,这将特别有用:您可以将您的姓名和电子邮件地址设置为您的个人设置,然后,对于您从事咨询工作的每个存储库,设置您的姓名和电子邮件地址地址到该存储库的工作所需的任何内容。

懒惰 >> 这里是正确的。假设服务器现在只有一种情况变体:

  • 推送您当地的分支机构。
  • 吹走你的回购协议(我建议只重命名目录以便你可以恢复)
  • 重新开始 git clone

如果您不想将所有内容都推送到服务器,您可以使用 git init --bare.

推送到本地裸存储库