==> git branch -a
* master
test
remotes/origin/master
remotes/origin/test
Run Code Online (Sandbox Code Playgroud)
当有人删除时remotes/origin/test,我仍然可以在我的电脑上看到它.
我知道我可以这样做并删除 test
==> git remote prune
==> git branch -d test
==> git branch -a
* master
remotes/origin/master
Run Code Online (Sandbox Code Playgroud)
但是如果我有更多本地分支,并且它们不在远程,那么我怎样才能快速删除它们?
小智 33
这是我删除不再相关的本地分支的方法:
git branch --merged origin/master | xargs git branch -d
Run Code Online (Sandbox Code Playgroud)
您可能需要根据您的特定配置进行调整,但管道之前的第一个命令应该为您提供已合并到主分支中的所有本地分支的列表.
twa*_*erg 18
根据git-fetch手册页,git fetch -p将"取出后,删除遥控器上不再存在的任何远程跟踪分支.如果您有本地分支跟踪这些远程分支,您可能需要手动修剪它们.
kcm*_*kcm 10
简单的剪枝不会删除本地分支.
这是实现真正删除的另一种方法.请务必先执行"git fetch -p"以获取远程存储库的最新状态.
git branch -vv | grep ': gone]'| grep -v "\*" | awk '{ print $1; }' | xargs -r git branch -d
Run Code Online (Sandbox Code Playgroud)
这将检查所有本地分支及其来源,并将删除其原始删除的所有本地分支.
详细地:
git branch -vv
Run Code Online (Sandbox Code Playgroud)
将列出您的本地分支并显示有关远程分支的信息,如果它不再存在则说"已消失".
grep ': gone]'
Run Code Online (Sandbox Code Playgroud)
将获取与"gone"短语匹配的分支.
grep -v "\*"
Run Code Online (Sandbox Code Playgroud)
将仅获取不包含星号的行.这将忽略您当前所在的分支,并且还会阻止"git branch -d"在末尾以"*"执行,这将导致删除所有本地分支
awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)
将获取输出,直到第一个空格,这将导致本地分支名称.
xargs git branch -d
Run Code Online (Sandbox Code Playgroud)
将使用输出(分支名称)并将其附加到"git branch -d"命令以最终删除分支.如果您还想删除未完全合并的分支,可以使用大写"D"而不是"d"来强制删除.
Kar*_*bur 10
我最终得到了与kcm的方法非常相似的方法。我想要一些可以清除跟踪远程分支的所有本地分支的东西,在 上origin,远程分支已被删除 ( gone)。我不想删除从未设置为跟踪远程分支的本地分支(即:我的本地开发分支)。另外,我想要一个简单的单行代码git,只使用 或其他简单的 CLI 工具,而不是编写自定义脚本。我最终使用了一些grep和awk来制作这个简单的命令,然后将其添加为我的~/.gitconfig.
[alias]
prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -D
Run Code Online (Sandbox Code Playgroud)
这是一个git config --global ...可以轻松将其添加为的命令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'
Run Code Online (Sandbox Code Playgroud)
注意:正如Matteo在之前对另一个答案的评论中指出的那样,使用-D标志 togit branch可能非常危险。因此,在配置命令中,我使用选项-dtogit branch而不是-D; -D我在实际配置中使用。我使用它是-D因为我不想听到 Git 抱怨未合并的分支,我只是希望它们消失。您可能也需要此功能。如果是这样,只需在该配置命令的末尾使用-D而不是。-d
为此,我编写了一个简单的 shell 脚本git-dangling-branches。如果您指定-D选项,它将删除所有没有refs/remotes/origin/<branch_name>. 当然,这样做时你应该小心。
#!/bin/bash -e
if [[ "$1" == '-D' ]]; then
DELETE=1
else
DELETE=0
fi
REMOTE_BRANCHES="`mktemp`"
LOCAL_BRANCHES="`mktemp`"
DANGLING_BRANCHES="`mktemp`"
git for-each-ref --format="%(refname)" refs/remotes/origin/ | \
sed 's#^refs/remotes/origin/##' > "$REMOTE_BRANCHES"
git for-each-ref --format="%(refname)" refs/heads/ | \
sed 's#^refs/heads/##' > "$LOCAL_BRANCHES"
grep -vxF -f "$REMOTE_BRANCHES" "$LOCAL_BRANCHES" | \
sort -V > "$DANGLING_BRANCHES"
rm -f "$REMOTE_BRANCHES" "$LOCAL_BRANCHES"
if [[ $DELETE -ne 0 ]]; then
cat "$DANGLING_BRANCHES" | while read -r B; do
git branch -D "$B"
done
else
cat "$DANGLING_BRANCHES"
fi
rm -f "$DANGLING_BRANCHES"
Run Code Online (Sandbox Code Playgroud)
git fetch -p
git branch -v | grep "\[gone\]"
Run Code Online (Sandbox Code Playgroud)
然后手动检查并删除输出中的分支。
基于此线程和此处的答案的最简单的手动解决方案是删除远程上不再存在的所有远程跟踪引用
git fetch -p
Run Code Online (Sandbox Code Playgroud)
然后查看已从远程跟踪中删除但仍在本地工作树中的内容
git branch -v
Run Code Online (Sandbox Code Playgroud)
并手动删除有的分支[gone]并手动删除输出中
要获得简洁的列表,请运行
git branch -v | grep "\[gone\]"
Run Code Online (Sandbox Code Playgroud)
您可以通过迭代引用来完成此操作,我使用以下命令删除了所有没有远程分支的本地分支,并且它有效。警告:此操作会强制删除未完全合并的分支,请小心使用。
git branch -D `git for-each-ref --format="%(fieldName)" refs/heads/<branch-name-pattern>`
Run Code Online (Sandbox Code Playgroud)
%(fieldName) = refname:short)
refs/heads/如果分支名称中有共同的前缀/后缀,则可以添加 = 后缀,例如:refs/heads/*abc*
有关更多信息,请参阅git-for-each-ref(1) 手册页