git fetch prune无效

Chr*_*rry 6 git fetch git-remote

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

git fetch -p

但它不起作用.

如果我做:

git branch -r

和

git branch

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

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

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

Local:
    Branch A ==>(remote)Branch A
    Branch B ==>(remote)Branch B
    Branch C ==>(remote)Branch C

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

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

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

Local:
    Branch A ==>(remote)Branch A
    Branch C ==>(remote)Branch C.

tor*_*rek 14

要扩展hobbs的注释,git fetch -p(或git remote prune任何类似的命令)只从存储库中删除遥控器上不再存在的每个"远程分支".

如果您已经建立了本地分支,那么除非您手动删除该标签,否则该标签不会消失.

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

$ git fetch
...
 * [new branch]      sparkly    -> origin/sparkly
Run Code Online (Sandbox Code Playgroud)

你没有sparkly这个名字的分支(除非你已经有一个!); 你只能有origin/sparkly(其中住在一个独立的名字空间,refs/remotes/而不是refs/heads/).

如果您之前创建了自己的分支sparkly,则可能不会跟踪此新分支origin/sparkly.但是,如果你创建了一个名为sparkly now的分支,它将跟踪origin/sparkly.

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

原因之一是:不能保证只是因为origin/sparkly已经消失了,你就完成了它("它"是你创建的本地分支,它可能跟踪也可能不跟踪这个远程分支).如果git删除了您的标签以及origin/版本,那么您正在进行的任何提交都可能变得非常难以找到.

因此,简短的回答是:您必须手动执行此操作(或半手动执行此操作,您可以根据需要自动执行此操作).使用:

git branch -d sparkly
Run Code Online (Sandbox Code Playgroud)

只有在"安全"(在git看来:-))中删除它,或者:

git branch -D sparkly
Run Code Online (Sandbox Code Playgroud)

即使git认为这是"不安全"也要删除它.


gtu*_*rri 6

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

git remote prune myRemote
Run Code Online (Sandbox Code Playgroud)

(编辑以考虑评论)

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

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                    
Run Code Online (Sandbox Code Playgroud)

如果您打算经常进行这种操作,可以将它放在您的脚本中PATH,调用它git-delete-local-to-sync,然后在您的仓库中,只需输入git delete-local-to-sync