Git 和讨厌的“错误:无法锁定现有信息/引用致命”
Posted
技术标签:
【中文标题】Git 和讨厌的“错误:无法锁定现有信息/引用致命”【英文标题】:Git and nasty "error: cannot lock existing info/refs fatal" 【发布时间】:2011-10-03 03:39:25 【问题描述】:从远程 git 存储库克隆后(在 bettercodes 上) 我做了一些改变,承诺 并试图推动:
git push origin master
错误:
错误:无法锁定现有信息/参考 致命:git-http-push 失败
此案例涉及已经存在的存储库。
我之前做的是:
git config –global http.sslVerify false
git init
git remote add [url]
git clone
更改数据
git commit
在 'bettercodes' 我无法访问 git log。
我正在使用 Windows。 详细的错误是:
C:\MyWorkStuff\Projects\Ruby\MyProject\>git push origin master
Unable to create branch path https://user:password@git.bettercodes.org/myproject/info/
error: cannot lock existing info/refs
fatal: git-http-push failed
我之前克隆过,后来改了代码,提交了。
【问题讨论】:
两个可能的原因:a) 另一个 git 实例正在运行(杀死所有 git 进程或重新启动)b) .git 文件夹以管理员身份创建(尝试使用管理员命令行进行操作) 对我来说,我通过在git pull
之前调用git fetch
解决了这个错误。
在我的情况下,问题是目录名称的情况。分支名称是“origin/no-ticket”,但在我的本地目录中,名称是 NO-TICKET,所以我只是重命名它并且它工作。
【参考方案1】:
这听起来像是权限问题 - 您是否有可能打开了两个窗口,以不同的权限执行?也许检查 .git 文件夹的所有权。
也许检查是否有一个未完成的文件锁打开,也许使用 lsof 来检查,或者你的操作系统的等效项。
【讨论】:
【参考方案2】:检查您(实际上是 git 进程)是否有权访问文件 .git/info/refs
,并且该文件未被其他进程锁定。
【讨论】:
你如何检查?【参考方案3】:更新:
您可能需要编辑您的 ~/.netrc 文件:
https://bugs.launchpad.net/ubuntu/+source/git-core/+bug/293553
原答案:
为什么禁用 ssl?我认为这可能与您无法通过 https 推送有关。我会重新设置并尝试再次推送:
git config –global http.sslVerify true
【讨论】:
【参考方案4】:对于 bettercodes.org,解决方案更具诗意——唯一的问题可能是分配给项目成员的权利。简单成员没有写权限!请确保您拥有版主或管理员权限。当然,这需要由管理员在 bettercodes.org 的项目设置中进行设置。
【讨论】:
【参考方案5】:这可能现在已经解决了。但这对我有用。
地点:
如果锁定的存储库在服务器端:
-
ssh 到服务器上的 git 存储库。
以有权修改存储库并导航到服务器上的存储库的用户身份登录。
如果锁定的存储库仅在本地:
-
打开 git 控制台并导航到存储库目录。
运行这个命令:
git update-server-info
如果需要,请修复您(远程或/和本地)存储库的权限。在我的情况下,我必须 chmod
到 777
和 chown
到 apache:apache
尝试从本地仓库再次推送:
git push
【讨论】:
【参考方案6】:这对我来说是这样的。
-
在您的服务器上查找 Apache DAV 锁定文件(例如 /var/lock/apache2/DAVlock)
删除它
使用网络服务器的写入权限重新创建它
重启网络服务器
更快的选择:
-
在您的服务器上查找 Apache DAV 锁定文件(例如 /var/lock/apache2/DAVlock)
清空文件:
cat /dev/null > /var/lock/apache2/DAVlock
重启网络服务器
【讨论】:
这是我的问题。谢谢你的帖子。我一口气运行了删除和权限。#> rm DAVLock; touch DAVLock; chown www-data.www-data DAVLock; chmod 755 DAVLock; service apache2 restart
【参考方案7】:
当我的 git remote (bitbucket.org) 更改其 IP 地址时,这发生在我身上。快速修复是删除并重新添加遥控器,然后一切都按预期工作。如果您不熟悉如何在 git 中删除和重新添加遥控器,请按照以下步骤操作:
复制现有远程的 SSH git URL。您可以使用以下命令将其打印到终端:
git remote -v
这将打印出如下内容:
origin git@server-address.org:account-name/repo-name.git (fetch)
origin git@server-address.org:account-name/repo-name.git (push)
从本地 git repo 中删除远程:
git remote rm origin
将遥控器添加回您的本地仓库:
git remote add origin git@server-address.org:account-name/repo-name.git
【讨论】:
我已经尝试了其他所有方法,例如 git gc、git prune、rm 'file with lock error'、git update server info 等。只有这个答案对我有用。有时它就像 Windows 重新启动,重新启动,它会工作。同样在这里,只需删除并再次添加回购,一切都很好;) 在上述过程之后,我还需要告诉 git 再次跟踪远程分支,例如:git branch -u origin/master
这把我在 .git/config 中的所有远程跟踪信息都吹走了,实际上并没有用。
这对我也有用。其他所有都不起作用。
这个绝对最适合我。修剪的东西只适用于几个下一个命令,但在那之后,讨厌的问题又回来了。这个解决方案确实成功了。【参考方案8】:
在我的例子中,一个分支被移动到了一个子目录,这个目录被称为分支。 Git对此感到困惑。当我删除本地分支时(在 SourceTree 中,只需右键单击删除)一切正常。
【讨论】:
【参考方案9】:你想尝试做:
git gc --prune=now
见https://www.kernel.org/pub/software/scm/git/docs/git-gc.html
【讨论】:
--prune=now 和 --prune=all 一样吗?如果是这样,文档会警告您可能会丢失未锚定的对象。如果有未锚定的对象,您可能应该在修剪之前尝试协调它们。 救命稻草,谢谢。git pull
遇到类似的错误消息。
它有助于获取“git 错误:无法锁定 ref”异常。非常感谢!
这对我有用。但是每次我使用处理远程的git
命令时,我都必须继续执行相同的命令。 git remote prune origin
一劳永逸地解决了这个问题。
fwiw: git gc: 在当前存储库中运行一些内务处理任务,例如压缩文件修订...删除可能从之前调用 git add 创建的无法访问的对象,打包 refs、修剪 reflog、rerere 元数据或过时的工作树... AND prune:修剪比日期更早的松散对象(默认为 2 周前,可被配置变量覆盖gc.pruneExpire)。 --prune=now 修剪松散的对象,无论它们的年龄如何,如果另一个进程同时写入存储库,则会增加损坏的风险...--prune 默认开启。【参考方案10】:
我通过以下操作解决了这个问题
git branch --unset-upstream
rm .git/refs/remotes/origin/branch
git gc --prune=now
git branch --set-upstream-to=origin/branch branch
#or git push --set-upstream origin branch
git pull
这假设您的本地和远程分支是对齐的,并且您只是将 refs 错误视为非致命错误。
【讨论】:
【参考方案11】:对我来说这有效(不会在远程更改):
git remote prune origin
由于这个答案似乎对很多人有所帮助,因此我对这里实际发生的情况进行了一些研究。这样做的目的是删除文件夹 .git/refs/remotes/origin
中对远程分支的引用。
所以这不会影响你的本地分支,也不会改变任何远程,但它会更新你对远程分支的本地引用。在某些情况下,这些引用似乎包含 Git 无法正确处理的数据。
【讨论】:
我添加了一些背景信息,但老实说,我不知道这是为什么以及如何工作的 :) git remote prune origin 为我工作。但我已经删除了 .git/refs/remotes/origin 中的所有引用。 这正是git
建议的做法,但我不愿意这样做,因为该命令听起来像是对遥控器有作用。
我跑了git gc --prune=now
这是我运行过的最可怕的 git cmd。 (PS:成功了)【参考方案12】:
我遇到了这个问题,因为我在一个与上游分支同名的分支上。即上游分支称为example-branch
,我的本地分支称为example-branch/backend
。解决方案是像这样更改我本地分支的名称:
git branch -m <new name goes here>
【讨论】:
遇到了类似的问题。有一个上游分支“任务线/布局”和一个本地分支“任务线”(使用 Gitkraken)。刚刚将“任务线”重命名为“任务线/错误修复”,它就和以前一样工作了。【参考方案13】:我在尝试运行 git filter-branch
以将许多子目录分离到一个新的单独存储库(如 this answer 中)时看到此错误。
我尝试了上述所有解决方案,但都没有奏效。最终,我决定我不需要在新分支中保留我的标签,然后就跑了:
git remote remove origin
git tag | xargs git tag -d
git gc --prune=now
git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- apps/AAA/ libs/xxx' --prune-empty -- --all
【讨论】:
【参考方案14】:运行命令git update-ref -d refs/heads/origin/branch
修复它。
【讨论】:
该命令也对我有用,尽管我的远程分支 ref 略有不同:git update-ref -d refs/remotes/origin/my_branch
这对我有用,看来这是一个区分大小写的问题。有两个同名的分支被另一个 git 用户推送到 origin,一个全小写,一个是标题大小写。
这修复了它...由 2 个同名分支不同情况引起。【参考方案15】:
在我的例子中,它与我已经创建的分支名称相关联。
为了解决这个问题,我创建了一个名称肯定不应该存在的分支,例如:
git checkout -b some_unknown_branch
然后我清除了所有其他分支(未激活),因为它们只是不必要的垃圾。
git branch | grep -v \* | grep -v master | xargs git branch -D
然后用我想要的名称重命名我当前的分支,例如:
git checkout -m my_desired_branch_name
【讨论】:
【参考方案16】:当我尝试创建一个包含旧分支名称的新功能分支时,我遇到了这个问题,例如origin - branch1,我想创建 branch1-feature。 这是不可能的,但 branch1/feature 已经是了。
【讨论】:
【参考方案17】:在收到此消息后,我执行了 checkout 命令并收到此消息:
Your branch is based on 'origin/myBranch', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
运行此命令后,我恢复正常。
【讨论】:
【参考方案18】:就我而言,我必须手动删除已在远程删除的旧标签。
【讨论】:
【参考方案19】:对我有用的是:
-
删除
.git/logs/refs/remotes/origin/branch
删除.git/refs/remotes/origin/branch
运行git gc --prune=now
更多关于git gc
命令在这里:https://git-scm.com/docs/git-gc
【讨论】:
工作就像一个魅力。如果有人遇到文件/文件夹名称分支的问题,那么它实际上是指所有分支名称文件/文件夹。我希望这会有所帮助! 如果您也添加文档链接会很棒。喜欢 gc 命令【参考方案20】:这是我为摆脱所有锁定引用问题所做的:
git gc --prune=now
git remote prune origin
这可能也是你只需要做的。
更多关于git gc
命令在这里:https://git-scm.com/docs/git-gc
更多关于git remote prune
的信息在这里:https://git-scm.com/docs/git-remote#Documentation/git-remote.txt-empruneem
【讨论】:
【参考方案21】:在git pull
之前运行git fetch --all
。这应该可以解决问题。
【讨论】:
【参考方案22】:在拉取之前,您需要清理本地更改。以下命令帮助我解决。
git remote prune origin
然后
git pull origin develop
希望这会有所帮助!
【讨论】:
它不能解决我的问题。仍然得到同样的错误 @AfonsoSchulzAlbrecht 我需要解决 emirc 提供的***.com/a/59645527/4502379 解决方案【参考方案23】:对我来说,删除 .git/info/ref
让事情顺利进行。当 git 未运行时,不应该有 ref
文件。但就我而言,无论出于何种原因,都有一个问题导致了问题。
删除文件不会删除您的任何本地提交或分支。
【讨论】:
【参考方案24】:除了已经为这个问题提供的许多答案之外,对您机器中存在的本地 repo 分支和远程中不存在的分支进行简单检查会有所帮助。在这种情况下,您不使用
git 修剪
许多人建议的命令。
只需删除本地分支
git branch -d <branch name without a remote tracking branch by the same name>
如所附屏幕截图所示,当您确定本地分支没有跟踪远程分支时,使用 -D 强制删除。
【讨论】:
【参考方案25】:我遇到了一个典型的 Mac 相关问题,无法通过其他建议的答案解决。
Mac 的默认文件系统设置是不区分大小写的。
就我而言,一位同事显然忘记为分支创建大写字母,即
testBranch/ID-1 对比 测试分支/ID-2
对于 Mac 文件系统(是的,它可以配置不同),这两个分支是相同的,在这种情况下,您只能获得两个文件夹之一。对于剩余的文件夹,您会收到错误消息。
在我的情况下,删除 .git/logs/ref/remotes/origin 中的相关子文件夹解决了问题,因为相关分支已被合并回来。
【讨论】:
我在 Windows 上遇到了同样的问题。有人创建了另一个名称相同但大小写不同的分支。我必须删除 git 服务器上的两个分支之一才能正常工作。【参考方案26】:对我来说,当我尝试创建一个名称类似这样的新分支时,就会发生这种情况:
master/pre-upgrade
将其更改为另一个名称,例如:
pre-upgrade/master
成功了!
【讨论】:
【参考方案27】:我有同样的错误信息,根本原因是重写历史(分支重命名)。
这对我有用:
git remote prune origin
来源:https://codedaily.in/git-error-cannot-lock-refs/
【讨论】:
【参考方案28】:这个错误正在发生
git fetch
但在我的情况下,我只想更新主分支,可以使用
git fetch origin main
不是锁定引用问题的解决方案,但它帮助我避免了这个问题:P
【讨论】:
【参考方案29】:如果您很幸运,没有本地工作可以提交/推送,也没有时间喝咖啡,您可以简单地删除本地的 repo 副本并重新克隆
【讨论】:
【参考方案30】:作为 Visual Studio Code(vscode、code)(可能还有其他 IDE)的参考
我必须做命令:Git: Fetch (Prune)
命令行选项应该是:git fetch --prune
然后重启整个IDE。
为了给出一些观点,我将引用BitBucket's docks:
Git Prune、Git Fetch --prune 和 Git Remote Prune 有什么区别?
git remote prune
和git fetch --prune
做同样的事情:删除远程不存在的分支的引用。当在团队工作流中工作时,这是非常可取的,其中远程分支在合并到main
后被删除。第二个命令git fetch --prune
将连接到远程并在修剪之前获取最新的远程状态。它本质上是命令的组合:git fetch --all && git remote prune
通用的git prune
命令完全不同。如概述部分所述,git prune 将删除本地分离的提交。
【讨论】:
以上是关于Git 和讨厌的“错误:无法锁定现有信息/引用致命”的主要内容,如果未能解决你的问题,请参考以下文章