从Git中删除旧的远程分支

时间:2013-07-04 12:46:00

标签: git

当我在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

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

6 个答案:

答案 0 :(得分:121)

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

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

git remote prune <remote>

引用手册页或git remote

  

修剪

     

删除&lt; name&gt;下的所有陈旧跟踪分支。这些陈旧的分支有   已从&lt; name&gt;引用的远程存储库中删除,   但仍在“遥控器/&lt; name&gt;”中本地可用。

     

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

但是,根据您的问题,您似乎手动删除了.git/refs/remotes/theoldremote,因此Git不再了解远程跟踪分支所属的远程存储库。那不是你应该怎么做的。

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

git remote rm <remote>

这将从.git/config中移除遥控器,并将删除远程跟踪分支。

如果您只是删除.git/refs/remotes/下的目录,分支将留在后面。然后您需要手动删除它们:

git branch -rd <remote>/<branchname>

您需要选项-r才能删除远程分支。

答案 1 :(得分:16)

我用

git push origin :remote_branch

从服务器中删除分支。

git remote prune origin

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

答案 2 :(得分:6)

注意:虽然git remote prune是答案,但要知道,从git 2.0.1开始(2014年6月25日),git remote rm 首先删除远程跟踪分支
所以希望,人们不应该在git remote rm之后清理旧的分支。

commit 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

答案 3 :(得分:4)

nothing 推送到分支以删除它:

git push remote :remote_branch

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

或者我误解了你的问题?

答案 4 :(得分:4)

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

git remote prune theremote
git remote rm theremote
git gc --prune=now
之后,他们从列表中消失了。不知怎的,在我猜之前我没有正确删除它们。

答案 5 :(得分:0)

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

$ git branch --all

以下命令为我修复了此问题(在git版本2.25.0上):

$ git remote update --prune