从远程 git 存储库(在 bettercodes)克隆后,我做了一些更改,提交并尝试推送:
git push origin master
错误:
错误:无法锁定现有信息/参考 致命:git-http-push 失败
本案例涉及已经存在的存储库。
我之前做的是:
git config –global http.sslVerify false git init git remote add [url] git clone 更改数据 git commit
在“更好的代码”,我无法访问 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
我之前克隆了,然后更改了代码并提交了。
git pull
之前调用 git fetch
解决了错误。
对我来说,这有效(远程不会改变):
git remote prune origin
由于这个答案似乎对很多人有所帮助,因此我对这里实际发生的情况进行了一些研究。这将删除对文件夹 .git/refs/remotes/origin
中远程分支的引用。
所以这不会影响你的本地分支,也不会改变任何远程,但它会更新你对远程分支的本地引用。在某些情况下,这些引用似乎包含 Git 无法正确处理的数据。
你想尝试做:
git gc --prune=now
请参阅https://www.kernel.org/pub/software/scm/git/docs/git-gc.html
git pull
遇到类似的错误消息。
git
命令时,我都必须继续执行相同的命令。 git remote prune origin
一劳永逸地解决了这个问题。
当我的 git remote (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 remote rm origin 将远程添加回本地 repo: git remote add origin git@server-address.org:account-name/repo-name.git
git branch -u origin/master
git branch --set-upstream-to=origin/<branch> <local_branch>
一个接一个地恢复了
这就是我为摆脱所有 lock ref 问题所做的:
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 update-ref -d refs/heads/origin/branch
修复了它。
git update-ref -d refs/remotes/origin/my_branch
对我有用的是:
删除 .git/logs/refs/remotes/origin/branch 删除 .git/refs/remotes/origin/branch 运行 git gc --prune=now
在此处了解有关 git gc
命令的更多信息:https://git-scm.com/docs/git-gc
我通过执行以下操作解决了这个问题
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 remote prune origin
然后之后
git pull origin develop
希望这会有所帮助!
我遇到了这个问题,因为我在一个与上游分支名称相似的分支上。即上游分支称为example-branch
,我的本地分支称为example-branch/backend
。解决方案是更改我本地分支的名称,如下所示:
git branch -m <new name goes here>
现在应该已经解决了。但这对我有用。
位置:如果锁定的存储库在服务器端:ssh 到服务器上的 git 存储库。以有权修改存储库并导航到服务器上的存储库的用户身份登录。如果锁定的存储库仅在本地:打开 git 控制台并导航到存储库目录。运行以下命令: git update-server-info 如果需要,修复您的(远程或/和本地)存储库的权限。在我的情况下,我必须 chmod 到 777 并 chown 到 apache:apache 尝试从本地存储库再次推送: git push
这听起来像是一个权限问题 - 您是否有可能打开了两个窗口,以不同的权限执行?也许检查 .git 文件夹的所有权。
也许检查是否有一个未完成的文件锁打开,也许使用 lsof 来检查,或者你的操作系统的等效项。
这就是它对我的工作方式。
在您的服务器上查找 Apache DAV 锁定文件(例如 /var/lock/apache2/DAVlock) 删除它 使用网络服务器的写入权限重新创建它 重新启动网络服务器
更快的选择:
在您的服务器上查找 Apache DAV 锁定文件(例如 /var/lock/apache2/DAVlock) 清空文件: cat /dev/null > /var/lock/apache2/DAVlock 重新启动网络服务器
#> rm DAVLock; touch DAVLock; chown www-data.www-data DAVLock; chmod 755 DAVLock; service apache2 restart
在我的例子中,一个分支被移动到一个子目录,并且该目录被称为分支。 Git对此感到困惑。当我删除本地分支(在 SourceTree 中只需右键单击删除)时,一切正常。
作为 Visual Studio Code(vscode、code)(可能还有其他 IDE)的参考
我必须执行命令:Git: Fetch (Prune)
命令行替代应该是:git fetch --prune
然后重新启动整个 IDE。
为了给出一些观点,我将引用 BitBucket's docks:
Git Prune、Git Fetch --prune 和 Git Remote Prune 有什么区别? git remote prune 和 git fetch --prune 做同样的事情:删除远程不存在的分支的引用。在团队工作流中工作时,这是非常可取的,在该工作流中,远程分支在合并到主分支后会被删除。第二个命令 git fetch --prune 将连接到远程并在修剪之前获取最新的远程状态。它本质上是命令的组合: git fetch --all && git remote prune 通用的 git prune 命令完全不同。如概述部分所述, git prune 将删除本地分离的提交。
就我而言,在收到此消息后,我执行了结帐命令并收到此消息:
Your branch is based on 'origin/myBranch', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
运行此命令后,我恢复正常。
在 git pull
之前运行 git fetch --all
。那应该可以解决问题。
更新:
您可能需要编辑 ~/.netrc 文件:
https://bugs.launchpad.net/ubuntu/+source/git-core/+bug/293553
原答案:
你为什么禁用ssl?我认为这可能与您无法通过 https 推送有关。我会把它放回去并尝试再次推动:
git config –global http.sslVerify true
我有一个典型的 Mac 相关问题,我无法用其他建议的答案来解决。
Mac 的默认文件系统设置是不区分大小写。
就我而言,一位同事显然忘记为分支创建大写字母,即
testBranch/ID-1 与 testbranch/ID-2
对于 Mac 文件系统(是的,它可以配置不同),这两个分支是相同的,在这种情况下,您只能获得两个文件夹之一。对于剩余的文件夹,您会收到错误消息。
就我而言,删除 .git/logs/ref/remotes/origin 中的相关子文件夹解决了问题,因为相关分支已被合并回来。
检查您(实际上是 git 进程)是否有权访问文件 .git/info/refs
,并且该文件没有被另一个进程锁定。
当我试图创建一个包含旧分支名称的新功能分支时,我遇到了这个问题,例如 origin - branch1,我想创建 branch1-feature。这是不可能的,但 branch1/feature 已经是。
除了已经为这个问题提供的许多答案之外,对您机器中存在的本地 repo 分支和远程不存在的本地 repo 分支进行简单检查,将有所帮助。在这种情况下,您不使用
git 修剪
许多人建议的命令。
只需删除本地分支
git branch -d <branch name without a remote tracking branch by the same name>
如所附屏幕截图所示,当您确定本地分支没有跟踪远程分支时,使用 -D 强制删除。
https://i.stack.imgur.com/ycVqS.jpg
我有同样的错误信息,根本原因是重写历史(分支重命名)。
这对我有用:
git remote prune origin
来源:https://codedaily.in/git-error-cannot-lock-refs/
案例 1:让我们从 git-server 检查分支是否重复。
Example: two branches below are duplicated:
- upper_with_lower
- UPPER_with_lower
---> Let consider removing one of them.
案例 2:您正在推送的分支与其他分支重复。
就我而言,我必须手动删除已在远程删除的旧标签。
就我而言,它与我已经创建的分支名称相关联。
为了解决这个问题,我创建了一个名称肯定不应该存在的分支,例如:
git checkout -b some_unknown_branch
然后我清除了所有其他分支(不活动),因为它们只是不必要的垃圾。
git branch | grep -v \* | grep -v master | xargs git branch -D
然后用我想要的名称重命名我当前的分支,例如:
git checkout -m my_desired_branch_name
如果您幸运地没有本地工作可以提交/推送并且没有时间喝咖啡,您可以简单地删除您的本地回购副本并重新克隆
当我尝试创建一个以当前分支开头的分支时,我遇到了这个问题。我有一个名为 develop
的分支,我尝试创建一个名为 develop/myFeature
的分支。
我有一个类似的问题让我完全困惑。我有一个名为 test 的本地分支,并试图获取并签出名为 test/some-changes 的远程分支。
修复只是删除一个陈旧的测试分支,我可以获取并签出远程分支。
在 bettercodes.org 的情况下,解决方案更具诗意——唯一的问题可能是分配给项目成员的权利。简单成员没有写权限!请确保您拥有版主或管理员权限。当然,这需要由管理员在项目设置中的 Bettercodes.org 中进行设置。
我在尝试运行 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
git
建议做的,但我不愿意这样做,因为该命令听起来像是对遥控器做了什么。git gc --prune=now