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 origin
或 git 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 -p
或 git 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
.
推送到本地裸存储库
我相信一位队友有一个名为 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 origin
或 git 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 -p
或 git 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
.