我想清理我的本地库,其中有一吨老枝:例如3.2,3.2.1,3.2.2等。
我希望以一种偷偷摸摸的方式立即删除其中的许多内容。由于他们大多遵循点发布约定,所以我认为也许有一个捷径可以说:
git branch -D 3.2.*
并杀死所有3.2.x分支。
我尝试了该命令,但它当然不起作用。
-D就是强制删除,-d在大多数情况下应该首先使用起来更安全。
我想清理我的本地库,其中有一吨老枝:例如3.2,3.2.1,3.2.2等。
我希望以一种偷偷摸摸的方式立即删除其中的许多内容。由于他们大多遵循点发布约定,所以我认为也许有一个捷径可以说:
git branch -D 3.2.*
并杀死所有3.2.x分支。
我尝试了该命令,但它当然不起作用。
-D就是强制删除,-d在大多数情况下应该首先使用起来更安全。
Answers:
不能使用该语法。但是您可以这样做:
git branch -D 3.2 3.2.1 3.2.2
基本上,git branch将通过一次调用为您删除多个分支。不幸的是,它没有完成分支名称。尽管可以使用bash进行以下操作:
git branch -D `git branch | grep -E '^3\.2\..*'`
git branch -D/-d我来说很好。可能想更新您的文件(可能来自最新的git.git contrib目录)。
git branch | ...您可以使用$(git for-each-ref --format='%(refname:short)' refs/heads/3.*)。我知道,它更长,但可以保证是合适的输出,同时git branch具有诸如*和->(对于symrefs)之类的漂亮输出,可能会使您陷入脚本/单行代码中。
grep别名总是包含该标志--color=always- git branch -D一直抛出error: branch 'my_branch' not found.直到我没有颜色标志运行为止。
git branch --merged ${1-$(current_branch)} | grep -v ${1-$(current_branch)} | xargs git branch -d
git branch -D 3.2{,.1,.2}删除所有三个分支的命令gnu.org/software/bash/manual/html_node/Brace-Expansion.html
好吧,在最坏的情况下,您可以使用:
git branch | grep '3\.2' | xargs git branch -d
| xargs git branch -d需要检查实际要删除的内容。
grep的输出git branch,因为它的意思是读取而不是解析。可以随时更改。结合使用其他答案中建议for-each-ref的--format参数和params,然后结合此答案中的建议。
git branch | cut -c3- | egrep "^3.2" | xargs git branch -D
^ ^ ^ ^
| | | |--- create arguments
| | | from standard input
| | |
| | |---your regexp
| |
| |--- skip asterisk
|--- list all
local
branches
编辑:
一个更安全的版本(由JakubNarębski和Jefromi建议),因为git branch输出并不打算在脚本中使用:
git for-each-ref --format="%(refname:short)" refs/heads/3.2\* | xargs git branch -D
...或无xargs的:
git branch -D `git for-each-ref --format="%(refname:short)" refs/heads/3.2\*`
git branch输出用于脚本。使用git for-each-ref。
git for-each-ref --format="%(refname:short)" refs/tags/\*@\* | xargs git tag -d
If one or more patterns are given, only refs are shown that match against at least one pattern, either using fnmatch(3) or literally, in the latter case matching completely or from the beginning up to a slash
-D就是强制删除,-d在大多数情况下应该首先使用起来更安全。
您可以使用git branch --list列出合格分支,并使用git branch -D / -d删除合格分支。
一个班轮示例:
git branch -d `git branch --list '3.2.*'`
error: branch 'package.json' not found.。*似乎扩展得太早了,它试图删除与每个文件和目录的名称相对应的分支。
gitconfig...
git branch --list '3.2.*'
git branch -d (git branch --list '3.2.*').trim()
采用
git for-each-ref --format='%(refname:short)' 'refs/heads/3.2.*' |
xargs git branch -D
alias grefs='git for-each-ref --format="%(refname:short)"'这样我就可以做到grefs | grep 'regexpattern' | xargs git branch -D
如果您不仅限于使用git命令提示符,那么您始终可以运行git gui并使用Branch-> Delete菜单项。选择您要删除的所有分支并使其撕裂。
Powershell解决方案:
如果您正在运行Windows,则可以使用PowerShell一次删除多个分支...
git branch -D ((git branch | Select-String -Pattern '^\s*3\.2\..*') | foreach{$_.ToString().Trim()})
//this will remove all branches starting with 3.2.
git branch -D ((git branch | Select-String -Pattern 'feature-*') | foreach{$_.ToString().Trim()})
// this will delete all branches that contains the word "feature-" as a substring.
您还可以使用Powershell的Select-String命令微调模式匹配的工作方式。看看powershell文档。
根据@gawi提供的答案,我做了一个小功能,可能有用(上面)。
removeBranchesWithPrefix() {
git for-each-ref --format="%(refname:short)" refs/heads/$1\* | xargs git branch -d
}
将其添加到您.bash_profile的终端,然后重新启动终端。然后,您可以像这样从命令行调用:
removeBranchesWithPrefix somePrefix
注意
我目前已将其设置为软删除,这意味着除非分支已经合并,否则它不会删除分支。如果您希望生活在边缘,请更改-d为-D,它将删除所有带前缀的内容!
您可能会喜欢这个小项目...它会拉列表并要求您确认每个项目,然后最终删除所有选择...
git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "remove branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done`
使用-D强制删除(像往常一样)。
为了便于阅读,这里是逐行分解的内容...
git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* |
while read -r line; do
read -p "remove branch: $line (y/N)?" answer </dev/tty;
case "$answer" in y|Y) echo "$line";;
esac;
done`
这是xargs方法...
git for-each-ref --format="%(refname:short)" refs/heads/\* |
while read -r line; do
read -p "remove branch: $line (y/N)?" answer </dev/tty;
case "$answer" in
y|Y) echo "$line";;
esac;
done | xargs git branch -D
最后,我喜欢在我的.bashrc中包含它
alias gitselect='git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "select branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done'
这样我就可以说
gitSelect | xargs git branch -D.
使用以下命令删除所有分支(签出的分支不会被删除)。
git branch | cut -d '*' -f 1 | tr -d " \t\r" | xargs git branch -d
编辑:我正在使用Mac OS
如果您在Windows上,则可以使用powershell进行此操作:
git branch | grep 'feature/*' |% { git branch -D $_.trim() }
用feature/*您喜欢的任何模式替换。
您可以使用git gui一次删除多个分支。从命令提示符/重击-> git gui->远程->删除分支...->选择要删除的远程分支->删除。
我今天刚刚清理了一大堆陈旧的本地/远程分支机构。
以下是我的操作方法:
1.将所有分支名称列出到一个文本文件中:
git branch -a >> BranchNames.txt
2.将要删除的分支附加到命令“ git branch -D -r”:
git branch -D -r origin / dirA / branch01 origin / dirB / branch02 origin / dirC / branch03(...附加任何分支名称)
3.执行cmd
而且它比“ git push origin --delete ” 更快,更可靠。
这可能不是其他答案中列出的最聪明的方法,但是这种方法很简单,并且易于使用。
git branch -D <branchName>
git branch -D $(git branch | grep 3.2*)-这对我有用。删除名称以“ 3.2”开头的分支。grep-输出中的模式匹配(git branch在这种情况下为)。$()-表示执行并放置结果。|-链接。