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


731

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

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

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

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

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

$ git remote show 
origin

如何从分支机构列表中删除“ 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

31
难道git remote prune [remote-name]还是git fetch -p [remote-name]没有在方案中工作吗?这样做git gc比通常需要的强大得多。
rjmunro 2012年

6
git remote prune [remote-name]不能与git svn一起使用,尽管git gc... git branch -rd origin/name也不起作用。@Casey,您可能应该选择第二个答案-危险性稍小。
naught101

4
我喜欢这个问题。几乎每个月回来
oluckyman

相关(如果不是重复目标):在本地和远程删除Git分支

2
为避免将来出现n00b乱码错误,我建议使用不同于...的示例分支master,尤其是在远程删除时。
2016年

Answers:


743

您可能需要清理:

git gc --prune=now

否则您可能需要修剪:

git remote prune public

修剪

删除<名称>下的所有过时的跟踪分支。这些过时的分支已从<name>引用的远程存储库中删除,但仍可在本地使用“ remotes / <name>”。

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

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

git remote rm public 

R M

删除名为<name>的远程服务器。远程的所有远程跟踪分支和配置设置都将被删除。

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

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


咨询上下文

如果您查看修订日志,您会注意到我建议了更多的“正确”技术,无论出于何种原因,它们都不希望在其存储库中使用。

我怀疑OP所做的某些事情使他们的树处于不一致状态,从而导致其行为有些奇怪,git gc并被要求修复左后叉。

通常 git branch -rd origin/badbranch是足够的摧毁当地的跟踪分支,或者git push origin :badbranch为的摧毁远程分支,通常你将永远需要调用git gc


4
我不想删除远端的分支。我认为有细微的差别。
cmcginty

2
嗯,问题实际上是在询问“我如何删除远程分支”。那就是那些路径。
肯特·弗雷德里克

1
如果可以更清楚地说明我要问的内容,我将重述该主题,但命令将准确显示我的问题所在。
cmcginty

40
git gc不需要在这里,但是git remote prune比起用手动删除东西,我感到更加安全git branch -rd,因为git正在验证完成了哪些远程分支。
Mike Seplowitz

3
这对我不起作用-但是'git branch -rd'正常。
dsummersl 2012年

683

您需要做的就是

git fetch -p

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

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

git config fetch.prune true

要么

git config --global fetch.prune true

7
这也是我一直在寻找的-问题是描述一种比普通情况更复杂的情况。
rjmunro 2012年

22
我正在寻找一种删除本地分支的方法,在该分支中已删除了相应的遥控器,但这对我不起作用。知道为什么吗?
jackocnr

11
这将删除远程/来源中列出的分支,但不会删除本地跟踪分支,这同样重要。
BlueRaja-Danny Pflughoeft 2014年

@Cupcake由于您没有回滚我的第一个编辑(正在修复有关Git 1.8.5+的错误信息),因此您现在已经使此错误。我的第二个编辑是修复我输入的不正确内容,该内容现在又存在(通过回滚)。请继续并回滚一个编辑,以保留原始内容。谢谢。
ferventcoder 2014年

@ferventcoder我仔细检查了您的上一次编辑,然后回滚到它。如果OP不喜欢,则可以再次回滚。谢谢。

319
git push public :master

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

列出远程跟踪分支机构:

git branch -r

删除远程跟踪分支:

git branch -rd public/master

6
这帮助我删除了git-svn远程幽灵分支。
尼克(Nick)

9
git branch -rd removed_remote/branch为我工作,而那git gc --prune=now一文不值。
rchampourlier

2
我已经可以使用了,git prune没有任何问题,但是分叉​​我们主要仓库**只能**的同事使用git branch -rd public/master-style解决方案来清理环境。
亚伯

3
git branch -rd public/master是我所缺少的。我heroku/masterherkou/master...笑woops
阿伦

@rchampourlier并非100%一文不值-如果您的git repo很大,则在某些情况下,删除未使用的分支可以释放大量磁盘空间。
peterh-恢复莫妮卡

159

您需要做的就是

$ git branch -rd origin/whatever 

就这么简单。没有理由在这里调用gc。


1
你如何“推”删除到github?
Thufir

14
@Thufir这不是这个问题。此问题专门用于当您在本地存储库中具有无效的远程引用但该分支在远程服务器上不再存在的情况。您的问题的答案是$ git push origin:whatever
jpswain 2012年

是的,如果在删除分支的远程仓库上发生了什么,但是您仍然引用了本地计算机上的该远程分支,那么您将需要执行我在原始答案中所做的操作以对其进行清理。
jpswain 2012年

6
如果您的清理工作量很大(许多悬而未决的远程控制器),则可以使用类似的方法删除所有远程分支,git branch -rd $(git branch -r)然后通过提取来重新建立有效的分支。
nobar 2012年

我的情况是我曾经git config -e重命名遥控器。我将遥控器重命名mineorigin。然后,这是最适合我的解决方案:git branch -rd $(git branch -r | grep 'mine/')
史蒂文·卢

70

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

git remote prune public

git remote prune origin#如果多数民众赞成在远程源

是你想要的


6
@Casey $ git gc#确实对git文件进行了碎片整理,以加快存储库的速度。那就是我所问的问题。因此,命令完全不同。
特伦露

29

装好裁判后,可接受的答案对我不起作用。但是这样做:

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

为我工作。常规git branch -d无法正常工作,返回错误分支不存在的错误,因为我直接在.git / config文件中删除了错误创建的名为“ original”的来源。
micrub

这是我必须使用的方法,以删除由于疏忽而从我的.git / config中遗漏的分支(由于不相关的损坏而不得不重新构建)。太糟糕了,这个答案太遥远了,以至于直到最后我找到解决方案并将其添加到接受的答案中时,我才注意到它!
taranaki

这是使用svn2git之后需要的。有很多的remotes / svn / *分支机构。必须先创建一个假的“ svn”遥控器。
山姆

7

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

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


哇,这对我有帮助。我的同事尝试过,重新启动VS,重新启动计算机无济于事,他删除了本地存储区并拉出所有内容以消除此问题:)
Esen

1
今天,我倾向于将此打包引用文件创建为的一部分git gc,当将提交内容打包到高度压缩的存档中时,它还会将引用移动到单个纯文本文件中,这可能是出于优化目的。我希望git的将来版本可以git br -D ...打包引用。
ThorSummoner 2015年


3

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


2

只是略微相关,但在与我们相同的情况下仍可能有所帮助-我们将网络文件共享用于远程存储库。上周一切正常,本周我们收到错误消息“远程来源未为分支机构refs / heads / master发布广告Ref。该Ref可能不存在于远程中,或者可能被权限设置隐藏了”

但是我们认为,对破坏事物没有做任何事情。NFS会快照,因此我查看了每个“以前的版本”,发现三天前,存储库的MB大小已从282MB变为33MB,现在大约存在1,403个新文件和300个文件夹。我询问了我的同事,那天有人试图进行推-然后取消了。

我使用NFS的“还原”功能将其还原到该日期之前,现在一切正常。我以前确实尝试过修剪,似乎没有帮助。也许进行更严格的清理会奏效。

希望有一天能对别人有所帮助!

杰伊


2

我有一个类似的问题。没有答案有帮助。就我而言,我有两个永久删除的远程存储库。

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

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

find .git -name Repo 

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

然后我做了:

grep Repo -r .git

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

通常,您应该将此工作留给git。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.