ChatGPT解决这个技术问题 Extra ChatGPT

Git 和讨厌的“错误:无法锁定现有信息/引用致命”

git

从远程 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

在“更好的代码”,我无法访问 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,所以我只是重命名了它并且它起作用了。

S
Sebastialonso

对我来说,这有效(远程不会改变):

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:成功了)
I
Ingo Karkat

你想尝试做:

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 元数据或过时的工作中创建的无法访问的对象树...和修剪:修剪比日期更早的松散对象(默认为 2 周前,可由配置变量 gc.pruneExpire 覆盖)。 --prune=now 修剪松散的对象,无论它们的年龄如何,如果另一个进程同时写入存储库,则会增加损坏的风险... --prune 默认情况下是打开的。
M
Max

当我的 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 将远程添加回本地 repo: 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 中的所有远程跟踪信息,实际上并没有工作。
@ThomasMcLeod 它也吹走了我的远程跟踪,但我用 git branch --set-upstream-to=origin/<branch> <local_branch> 一个接一个地恢复了
这绝对是最适合我的。修剪的东西只适用于几个下一个命令,但在那之后,讨厌的问题又回来了。这个解决方案确实成功了。
M
MiKr13

这就是我为摆脱所有 lock ref 问题所做的:

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


a
akansh tayal

运行命令 git update-ref -d refs/heads/origin/branch 修复了它。


该命令也对我有用,尽管我的远程分支 ref 略有不同:git update-ref -d refs/remotes/origin/my_branch
这对我有用,看来这是一个区分大小写的问题。有两个同名的分支被另一个 git 用户推送到原点,一个全小写,一个是标题大小写。
这修复了它...由 2 个具有相同名称的分支不同情况引起。
M
MiKr13

对我有用的是:

删除 .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 命令
P
P.M

我通过执行以下操作解决了这个问题

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 错误视为非致命错误。


D
Dharmesh Mansata

在拉取之前,您需要清理本地更改。以下命令帮助我解决。

git remote prune origin

然后之后

git pull origin develop

希望这会有所帮助!


它不能解决我的问题。仍然得到同样的错误
@AfonsoSchulzAlbrecht 我需要执行 emirc 提供的解决方案 stackoverflow.com/a/59645527/4502379
S
Stephen Rauch

我遇到了这个问题,因为我在一个与上游分支名称相似的分支上。即上游分支称为example-branch,我的本地分支称为example-branch/backend。解决方案是更改我本地分支的名称,如下所示:

git branch -m <new name goes here>

有类似的问题。有一个上游分支“questlines/layout”和一个本地分支“questlines”(使用 Gitkraken)。刚刚将“任务线”重命名为“任务线/错误修复”,它就像以前一样工作。
Z
Zsolt Botykai

现在应该已经解决了。但这对我有用。

位置:如果锁定的存储库在服务器端:ssh 到服务器上的 git 存储库。以有权修改存储库并导航到服务器上的存储库的用户身份登录。如果锁定的存储库仅在本地:打开 git 控制台并导航到存储库目录。运行以下命令: git update-server-info 如果需要,修复您的(远程或/和本地)存储库的权限。在我的情况下,我必须 chmod 到 777 并 chown 到 apache:apache 尝试从本地存储库再次推送: git push


M
Makoto

这听起来像是一个权限问题 - 您是否有可能打开了两个窗口,以不同的权限执行?也许检查 .git 文件夹的所有权。

也许检查是否有一个未完成的文件锁打开,也许使用 lsof 来检查,或者你的操作系统的等效项。


s
schmunk

这就是它对我的工作方式。

在您的服务器上查找 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
C
CodingYourLife

在我的例子中,一个分支被移动到一个子目录,并且该目录被称为分支。 Git对此感到困惑。当我删除本地分支(在 SourceTree 中只需右键单击删除)时,一切正常。


j
jave.web

作为 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 做同样的事情:删除远程不存在的分支的引用。在团队工作流中工作时,这是非常可取的,在该工作流中,远程分支在合并到主分支后会被删除。第二个命令 git fetch --prune 将连接到远程并在修剪之前获取最新的远程状态。它本质上是命令的组合: git fetch --all && git remote prune 通用的 git prune 命令完全不同。如概述部分所述, git prune 将删除本地分离的提交。


C
Colin

就我而言,在收到此消息后,我执行了结帐命令并收到此消息:

Your branch is based on 'origin/myBranch', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

运行此命令后,我恢复正常。


t
ttfreeman

git pull 之前运行 git fetch --all。那应该可以解决问题。


L
Liam

更新:

您可能需要编辑 ~/.netrc 文件:

https://bugs.launchpad.net/ubuntu/+source/git-core/+bug/293553

原答案:

你为什么禁用ssl?我认为这可能与您无法通过 https 推送有关。我会把它放回去并尝试再次推动:

git config –global http.sslVerify true

D
Denis

我有一个典型的 Mac 相关问题,我无法用其他建议的答案来解决。

Mac 的默认文件系统设置是不区分大小写。

就我而言,一位同事显然忘记为分支创建大写字母,即

testBranch/ID-1 与 testbranch/ID-2

对于 Mac 文件系统(是的,它可以配置不同),这两个分支是相同的,在这种情况下,您只能获得两个文件夹之一。对于剩余的文件夹,您会收到错误消息。

就我而言,删除 .git/logs/ref/remotes/origin 中的相关子文件夹解决了问题,因为相关分支已被合并回来。


我在 Windows 上遇到了同样的问题。有人创建了另一个名称相同但大小写不同的分支。我必须删除 git 服务器上的两个分支之一才能正常工作。
也使用 mac 并删除文件夹并没有解决问题,将文件夹名称中的大写(refs/remotes 文件夹中 / 之前的分支名称)更改为小写已经解决了我的问题
I
Ivan Danilov

检查您(实际上是 git 进程)是否有权访问文件 .git/info/refs,并且该文件没有被另一个进程锁定。


你怎么检查?
u
user11464384

当我试图创建一个包含旧分支名称的新功能分支时,我遇到了这个问题,例如 origin - branch1,我想创建 branch1-feature。这是不可能的,但 branch1/feature 已经是。


u
user2347763

除了已经为这个问题提供的许多答案之外,对您机器中存在的本地 repo 分支和远程不存在的本地 repo 分支进行简单检查,将有所帮助。在这种情况下,您不使用

git 修剪

许多人建议的命令。

只需删除本地分支

git branch -d <branch name without a remote tracking branch by the same name>

如所附屏幕截图所示,当您确定本地分支没有跟踪远程分支时,使用 -D 强制删除。

https://i.stack.imgur.com/ycVqS.jpg


M
Marc Wäckerlin

我有同样的错误信息,根本原因是重写历史(分支重命名)。

这对我有用:

git remote prune origin

来源:https://codedaily.in/git-error-cannot-lock-refs/


a
alphaplus

案例 1:让我们从 git-server 检查分支是否重复。

Example: two branches below are duplicated:

    - upper_with_lower
    - UPPER_with_lower

---> Let consider removing one of them.

案例 2:您正在推送的分支与其他分支重复。


j
joliejuly

就我而言,我必须手动删除已在远程删除的旧标签。


A
Arsen Khachaturyan

就我而言,它与我已经创建的分支名称相关联。

为了解决这个问题,我创建了一个名称肯定不应该存在的分支,例如:

git checkout -b some_unknown_branch

然后我清除了所有其他分支(不活动),因为它们只是不必要的垃圾。

git branch | grep -v \* | grep -v master | xargs git branch -D

然后用我想要的名称重命名我当前的分支,例如:

git checkout -m my_desired_branch_name

a
andrew pate

如果您幸运地没有本地工作可以提交/推送并且没有时间喝咖啡,您可以简单地删除您的本地回购副本并重新克隆


S
ScottyBlades

当我尝试创建一个以当前分支开头的分支时,我遇到了这个问题。我有一个名为 develop 的分支,我尝试创建一个名为 develop/myFeature 的分支。


e
equi

我有一个类似的问题让我完全困惑。我有一个名为 test 的本地分支,并试图获取并签出名为 test/some-changes 的远程分支。

修复只是删除一个陈旧的测试分支,我可以获取并签出远程分支。


y
yman

在 bettercodes.org 的情况下,解决方案更具诗意——唯一的问题可能是分配给项目成员的权利。简单成员没有写权限!请确保您拥有版主或管理员权限。当然,这需要由管理员在项目设置中的 Bettercodes.org 中进行设置。


t
tessafyi

我在尝试运行 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