从远程git存储库克隆后(在bettercodes) 我做了一些改变,承诺 并试图推动:

git push origin master

错误:

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

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

我之前做的是:

Git配置-global http。sslVerify假 git init Git远程添加[url] git克隆 更改数据 git提交

在'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

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


这听起来像是一个权限问题——有没有可能你打开了两个窗口,使用不同的权限执行?也许可以检查.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的项目设置中进行设置。


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

Location: If locked repository is on the server-side: ssh to your git repository on the server. Login as user which has permissions to modify the repository and navigate to the repository on your server. If locked repository is local only: Open the git console and navigate to the repository directory. Run this command: git update-server-info 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 Try to push again from the local repository: git push


这就是我的工作方式。

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

还有更快的选择:

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


这发生在我身上,当我的git远程(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远程rm来源 将遥控器添加回本地回购: Git远程添加源git@server-address.org:account-name/repo-name.git


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


你想尝试做:

git gc --prune=now

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


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

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


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

Git远程删除源文件

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

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


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

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已经实现了。


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

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

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


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


对我有用的是:

删除. /日志/文献/遥控器/产地/分支 删除. / refs /遥控器/产地/分支 运行git gc——prune=now

更多关于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远程修剪的信息请访问:https://git-scm.com/docs/git-remote#Documentation/git-remote.txt-empruneem


在git pull之前运行git fetch。这样问题就解决了。


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

git remote prune origin

之后

git pull origin develop

希望这能有所帮助!


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

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


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

去修剪

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

只需删除本地分支

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

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


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

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

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

testBranch /符合 vs。 testbranch / id 2

对于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

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


这个错误正在发生

git fetch

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

git fetch origin main

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


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


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

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

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

然后重新启动整个IDE。

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

What’s the Difference Between Git Prune,Git Fetch --prune, and Git Remote Prune? git remote prune and git fetch --prune do the same thing: delete the refs to branches that don't exist on the remote. This is highly desirable when working in a team workflow in which remote branches are deleted after merge to main. The second command, git fetch --prune will connect to the remote and fetch the latest remote state before pruning. It is essentially a combination of commands: git fetch --all && git remote prune The generic git prune command is entirely different. As discussed in the overview section, git prune will delete locally detached commits.


情况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的分支。


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

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