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

时间:2011-07-11 21:12:05

标签: git

从远程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
  7. 在“更好的代码”中,我无法访问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
    

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

29 个答案:

答案 0 :(得分:355)

你想尝试做:

git gc --prune=now

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

答案 1 :(得分:347)

对我来说这很有效:

git remote prune origin

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

答案 2 :(得分:174)

当我的git remote(bitbucket.org)更改了他们的IP地址时,发生了这种情况。快速解决方法是删除并重新添加遥控器,然后一切按预期工作。如果您不熟悉如何在git中删除和重新添加远程,请执行以下步骤:

  1. 复制现有遥控器的SSH git URL。您可以使用以下命令将其打印到终端:

    git remote -v

  2. 会打印出类似这样的内容:

     origin git@server-address.org:account-name/repo-name.git (fetch)
     origin git@server-address.org:account-name/repo-name.git (push)
    
    1. 从本地git repo中删除遥控器:

      git remote rm origin

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

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

答案 3 :(得分:26)

这是我摆脱所有锁定引用问题的方法:

git gc --prune=now
git remote prune origin

这也许也是您要做的。

答案 4 :(得分:22)

对我有用的是:

  1. 删除.git/logs/refs/remotes/origin/branch
  2. 删除.git/refs/remotes/origin/branch
  3. 运行git gc --prune=now

答案 5 :(得分:18)

我通过执行以下操作来修复此问题

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

答案 6 :(得分:15)

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

答案 7 :(得分:12)

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

git remote prune origin

然后

git pull origin develop

希望这会有所帮助!

答案 8 :(得分:10)

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

  1. 位置:

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

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

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

        git update-server-info
        
  2. 如果必须,修复(远程或/和本地)存储库的权限。在我的情况下,我必须chmod777chownapache:apache

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

    git push
    

答案 9 :(得分:7)

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

git branch -m <new name goes here>

答案 10 :(得分:6)

这就是我的工作方式。

  1. 在服务器上查找Apache DAV锁文件(例如/ var / lock / apache2 / DAVlock)
  2. 删除它
  3. 使用网络服务器的写权限重新创建
  4. 重启网络服务器
  5. 更快的选择:

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

答案 11 :(得分:4)

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

也许检查是否有未完成的文件锁打开,可能使用lsof进行检查,或者等效于您的操作系统。

答案 12 :(得分:2)

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

答案 13 :(得分:2)

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

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

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

答案 14 :(得分:2)

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

答案 15 :(得分:1)

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

这对我有用:

git remote prune origin

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

答案 16 :(得分:1)

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

答案 17 :(得分:1)

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

答案 18 :(得分:1)

更新

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

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

原始答案:

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

git config –global http.sslVerify true

答案 19 :(得分:0)

我遇到了一个典型的Mac相关问题,无法通过其他建议的答案解决。

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

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

testBranch / ID-1 与 testbranch / UD-2

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

就我而言,由于相关分支已经合并回去,因此删除.git / logs / ref / remotes / origin中有问题的子文件夹即可解决此问题。

答案 20 :(得分:0)

对我来说,当我尝试使用这样的名称创建一个新分支时发生了这种情况:

master/pre-upgrade

将其更改为另一个名称,例如:

pre-upgrade/master

成功了!

答案 21 :(得分:0)

对于我来说,它与我已经创建的分支名称有关。
首先,我确实创建了一个分支,该分支的某些名称肯定不存在,例如:

git checkout -b some_unknown_branch

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

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

,然后将我的分支重命名为我想要的名称,例如:

git checkout -m my_desired_branch_name

答案 22 :(得分:0)

此错误正在发生

git fetch

但就我而言,我只想更新主分支,可以使用

git fetch origin main

不是锁定引用问题的解决方案,但它帮助我避免了这个问题:P

答案 23 :(得分:0)

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

答案 24 :(得分:0)

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

git prune

许多建议的命令。

只需删除本地分支

<div id="snippet">Hello</div>

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

lock ref error git

答案 25 :(得分:0)

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

答案 26 :(得分:0)

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

答案 27 :(得分:0)

检查您(实际上是git进程)是否可以访问文件.git/info/refs,并且此文件未被其他进程锁定。

答案 28 :(得分:-1)

对我来说,删除.git/info/ref一事无成。当git不运行时,不应有ref文件。但就我而言,无论出于什么原因,都有一个导致问题。

删除文件不会删除您的任何本地提交或分支。