86

当我在 Git 中使用 bash 自动完成功能时,它不断向我显示我不再拥有的旧遥控器的分支。当我这样做时,git branch -la它会显示那些旧的遥控器和分支,而git branch -l不会显示。Als .git/refs/remotes/也显示了它们。但是,它们不存在于我的.git/config中,并且在我运行 .git/config 时也不显示它们git remote show

那么我该如何摆脱它们,因为我的自动完成列表现在太长了。

我已经尝试过:

git reflog expire --expire=now --all
git gc --prune=now
rm .git/refs/remotes/theoldremote
git remote prune theoldremote

我也知道我可以重新克隆回购但那只是作弊;-)

4

6 回答 6

148

如果分支在远程存储库中被删除,Git 不会自动删除(本地)远程跟踪分支。此外,在 V2.0.1 之前,当您从 git 配置中删除远程时,在某些情况下不会删除远程跟踪分支(请参阅 VonC 的答案)。

要为您的远程存储库之一删除过时的远程跟踪分支(在远程存储库中删除的分支),请运行

git remote prune <remote>

引用手册页或git remote

修剪

删除 <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删除远程分支。

于 2013-07-04T13:42:04.550 回答
16

我用

git push origin :remote_branch

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

git remote prune origin

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

于 2013-07-04T13:07:07.233 回答
6

Note: while git remote prune is the answer, know that, starting with git 2.0.1 (June 25th, 2014), a git remote rm starts by removing the remote tracking branches.
So hopefully, one shouldn't have to cleanup old branches after a git remote rm.

See commit b07bdd3 by Jens Lindström (jensl)

remote rm: delete remote configuration as the last

When removing a remote, delete the remote-tracking branches before deleting the remote configuration.
This way, if the operation fails or is aborted while deleting the remote-tracking branches, the command can be rerun to complete the operation.


But if you have to, a simple git fetch can be enough, provided you have set first:

git config --global fetch.prune true
cd /path/to/repo
git config remote.origin.prune true
于 2014-07-27T18:58:59.440 回答
5

不向分支推送任何内容以将其删除:

git push remote :remote_branch

它在文档中的某个地方,但并不是很明显。

还是我误解了你的问题?

于 2013-07-04T12:47:47.870 回答
4

好的,我知道了。问题是遥控器不再存在,但它们在 git 数据库中的某个地方存在。我重新添加了遥控器,然后做了

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

之后,它们从列表中消失。不知何故,在我猜测之前我没有正确删除它们。

于 2013-07-04T14:11:07.947 回答
0

当我运行时仍然出现在服务器端已删除的远程分支时,我感到困惑:

$ git branch --all

以下命令为我解决了这个问题(在 git 版本 2.25.0 上):

$ git remote update --prune
于 2020-02-20T02:40:18.913 回答