使用git远程修剪原点,我可以删除不在远程上的本地分支。
但是我还想删除从这些远程分支创建的本地分支(检查它们是否未合并会很好)。
我该怎么做呢?
使用git远程修剪原点,我可以删除不在远程上的本地分支。
但是我还想删除从这些远程分支创建的本地分支(检查它们是否未合并会很好)。
我该怎么做呢?
当前回答
我到达这个页面,寻求“如何删除不再有上游分支的本地签出分支”的答案。
我也不关心本地分支是否已经被合并,因为管道到git branch -d只会发出警告,而不是删除未合并的本地分支。
git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3 | egrep -v -f /dev/fd/0 <(git branch -a | grep -v origin) | grep branch_prefix_that_I_care_about | xargs git branch -d
# translation
# git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3
## this finds all remote branch names minus the "remote/origin/" part
#
# <(git branch -a | grep -v origin)
## this finds all local branch names and redirects it into the previous command
#
# egrep -v -f /dev/fd/0 STUFF
## this is doing some weird magic that I'm grokking as "take the set difference from whatever was piped in"
#
#
# overall translation: (STUFF TO CONSIDER) | egrep magic <(STUFF TO REMOVE FROM CONSIDERATION) | do cool things with resulting stuff
其他回答
使用@wisbucky答案的变体,我将以下内容作为~/的别名添加到~/。gitconfig文件:
pruneitgood = "!f() { \
git remote prune origin; \
git branch -vv | perl -nae 'system(qw(git branch -d), $F[0]) if $F[3] eq q{gone]}'; \
}; f"
这样,一个简单的git pruneitgood就可以清理合并后不再需要的本地和远程分支。
这个命令和下面的脚本可以在Linux和Windows中使用Git Bash (MinGW)。
最好使用git的内部命令,这样注释或名称就不会意外地匹配并删除您不想删除的分支。git for-each-ref的格式选项可以使用许多内部“原子”来输出所需的信息。这样,我们就不必依赖管道连接到awk或grep来检查输出中的正则表达式,因为它可能包含不必要的信息。
下面的命令只使用git for-each-ref的内部低级命令来列出孤立的本地分支。一旦你有了这些,你可以管道到git分支-D。此外,别忘了先修剪和获取远程引用,否则它将找不到任何匹配:
git fetch -p
git for-each-ref --format '%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)' 'refs/heads/**' | xargs -r git branch -D
以下是分类:
Git fetch -p -删除已删除的引用,并从远程获取新的引用
Git for-each-ref——format -列出使用特定输出格式的所有引用。
%(if: = =[gone])%(upstream:track) -仅在上游跟踪分支“[gone]”时输出。
%(then)%(refname:short)%(end) -输出分支名称(当跟踪消失时)。
Refs /heads/** -限制头部引用(为了提高效率)。
| xargs -r git分支- d管道输出作为参数删除。-r表示忽略空白输入。
就其本身而言,这个解很长,很难输入,也很难记住。幸运的是,向git添加自定义命令很容易。下面的脚本使用了上面的相同命令,但是它允许用户使用——dry-run选项查看将选择哪些分支。
我将我的文件命名为git-prune-local,并将其放在包含在PATH中的文件夹中。它还需要执行权限(chmod 755 git-prune-local)。
Git自动查找可执行文件,如Git -[command]。这样,你只需要输入git prune-local来删除正确的分支。
git-prune-local
#!/bin/sh
if [ $# -gt 1 ] || ([ ! -z $1 ] && [ $1 != "--dry-run" ])
then
echo "Usage: git prune-local [--dry-run]"
exit
fi
git fetch -p --quiet
branchesToDelete=$(git for-each-ref --format '%(if:equals=[gone])%(upstream:track)%(then)%(refname:short)%(end)' 'refs/heads/**')
while read -r branch
do
if [ ! -z $branch ]
then
if [ ! -z $1 ]
then
echo $branch
else
git branch -D $branch
fi
fi
done <<< "$branchesToDelete"
您可以使用该命令:
git branch --merged master | grep -v "\* master" | xargs -n 1 git branch -d
Git清洁:删除已经合并的分支,包括分解命令
可以配置Git在获取时自动删除对已删除的远程分支的引用:
git config --global fetch.prune true
当调用git fetch或git pull之后,对已删除的远程分支的引用将自动删除。
I wanted something that would purge all local branches that were tracking a remote branch, on origin, where the remote branch has been deleted (gone). I did not want to delete local branches that were never set up to track a remote branch (i.e.: my local dev branches). Also, I wanted a simple one-liner that just uses git, or other simple CLI tools, rather than writing custom scripts. I ended up using a bit of grep and awk to make this simple command, then added it as an alias in my ~/.gitconfig.
[alias]
prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -D
这是一个git配置-全局…命令可以方便地将其添加为git prune-branches:
git config --global alias.prune-branches '!git remote prune origin && git branch -vv | grep '"'"': gone]'"'"' | awk '"'"'{print $1}'"'"' | xargs -r git branch -d'
注意:对git分支使用-D标志可能非常危险。所以,在上面的config命令中,我使用-d选项来git分支而不是-d;我在实际配置中使用-D。我使用-D是因为我不想听到Git抱怨未合并的分支,我只是想让它们消失。您可能也需要这个功能。如果是这样,只需在配置命令的末尾使用-D而不是-D。