Git fetch prune无法正常工作

8
我有一堆远程分支被删除了,现在我想在本地删除这些分支。我尝试了:
``` git fetch -p ```
但它不起作用。
如果我执行:
``` git branch -r ```

``` git branch ```
列表不同,因为即使在运行 `git fetch -p` 之后,`git branch` 仍然列出已删除的远程分支。我在这里看到它是对于这个问题的接受答案,在相当多的问题中都可以使用,但对我来说却不起作用。
我不确定我是否正确地表达了问题,所以这里有另一个解释。假设我有:
``` GitHub: (remote) Branch A Branch B Branch C
Local: Branch A ==> (remote) Branch A Branch B ==> (remote) Branch B Branch C ==> (remote) Branch C ```
现在有人在 GitHub 上删除了一个分支,得到:
``` GitHub: (remote) Branch A Branch C ```
我希望我的本地 repo 看起来像这样:
``` Local: Branch A ==> (remote) Branch A Branch C ==> (remote) Branch C ```

你是否从正确的远程仓库获取?假设是 origin,请尝试使用 git fetch -p origin - Chris
如果 git branch(不带 -r)列出它们,则它们不是远程分支。 - hobbs
2个回答

19

针对hobbs'的评论进行解释,git 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 认为这是“不安全”的,也要删除它。


8
“在本地‘忘记’(即删除)远程分支,您可以执行以下操作。”
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,然后在您的仓库中,只需键入git delete-local-to-sync即可。

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