代码之家  ›  专栏  ›  技术社区  ›  Jez

修剪git分支

  •  1
  • Jez  · 技术社区  · 8 年前

    您可以使用以下方法修剪远程回购中不再存在的回购中的跟踪分支:

    git remote prune [remoteName]
    

    但是,这只会删除跟踪分支,而不会删除您另外设置的任何本地分支,例如:

    $ git branch
    * master
      some-remote-branch
    
    $ git remote prune origin
    Pruning origin
    URL: https://myserver.com/DefaultCollection/_git/Repo
     * [pruned] origin/some-remote-branch
    
    $ git branch
    * master
      some-remote-branch <-- non-tracking branch still here!
    

    是否有一种方法可以修剪与修剪后的跟踪分支关联的本地非跟踪分支,或者您总是必须手动删除这些分支?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Community Mohan Dere    6 年前

    git无法修剪删除跟踪分支的本地分支。

    删除本地非跟踪分支的常用方法是基于以下情况:

    情况1:git回购中有几个分支机构

    如果您的本地回购中有几个分支机构,您可以手动删除本地非跟踪分支机构。

    您可以使用命令 git branch -a 将远程跟踪分支与本地分支进行比较,然后手动删除相关分支。

    情况2:git回购中有很多分支机构

    如果git repo中有很多分支,或者不想手动比较和删除本地非跟踪分支,那么可以通过脚本自动删除本地非跟踪分支。

    下面是使用shell脚本自动删除本地非跟踪分支的示例(假设 master 分支不会被删除):

    #!/bin/sh
    
    git fetch -p
    #checkout HEAD to the branch which you will never delete, here as master won't be deleted
    git checkout master
    
    for local in $(git for-each-ref --format='%(refname:short)' refs/heads/)
    do
    {
      if [[ $(git branch -r) =~ $local ]]; then
        echo "local branch $local has related tracking branch"
      else
        git branch -D $local
      fi
    }
    done
    

    然后本地非跟踪分支将被自动删除。

    顺便说一句: 除了 git remote prune [remoteName] 要修剪跟踪分支,还可以使用 git fetch -p 修剪所有跟踪分支。

        2
  •  1
  •   Rudolf Tucek    8 年前

    这在git中是不可能的。

    Git的首要原则是避免意外删除数据。 如果您推送本地分支,而其他人(共同维护者)可能会(意外地)删除它,那么如果您运行 git remote prune 下次使用cmd(虽然您可以通过git的reflog恢复您的工作,但这是另一回事)。

    本地分支没有自动清理功能。如果您将分支A合并到分支B中,您可以观察到类似的行为。分支A仍然存在-即使在过时之后-并且您仍然必须手动删除它(再次-故意)。

    也就是说,你可以试试这样的( 请不要盲目复制并粘贴这段代码到你的命令行! )

    git branch --merged | xargs git branch -d 2>/dev/null

    这将删除所有 合并的 分支机构。 现在,理解合并是一个相对术语非常重要。合并是指本地分支的任何尖端,即 运行此命令的分支 .

    如果从主分支运行此操作,可能会得到所需的结果-所有过时/合并的分支(从主分支的角度来看)都将被删除-甚至可能会调用的分支 develop . 但是,如果您从其他分支运行此操作。。。不要因为我删除了以前合并的分支而责怪我。

    附言:你可以跑步 git fetch -p git fetch --prune . 这将删除所有过时的远程分支。 如果不想一直添加标志,可以将

    [fetch] prune = true

    进入~/。gitconfig

    推荐文章