我正在研究的回购原产地有数百个分支机构。
我偶然跑了git fetch
,现在我有数百个远程跟踪分支。
我想删除所有远程跟踪分支。我不想删除源上的分支,只删除本地环境中的远程跟踪分支。我也有本地分支机构,我正在管理,不希望删除我本地分支机构的远程跟踪分支。
我该怎么做?
答案 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