git fetch prune无效

时间:2014-01-23 19:27:48

标签: git fetch git-remote

我有一堆被删除的远程分支,现在我想在本地删除分支。我试过了:

git fetch -p

但它不起作用。

如果我这样做:

git branch -r

git branch

列表不一样,因为git branch仍会列出已删除的远程分支,即使在我运行git fetch -p之后也是如此。我已经看到这是在这里的很多问题中做到这一点的公认答案,但它对我不起作用。

我不确定我是否正确地说明了这个问题,所以这是另一种解释。说我有:

  

GitHub :(远程)
  分支A
  分支B
  分支C

     

本地:
   分支A ==> (远程)分支A
   分支B ==> (远程)分支B
   分支C ==> (远程)分支C

现在有人在GitHub上删除了一个分支,给出了:

  

GitHub :(远程)
  分支A
  分支C

我希望我的本地仓库看起来像是:

  

本地:
   分支A ==> (远程)分支A
   分支C ==> (远程)分支C

2 个答案:

答案 0 :(得分:11)

要展开hobbs' commentgit fetch -p(或git remote prune或任何类似命令),只会从您的存储库中删除遥控器上不再存在的每个“远程分支”。

如果你已经创建了一个本地分支,那么除非你手动删除它,否则该标签不会消失。

例如,假设在远程origin上有一个名为sparkly的分支:

$ git fetch
...
 * [new branch]      sparkly    -> origin/sparkly

此时您没有名为sparkly的分支(除非您已有分支!);您origin/sparkly(位于单独的名称空间refs/remotes/而不是refs/heads/)。

如果您之前创建了自己的名为sparkly的分支,则可能无法跟踪此新origin/sparkly。如果您现在创建自己的名为sparkly 的分支,它将跟踪origin/sparkly

但在这两种情况下,都不会自动删除它。你必须手动完成。

一个原因:不能保证只因为origin/sparkly消失了,就完成了它(“它”是你创建的本地分支,可能是也可能不是跟踪这个远程分支)。如果git删除了您的标签以及origin/版本,那么您所处理的任何提交可能都很难找到。

所以,简短的回答是:你必须手动(或半手动,你可以随意自动化)。使用:

git branch -d sparkly

只有在“安全”(git认为:-))或者:

时才删除它
git branch -D sparkly

即使git认为这是“不安全”也要删除它。

答案 1 :(得分:6)

要在本地“忘记”,删除你可以做的远程分支

git remote prune myRemote

(编辑以考虑评论)

现在,要删除您当地的分支机构,您也可以

remote=origin

for branch in $(git branch | sed 's/\*//'); do                          
  if [ -z "$(git branch --all | grep $remote | grep $branch)" ]; then   
    git branch -D $branch  
  fi                                                                    
done                    

如果您打算经常进行此类操作,可以将其放在PATH的脚本中,将其命名为git-delete-local-to-sync,然后在您的仓库中输入{{1} }