Mac OS上的Git区分大小写:无法锁定引用

时间:2019-06-29 17:11:00

标签: git macos case-sensitive

我相信一个队友拥有一个名为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中区分大小写的文件系统的背景。

2 个答案:

答案 0 :(得分:1)

根据您的描述,分支的大写拼写版本不应该返回(因此一次性git fetch -pgit remote prune应该是永久解决方案)。但是,如果它可以运行一次,则可以将其作为Mac上该存储库的 default 操作启用。

git config fetch.prune true

或Mac上存储库 1 全部

git config --global fetch.prune true

这等效于使所有git fetch命令成为git fetch -p命令。

(没有特别好的理由 not fetch.prune设置为true来运行。我自己这样做:我以这种方式设置了全局配置。)


1 从技术上讲,这将是所有存储库以外的任何fetch.prune=false在本地覆盖的存储库。通常,有一些特定且重要的例外情况,您用git config --global设置的内容会被您用git config设置的内容覆盖,因为Git的作用是:

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

例如,在进行咨询工作时,这特别有用:您可以将姓名和电子邮件地址设置为个人设置,然后针对要进行咨询工作的每个存储库,将姓名和电子邮件地址设置为该存储库需要执行的任何工作。

答案 1 :(得分:1)

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

  • 推当地分支机构。
  • 删除存储库(建议您重命名目录以便恢复)
  • 以新的git clone
  • 重新开始

如果您不想将所有内容推送到服务器,则可以使用git init --bare推送到本地裸存储库。