从Git中删除旧的远程分支

93
当我在Git中使用bash自动完成时,它仍然显示我不再拥有的旧远程分支。当我执行git branch -la时,它会显示那些旧的远程分支,而git branch -l则不会。ls .git/refs/remotes/也会显示它们。但是,在我的.git/config中并没有它们,并且当我运行git remote show时也不会显示它们。
那么,我该如何摆脱它们,因为我的自动完成列表现在太长了。
我已经尝试过:
git reflog expire --expire=now --all
git gc --prune=now
rm .git/refs/remotes/theoldremote
git remote prune theoldremote

我也知道我可以重新克隆该存储库,但那只是作弊 ;-)


注意:现在(git 2.0.1,2014年6月)git remote rm首先会删除远程跟踪分支。这应该有助于避免清理旧分支。请参见我的答案 - VonC
https://dev59.com/Gmoy5IYBdhLWcg3wHabt - Dan K.K.
这是我的另一个答案:https://dev59.com/rnA75IYBdhLWcg3wo6vx#44129766 - Arif
6个回答

153

如果远程分支在远程仓库中被删除,Git 不会自动删除(本地的)远程跟踪分支。此外,在 V2.0.1 之前,当你从 git 配置中删除远程时,有时候远程跟踪分支不会被删除(参见 VonC 的答案)。

要删除某个远程仓库的过期远程跟踪分支(已在远程仓库中删除的分支),请运行:

git remote prune <remote>

关于引用 man 页面或 git remote:

prune

删除 <name> 下所有过时的跟踪分支。这些过时的分支已经从 <name> 引用的远程存储库中删除,但仍然在 "remotes/<name>" 中可用。

使用 --dry-run 选项报告将要被修剪的分支,但不会实际执行修剪操作。

但是,由于您手动删除了 .git/refs/remotes/theoldremote,因此 Git 不再知道远程跟踪分支所属的远程存储库。这不是您应该采取的方式。

正常删除远程存储库的方法是运行:

git remote rm <remote>

这将从你的 .git/config 中删除远程,并删除远程跟踪分支。

如果你只删除 .git/refs/remotes/ 下的目录,那么分支将会留下。然后你需要手动删除它们:

git branch -rd <remote>/<branchname>

你需要使用选项-r来删除远程分支。


2
不对,它说“致命错误:'kolichikov' 不是一个 git 仓库”。 - Alex
2
有关在获取/拉取时自动修剪远程分支,请参见:https://dev59.com/V2Ml5IYBdhLWcg3winkW#18718936 - Patrick James McDougle
如果你觉得这个速度慢的话,可以升级到新版本的Git(2.0.1+,如果我没记错的话),这个问题已经被解决了(速度提高了100倍以上)。 - odinho - Velmont
提醒修剪用户:Git文档说:“在大多数情况下,用户应该运行git gc,它会调用git prune。”但请注意,git gc--dry-run不兼容。 - JYL
“git branch -rd <remote>/<branchname>” 是我正在寻找的。谢谢! - Antoine Colson

17

我使用

git push origin :remote_branch

从服务器中删除一个分支。

git remote prune origin

删除那些服务器上不存在的远程引用


不对,它说“致命错误: 'kolichikov' 不是一个 Git 仓库”。 - Alex
1
Alex,你必须在存储库文件夹内运行命令,而不是在你的主文件夹中... - SparK
我的工作效果非常好;接下来我还清理了一些过期的分支 :-) - Murphy

6
注意:虽然git remote prune是解决方法,但要知道,从git 2.0.1(2014年6月25日)开始,git remote rm会首先删除远程跟踪分支。因此,希望在使用git remote rm后不必清理旧分支。
请参见提交 b07bdd3,由Jens Lindström (jensl)提供。
remote rm:将远程配置作为最后一步删除
当删除远程时,在删除远程配置之前删除远程跟踪分支。这样,如果在删除远程跟踪分支时操作失败或中止,可以重新运行命令以完成操作。

但如果必须的话,一个简单的git fetch就足够了,前提是你已经设置好了:

git config --global fetch.prune true
cd /path/to/repo
git config remote.origin.prune true

请参阅 https://github.com/git/git/commit/c9e768bb77762765f739fffb5c09d0888f3de20e。 - VonC

5

nothing推送到分支以删除它:

git push remote :remote_branch

这在文档中有提到,但并不是很明显。

或者我误解了你的问题?


3
“它在文档中的某个地方,但并不是很明显。” 这就是 git - mnagel
我所说的“remote”是指您的远程存储库名称,例如“origin”或其他名称。但我开始觉得您的意思不仅仅是删除远程分支。 - aragaer
类似这样的其他内容:https://dev59.com/I3NA5IYBdhLWcg3wKaYx - aragaer

4

好的,我明白了。问题在于远程库不再存在,但它们确实还在git数据库中的某个地方。我重新添加了远程库,然后执行了

git remote prune theremote
git remote rm theremote
git gc --prune=now

之后它们就从列表中消失了。我想可能是之前没有正确地将它们删除。

我尝试了很多来源的方法,唯一有效的方法是重新添加有问题的远程,然后再将其删除。谢谢! - jc00ke

1

当我运行以下命令时,远程分支在服务器端已被删除,但仍然出现时,我感到困惑:

$ git branch --all

以下命令对我很有帮助(在git版本2.25.0上):
$ git remote update --prune

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接