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

Ann*_*nnD 292 git

从远程git存储库克隆后(在更好的代码中)我做了一些更改,提交并尝试推送:

git push origin master
Run Code Online (Sandbox Code Playgroud)

错误:

错误:无法锁定现有信息/引用
致命错误: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
Run Code Online (Sandbox Code Playgroud)

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

arn*_*o_v 507

对我来说,这工作:

git remote prune origin

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

  • 这是我一段时间以来运行过的最可怕的 git cmd。(PS:有效) (52认同)
  • `git pull --prune` 会做同样的事情,但命令不那么可怕。 (10认同)
  • 我跑了`git gc --prune=now` (8认同)
  • 这正是 `git` 建议做的事情,但我不愿意这样做,因为该命令听起来像是对遥控器做了一些事情。 (5认同)
  • 我已经添加了一些背景信息,但老实说我不知道​​这到底是为什么以及如何工作:) (3认同)
  • git remote prune origin 对我有用。但是我已经删除了 .git/refs/remotes/origin 中的所有引用。 (2认同)
  • 如果你仍然不相信这是无害的(我不相信),你可以先运行“git remote prune origin --dry-run”。这个答案为我解决了这个问题。 (2认同)
  • 呃,对我没用。我无法创建新分支:( (2认同)

kir*_*vaz 409

你想尝试做:

git gc --prune=now
Run Code Online (Sandbox Code Playgroud)

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

  • 这对我有用.但是每次我使用处理remote的`git`命令时我都必须继续执行相同的命令.`git remote prune origin`一劳永逸地解决了这个问题. (7认同)
  • 它有助于获取"git错误:无法锁定ref"异常.非常感谢! (4认同)
  • 生命保护,谢谢.`git pull`卡住了类似的错误信息. (3认同)

joh*_*lem 181

当我的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)
Run Code Online (Sandbox Code Playgroud)
  1. 从本地git仓库中删除远程:

    git remote rm origin

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

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

  • 在上面的过程之后,我还需要告诉git再次跟踪远程分支,例如:`git branch -u origin/master` (12认同)
  • 我已经尝试了其他一切,比如git gc,git prune,rm'带锁定错误的文件',git更新服务器信息等等.只有这个答案对我有用.有时它就像一个Windows重启,重启,它会工作.同样在这里,只需删除并再次添加回购,一切顺利;) (6认同)

ali*_*him 59

这就是我为摆脱所有锁定引用问题所做的工作:

git gc --prune=now
git remote prune origin
Run Code Online (Sandbox Code Playgroud)

这可能也是您唯一需要做的。

有关git gc命令的更多信息:https : //git-scm.com/docs/git-gc

更多关于git remote prune这里:https : //git-scm.com/docs/git-remote#Documentation/git-remote.txt-empruneem


emi*_*irc 33

对我有用的是:

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

有关git gc命令的更多信息:https : //git-scm.com/docs/git-gc


jav*_*web 28

As a reference for Visual Studio Code (vscode, code) (and possibly other IDEs)

\n

我必须执行命令:Git: Fetch (Prune)

\n

命令行替代方案应该是:git fetch --prune

\n

然后重新启动整个IDE。

\n

为了给出一些观点,我将引用BitBucket 的文档:

\n
\n

Git Prune 之间的区别是什么\xe2\x80\x99,
Git Fetch --prune, and Git Remote Prune?

\n

git remote prunegit fetch --prune做同样的事情:删除对远程上不存在的分支的引用。当在团队工作流程中工作时,这是非常需要的,其中远程分支在合并到 后被删除main。第二个命令git fetch --prune将连接到远程并在修剪之前获取最新的远程状态。它本质上是命令的组合:\n
git fetch --all && git remote prune\n
通用git prune command is entirely different. As discussed in the overview section, git prune will delete locally detached commits.

\n
\n


小智 27

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

  • 这对我有用,看来这是一个区分大小写的问题。有两个同名分支被另一位 git 用户推送到原点,一个全部小写,另一个是标题大写。 (4认同)
  • 尽管我的远程分支ref稍有不同,但该命令也对我有用:git update-ref -d refs / remotes / origin / my_branch` (2认同)

Fra*_*nza 22

我通过执行以下操作来解决此问题

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
Run Code Online (Sandbox Code Playgroud)

假设您的本地和远程分支已对齐,并且您只是将refs错误视为非致命错误.


Dha*_*ata 21

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

git remote prune origin
Run Code Online (Sandbox Code Playgroud)

然后之后

git pull origin develop
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!


小智 10

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

  1. 地点:

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

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

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

        git update-server-info
        
        Run Code Online (Sandbox Code Playgroud)
  2. 如果必须,修复(远程或/和本地)存储库的权限.在我而言,我不得不chmod777chownapache:apache

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

    git push
    
    Run Code Online (Sandbox Code Playgroud)


小智 10

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

git branch -m <new name goes here>
Run Code Online (Sandbox Code Playgroud)


sch*_*unk 6

这就是它对我有用的方式.

  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. 重启网络服务器


Cod*_*ife 6

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


Jos*_*osh 5

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

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