仅限本地更改 - 如何在没有相应本地分支的情况下删除所有远程跟踪分支?

时间:2018-02-15 00:56:03

标签: git shell

我正在研究的回购原产地有数百个分支机构。

我偶然跑了git fetch,现在我有数百个远程跟踪分支。

我想删除所有远程跟踪分支。我不想删除源上的分支,只删除本地环境中的远程跟踪分支。我也有本地分支机构,我正在管理,不希望删除我本地分支机构的远程跟踪分支。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

{ git for-each-ref refs/heads --format='delete %(upstream)';
  git for-each-ref refs/remotes --format='delete %(refname)';
} | grep ^delete\ refs/remotes | sort | uniq -u | git update-ref --stdin

因此,为每个分支的上游和每个远程跟踪引用生成delete-the-ref命令。任何重复的遥控器都是某个分支机构的上游,不想删除它们(编辑:并且不想删除本地上游!),因此grep ^refs/remotes | sort | uniq -u只输出不需要的遥控器#39; t显示在两个列表中。 git update-ref --stdin实际上有一个小命令语言可以有效地处理怪物批次的更新。

答案 1 :(得分:0)

在MacOS上,如果不存在相应的本地分支,则以下shell脚本将删除所有远程跟踪分支。 (来自此answer的修改后的脚本)

branch_not_delete=( "master" "develop")

for branch in `git for-each-ref refs/remotes/origin --format '%(refname:short)' | grep -v HEAD`;  do
    branch_name="$(awk '{gsub("origin/", "");print}' <<< $branch)"
    local_exists="$(git rev-parse --verify $branch_name 2> /dev/null)"

    if [[ -z "${local_exists// }" ]]; then
      if ! [[ " ${branch_not_delete[*]} " == *" $branch_name "* ]]; then
        git branch -d -r origin/$branch_name
      fi
    fi
done