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

从远程git仓库克隆后(在bettercodes) 我做了一些改变,承诺 And try to push:

git push origin master

错误:

错误:不能锁定现有的信息/refs
致命:git-http-push failed

本案例涉及已经存在的存储库。

我之前做的是:

  1. # EYZ0
  2. # EYZ0
  3. # EYZ0
  4. # EYZ0
  5. 更改数据
  6. # EYZ0

在'bettercodes'我没有访问git日志。

我用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

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

602402 次浏览

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

也许检查是否有未完成的文件锁打开,也许使用lsof检查,或者对您的操作系统使用相同的方法。

检查你(git进程)是否可以访问.git/info/refs文件,并且这个文件没有被其他进程锁定。

更新:

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

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


最初的回答:

为什么禁用ssl?我想这可能与你无法通过https推送有关。我会把它放回去,再试着推一下:

git config –global http.sslVerify true

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

这个问题现在可能已经解决了。但这是对我有效的方法。

  1. < p >位置:

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

      1. SSH到服务器上的git存储库。
      2. 以具有修改存储库权限的用户身份登录,并导航到服务器上的存储库。
      3. 李< / ol > < / >
      4. 如果锁定的存储库仅为本地:

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

          git update-server-info
          
  2. Fix the permissions on your (remote or/and local) repository if you have to. In my case I had to chmod to 777 and chown to apache:apache

  3. Try to push again from the local repository:

    git push
    

这就是我的工作方式。

  1. 在服务器上查找Apache DAV锁文件(例如/var/lock/apache2/DAVlock)
  2. 删除它
  3. 重新创建具有写权限的web服务器
  4. 重新启动web服务器

还有更快的选择:

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

这发生在我身上,当我的git远程(bitbucket.org)改变了他们的IP地址。快速解决方法是删除并重新添加遥控器,然后一切都能正常工作。如果你不熟悉如何在git中删除和重新添加一个远程,以下是步骤:

  1. 复制现有远程的SSH git URL。你可以使用下面的命令打印到终端:

    # EYZ0 < / p >

它会打印出如下内容:

 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中删除远程:

    # EYZ0 < / p >

  2. 添加远程回您的本地回购:

    # EYZ0 < / p >

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

你想尝试做:

git gc --prune=now

看到# EYZ0

我通过以下方法解决了这个问题

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

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

# EYZ0

因为这个答案似乎对很多人都有帮助,所以我深入研究了一下这里到底发生了什么。这将删除文件夹.git/refs/remotes/origin中对远程分支的引用。

因此,这不会影响您的本地分支机构,也不会改变任何远程内容,但是它将更新您对远程分支的本地引用。在某些情况下,这些引用可能包含Git无法正确处理的数据。

我遇到这个问题是因为我所在的分支与上游分支具有类似的名称。例如,上游分支被称为example-branch,我的本地分支被称为example-branch/backend。解决方案是更改我的本地分支机构的名称,如下所示:

git branch -m <new name goes here>

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

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

在我的例子中,它与我已经创建的分支名称相连接。

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

git checkout -b some_unknown_branch

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

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

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

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

在我的情况下,在得到这条消息后,我执行了结帐命令,并得到了这条消息:

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

执行这个命令后,我恢复了正常。

在我的情况下,我不得不手动删除旧标签已被删除的远程。

对我有用的是:

  1. 删除# EYZ0
  2. 删除# EYZ0
  3. 运行# EYZ0

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

这是我所做的,以摆脱所有的锁引用问题:

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

git pull之前执行git fetch --all。这样问题就解决了。

在拉之前,你需要清理你的局部变化。下面的命令帮助我解决。

git remote prune origin

之后

git pull origin develop

希望这能有所帮助!

对我来说,删除.git/info/ref会让事情变得更好。当git没有运行时,不应该有ref文件。但在我的情况下,不管出于什么原因,有一个人导致了问题。

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

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

git修剪

正如许多人所建议的那样。

只需删除本地分支

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

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

lock ref error git

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

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

在我的例子中,一个同事显然忘记了为分支创建一个大写字母。

< p > testBranch /符合 vs。 testbranch / id 2 < / p >

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

在我的例子中,删除.git/logs/ref/remotes/origin中的有问题的子文件夹解决了问题,因为有问题的分支已经合并回来了。

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

master/pre-upgrade

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

pre-upgrade/master

成功了!

关于这个问题的一些附加信息

Git将分支信息存储为文件夹结构中的文件,其中/后面的最后一个字符串是包含分支头的提交SHA#的文件。

这意味着分支调用

a/b/c

将存储在

.git/refs/heads/a/b/c

如果您尝试添加一个名为

a/b/c/d

Git会尝试存储它

.git/refs/heads/a/b/c/d

但这是不可能的,因为b是一个文件,不能存储其他文件在它。

i.e.将git分支名视为路径,因为它们被git用作路径。

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

这对我很管用:

git remote prune origin

来源:# EYZ0

这个错误正在发生

git fetch

但在我的情况下,我只是想要更新的主要分支可以使用

git fetch origin main

不是一个解决锁定参考问题的方法,但它帮助我避免了这个问题:P

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

作为Visual Studio Code (vscode, Code)(也可能是其他ide)的参考

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

命令行替代选项应该是:git fetch --prune

然后< >强劲启动< / >强整个IDE。

为了给出一些观点,我将引用BitBucket都的码头:

Git Prune,
Git Fetch - Prune和Git Remote Prune之间的区别是什么?

git remote prunegit fetch --prune做同样的事情:删除对远程上不存在的分支的引用。当在合并到main后删除远程分支的团队工作流中工作时,这是非常可取的。第二个命令git fetch --prune将连接到远程并在修剪之前获取最新的远程状态。它本质上是命令的组合: < br > # EYZ0
通用的git prune命令完全不同。正如概述部分所讨论的,git prune将删除本地分离的提交。

情况1:检查git-server上的分支是否重复。

Example: two branches below are duplicated:


- upper_with_lower
- UPPER_with_lower


---> Let consider removing one of them.

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

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

我也有一个类似的问题,完全把我搞糊涂了。我有一个名为测验的本地分支,并试图获取和签出名为测试/一些变化的远程分支。

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