如何从Git中删除无效的远程分支引用?

在我当前的repo中,我有以下输出:

$ git branch -a* masterremotes/origin/masterremotes/public/master

我想从分支列表中删除remotes/public/master

$ git branch -d remotes/public/mastererror: branch 'remotes/public/master' not found.

此外,git remote的输出很奇怪,因为它没有列出public

$ git remote showorigin

如何从分支列表中删除“远程/公共/主”?

更新,尝试git push命令:

$ git push public :masterfatal: 'public' does not appear to be a git repositoryfatal: The remote end hung up unexpectedly
318982 次浏览

您可能需要清理:

git gc --prune=now

或者你可能需要修剪:

git remote prune public

修剪

删除下的所有过期跟踪分支。这些过期分支已经从引用的远程存储库中删除,但仍然在“远程/”中本地可用。

使用--dry-run选项,报告哪些分支将被修剪,但不要实际修剪它们。

然而,这些似乎应该在更早的时候被清理干净

git remote rm public

rm

删除名为的远程。远程的所有远程跟踪分支和配置设置已删除

因此,可能是您手动编辑了配置文件,但这并没有发生,或者您有权限问题。

也许再运行一次,看看会发生什么。


建议上下文

如果你看一下修订日志,你会注意到我建议了更多“正确”的技术,无论出于什么原因,这些技术都不想在他们的存储库上工作。

我怀疑OP做了一些让他们的树处于不一致状态的事情,导致它的行为有点奇怪,并且需要git gc来修复留下的杂物。

通常git branch -rd origin/badbranch足以对本地跟踪分支进行去核,或git push origin :badbranch用于对远程分支进行去核,通常您将从未需要调用git gc

git push public :master

正如Kent Fredric所指出的那样,这将删除名为master的远程分支。

要列出远程跟踪分支:

git branch -r

要删除远程跟踪分支:

git branch -rd public/master

git gc --prune=now不是你想要的。

git remote prune public

或者git remote prune origin#如果这是远程源

就是你想要的

当裁判被打包时,接受的答案对我不起作用。但是:

$ git remote add public http://anything.com/bogus.git$ git remote rm public

你所要做的就是

$ git branch -rd origin/whatever 

It's that simple. There is no reason to call a gc here.

你所要做的就是

git fetch -p

它将删除所有被远程删除的本地分支。

如果您使用的是git 1.8.5+,则可以自动设置

git config fetch.prune true

git config --global fetch.prune true

我也遇到过类似的问题。没有一个答案有帮助。在我的例子中,我有两个已删除的远程存储库永久显示。

我最后的想法是手动删除对它的所有引用。

假设存储库称为“Repo”。我做了:

find .git -name Repo

所以,我从. git文件夹(此文件夹可以在您的Rails应用程序或您的计算机上找到https://stackoverflow.com/a/19538763/6638513)中删除了相应的文件和目录。

然后我做了:

grep Repo -r .git

这发现了一些文本文件,我删除了相应的行。现在一切似乎都很好

通常,你应该把这份工作留给git。

git push origin --delete <branch name>

引用自:http://www.gitguys.com/topics/adding-and-removing-remote-branches/

在我的例子中,我试图删除保存在.git/packed-refs中的条目。您可以编辑这个纯文本文件并从中删除git br -D不知道如何触摸的条目(至少在1.7.9.5)。

我在这里找到了这个解决方案:https://stackoverflow.com/a/11050880/1695680

我不知道git branch -rd,所以我为自己解决此类问题的方法是将我的存储库视为远程存储库并进行远程删除。git push . :refs/remotes/public/master.如果其他方法不起作用,并且你有一些奇怪的引用想要摆脱,这种原始方法是万无一失的。它为您提供了删除(或创建!)任何类型的引用的精确精度。

只是稍微相关,但在与我们相同的情况下可能会有所帮助-我们为远程存储库使用网络文件共享。上周一切正常,本周我们收到错误“远程源没有为分支ref/head/master通告Ref。此Ref可能不存在于远程中,或者可能被权限设置隐藏”

但我们认为没有采取任何措施来破坏这些东西。NFS做快照,所以我回顾了每个“以前的版本”,发现三天前,存储库的大小从282MB增加到33MB,现在大约有1403个新文件和300个文件夹。我询问了我的同事,那天有一个人试图做推送,然后取消了它。

我使用NFS“恢复”功能将其恢复到该日期之前,现在一切都恢复正常。我之前尝试过修剪,似乎没有帮助。也许更严厉的清理会奏效。

希望有一天能帮助别人!

Jay

不确定我是如何陷入困境的,但我的错误消息略有不同:

> git remote> git branchwarning: ignoring broken ref refs/remotes/origin/HEAD* main
>

但是我能够通过稍微重新解释这个页面上其他地方的修复来修复它。我的意思是,我用关键字HEAD替换了<remote>/<branch>中的分支名称。人们提到的其他建议都没有奏效(gcprune等),所以我已经没有想法了,希望能有最好的结果。不管怎样,它起作用了:

> git remote
> git branch -rd origin/HEADDeleted remote-tracking branch origin/HEAD (was refs/remotes/origin/main).

> git branch
* main
>

我尝试了这里的所有方法,但没有任何效果。如果所有其他方法都失败了,请从文本文件“. git/pack ping-refs”中删除违规分支,然后从“. git\refs\Remote tes\的目录中删除违规分支。