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
      

    如果需要,请修复您(远程或/和本地)存储库的权限。在我的情况下,我必须 chmod777chownapache: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 prunegit fetch --prune 做同样的事情:删除远程不存在的分支的引用。当在团队工作流中工作时,这是非常可取的,其中远程分支在合并到main 后被删除。第二个命令git fetch --prune 将连接到远程并在修剪之前获取最新的远程状态。它本质上是命令的组合: git fetch --all &amp;&amp; git remote prune 通用的git prune 命令完全不同。如概述部分所述,git prune 将删除本地分离的提交。

【讨论】:

以上是关于Git 和讨厌的“错误:无法锁定现有信息/引用致命”的主要内容,如果未能解决你的问题,请参考以下文章

git stash简介

git stash简介

是否有PyScripter的Mercurial或Git版本控制插件?

Git别名中的管道?

webstrom 里面添加git flow

如何禁用适用于 Windows 的 Git 凭据管理器?