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

cmc*_*nty 719 git branch remote-branch

在我目前的回购中,我有以下输出:

$ git branch -a
* master
  remotes/origin/master
  remotes/public/master
Run Code Online (Sandbox Code Playgroud)

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

$ git branch -d remotes/public/master
error: branch 'remotes/public/master' not found.
Run Code Online (Sandbox Code Playgroud)

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

$ git remote show 
origin
Run Code Online (Sandbox Code Playgroud)

如何从分支列表中删除"remotes/public/master"?

更新,尝试了git push命令:

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
Run Code Online (Sandbox Code Playgroud)

Ken*_*ric 722

您可能需要清理

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

或者你可能需要修剪

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

修剪

删除<name>下的所有陈旧跟踪分支.这些陈旧的分支已从<name>引用的远程存储库中删除,但仍在"remotes/<name>"中本地可用.

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

但是,看起来这些应该早点用

git remote rm public 
Run Code Online (Sandbox Code Playgroud)

R M

删除名为<name>的远程.将删除远程的所有远程跟踪分支和配置设置.

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

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

建议背景

如果您查看修订日志,您会注意到我提出了更多"正确"的技术,这些技术无论出于什么原因都不想在其存储库中运行.

我怀疑OP做了一些让他们的树处于不稳定状态的东西,导致它表现得有点奇怪,并且git gc被要求修复左后方残骸.

通常 git branch -rd origin/badbranch足以用于核心本地跟踪分支,或者git push origin :badbranch用于核对远程分支,通常永远不需要呼叫git gc

  • 这里不需要`git gc`,但是`git remote prune`让我感觉比使用`git branch -rd`手动删除东西更安全,因为git正在验证哪些远程分支已完成. (39认同)
  • 我不想删除远程端的分支.我认为有一个微妙的区别. (4认同)
  • 这对我不起作用 - 然而''git branch -rd'运行正常. (3认同)
  • 呃,问题是有效地问"如何删除远程分支".那就是那些路径. (2认同)

Paw*_*ari 670

你需要做的就是

git fetch -p
Run Code Online (Sandbox Code Playgroud)

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

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

git config fetch.prune true
Run Code Online (Sandbox Code Playgroud)

要么

git config --global fetch.prune true
Run Code Online (Sandbox Code Playgroud)

  • 我正在寻找一种删除相应遥控器已被删除的本地分支的方法,但这对我不起作用.知道为什么吗? (22认同)
  • 这将删除远程/来源中列出的分支,但不会删除本地跟踪分支,这同样重要. (10认同)
  • 这也是我一直在寻找的 - 问题是描述一个比普通场景更复杂的场景. (7认同)

Ala*_*avi 315

git push public :master
Run Code Online (Sandbox Code Playgroud)

这将删除名为masterKent Fredric指出的远程分支.

列出远程跟踪分支:

git branch -r
Run Code Online (Sandbox Code Playgroud)

要删除远程跟踪分支:

git branch -rd public/master
Run Code Online (Sandbox Code Playgroud)

  • `git branch -rd removed_remote/branch`为我工作,而`git gc --prune = now`毫无价值. (9认同)
  • 这帮我删除了一个git-svn远程ghost分支. (6认同)
  • `git branch -rd public/master`就是我所缺少的.我有`heroku/master`和`herkou/master` ... lol woops (3认同)
  • 我已经能够使用`git prune`而没有任何问题,但我的同事分叉我们的主要回购**只能使用`git branch -rd public/master`式解决方案来清理他的环境. (2认同)

jps*_*ain 156

你需要做的就是

$ git branch -rd origin/whatever 
Run Code Online (Sandbox Code Playgroud)

就这么简单.没有理由在这里打电话给gc.

  • @Thufir这不是这个问题的内容.此问题特别适用于本地存储库中存在无效远程引用但远程服务器上不再存在该分支的情况.你的问题的答案是$ git push origin:无论如何 (14认同)
  • 如果你有一个很大的清理工作(许多悬空遥控器),你可以删除所有远程分支,例如`git branch -rd $(git branch -r)`然后通过执行获取来重新建立有效的分支. (6认同)
  • 嘿,这是正确的答案.尼斯.谢谢. (5认同)
  • 这个答案是*正确的......认真的 (3认同)

ton*_*roo 70

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

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

git remote prune origin#如果那是远程源

是你想要的

  • @Casey $ git gc#确实像git文件的碎片整理一样加速了资源库$ git远程剪枝源#将清除删除显示"git branch -r | grep origin"的陈旧远程分支.这就是我相信的问题.所以,命令完全不同. (6认同)

chr*_*ris 29

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

$ git remote add public http://anything.com/bogus.git
$ git remote rm public
Run Code Online (Sandbox Code Playgroud)


Tho*_*ner 7

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

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

  • 今天我了解到这个压缩引用文件是作为“git gc”的一部分创建的,当它将您的提交打包到高度压缩的存档中时,它还将引用移动到单个纯文本文件中,可能是出于优化目的;我希望 git 的未来版本可以 `git br -D ...` 打包参考。 (2认同)