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


360

从远程git仓库克隆后(以更好的代码),我进行了一些更改,提交并尝试推送:

git push origin master

错误:

错误:无法锁定现有信息/引用
致命:git-http-push失败

这种情况涉及已经存在的存储库。

我之前所做的是:

  1. git config –global http.sslVerify false
  2. git init
  3. git remote add [url]
  4. git clone
  5. 变更资料
  6. 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

我之前克隆过,然后更改了代码并提交了。


没有运气,同样的错误。
2011年

可能的两个原因:a)另一个git实例正在运行(杀死所有git进程或重新启动)b).git文件夹已创建为Administrator(尝试使用管理员命令行进行操作)
FractalSpace

对我来说,我通过致电git fetchbefore 解决了错误git pull
Levi Fuller

1
该错误令人讨厌
-RobW

Answers:


682

对我来说,这工作:

git remote prune origin

由于这个答案似乎可以帮助很多人,因此我对这里实际发生的情况做了一些探讨。这将删除文件夹中对远程分支的引用.git/refs/remotes/origin。因此,这不会影响您的本地分支机构,也不会更改任何远程对象,但会更新您对远程分支机构的本地引用。在某些情况下,这些引用可能包含Git无法正确处理的数据。


1
我已经添加了一些背景信息,但是我必须坦白地说我不知道​​为什么以及如何工作:)
arno_v

1
git remote prune起源对我有用。但是我已经删除了.git / refs / remotes / origin中的所有引用。
Isuru Madusanka

2
这正是git建议执行的操作,但是我不愿意执行此操作,因为该命令听起来像它对遥控器有作用。
扔掉帐户

4
我参加了git gc --prune=now
Stanley Mohlala,

9
这是我有一段时间运行的最简单的git cmd。(PS:有效)
星期六,星期六

456

您想尝试做:

git gc --prune=now

参见https://www.kernel.org/pub/software/scm/git/docs/git-gc.html


--prune = now现在与--prune = all相同吗?如果是这样,则文档警告您可能会丢失未固定的对象。如果存在未固定的对象,则可能应在修剪之前尝试对其进行调和。
阿萨夫以色列

3
救生员,谢谢。 git pull被类似的错误消息卡住了。
菲尔·布鲁贝克

4
它有助于获取时出现“ git错误:无法锁定引用”异常。非常感谢!
亚历山大

9
这对我有用。但是,每次使用git远程处理命令时,我都必须继续执行相同的命令。git remote prune origin一劳永逸地解决了这个问题。
Keyur Golani

拯救了我的一天!非常感谢:)
Abhishek Gautam'1

188

当我的git remote(bitbucket.org)更改其IP地址时,这发生在我身上。快速的解决方法是删除并重新添加遥控器,然后一切都按预期工作。如果您不熟悉如何在git中删除并重新添加遥控器,请按照以下步骤操作:

  1. 复制现有遥控器的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)
  1. 从本地git仓库中删除遥控器:

    git remote rm origin

  2. 将遥控器添加回本地仓库:

    git remote add origin git@server-address.org:account-name/repo-name.git


8
我已经尝试了其他所有方法,例如git gc,git prune,rm'带锁定错误的文件',git更新服务器信息等。仅此答案对我有用。有时就像重启Windows一样,它可以正常工作。同样在这里,只是删除并再次添加存储库,一切都很好;)
Marquinho Peli

12
完成上述步骤后,我还需要告诉git使用以下命令再次跟踪远程分支:git branch -u origin/master
fotinsky

这使我在.git / config中的所有远程跟踪信息消失了,实际上并没有起作用。
ThomasMcLeod19年

这也为我工作。所有其他人都没有工作。
dondrzzy

42

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


4
尽管我的远程分支引用稍有不同,但该命令也为我git update-ref -d refs/remotes/origin/my_branch
带来了麻烦

这对我有用,看来这是区分大小写的问题。有两个同名分支被另一个git用户推送到源,一个分支全部为小写,另一个为标题大小写。
th3uiguy

24

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

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错误是非致命的。


12

我遇到这个问题是因为我所在的分支与上游分支的名称相似。即上游分支被调用example-branch而我的本地分支被调用example-branch/backend。解决方案是这样更改本地分支的名称:

git branch -m <new name goes here>

11

现在可能已经解决了。但是,这对我有用。

  1. 位置:

    • 如果锁定的存储库在服务器端:

      1. ssh到服务器上的git存储库。
      2. 以具有修改存储库并导航到服务器上的存储库的权限的用户身份登录。
    • 如果锁定的存储库仅是本地的:

      1. 打开git控制台并导航到存储库目录。
      2. 运行以下命令:

        git update-server-info
        
  2. 如果需要,请修复(远程或/和本地)存储库上的权限。在我而言,我不得不chmod777chownapache:apache

  3. 尝试再次从本地存储库中推送:

    git push
    

10

对我有用的是:

  1. 去掉 .git/logs/refs/remotes/origin/branch
  2. 去掉 .git/refs/remotes/origin/branch
  3. git gc --prune=now

1
像魅力一样工作。如果有人遇到文件/文件夹名称分支的问题,那么它实际上是指所有分支名称文件/文件夹。我希望这有帮助!
Ankit Kesharwani

7

这就是我的工作方式。

  1. 在您的服务器上查找Apache DAV锁定文件(例如/ var / lock / apache2 / DAVlock)
  2. 删除它
  3. 使用Web服务器的写入权限重新创建它
  4. 重新启动网络服务器

更快的选择:

  1. 在您的服务器上查找Apache DAV锁定文件(例如/ var / lock / apache2 / DAVlock)
  2. 清空文件: cat /dev/null > /var/lock/apache2/DAVlock
  3. 重新启动网络服务器

这是我的问题。感谢您的帖子。我一次性执行了删除和权限。#> rm DAVLock; touch DAVLock; chown www-data.www-data DAVLock; chmod 755 DAVLock; service apache2 restart
djneely 2014年

6

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

也许检查一下是否有未打开的文件锁打开,也许使用lsof进行检查,或者与您的操作系统等效。


3

在我的情况下,分支已移至子目录,该目录称为分支。吉特对此感到困惑。当我删除本地分支(在SourceTree中,只需右键单击Delete)时,一切正常进行。


3

就我而言,收到此消息后,我执行了checkout命令,并收到以下消息:

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

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




1

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


1

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


1

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

为了解决这个问题,我创建了一个分支,其名称在某些情况下不应该存在,例如:

git checkout -b some_unknown_branch

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

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

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

git checkout -m my_desired_branch_name

0

对于Bettercodes.org,解决方案更具诗意-唯一的问题可能是分配给项目成员的权限。简单成员没有写权限!请确保您具有主持人或管理员权限。当然,这需要管理员在项目设置中的bestcodes.org上进行设置。


0

当尝试运行git filter-branch将许多子目录分离到一个新的单独的存储库中时,我看到了此错误(如此答案)。

我尝试了上述所有解决方案,但均无效果。最终,我决定不需要在新分支中保留所有非常糟糕的标签,只需运行:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.