我想清理我的本地存储库,它有很多旧的分支:例如3.2
,3.2.1
,3.2.2
等。
我希望以偷偷摸摸的方式立刻删除它们中的很多。由于他们大多遵循点发布惯例,我想也许有一条捷径可以说:
git branch -D 3.2.*
并杀死所有3.2.x分支。
我尝试了这个命令,当然,它没有用。
答案 0 :(得分:305)
没有那种语法。但你可以这样做:
git branch -D 3.2 3.2.1 3.2.2
基本上,git branch将通过一次调用为您删除多个分支。不幸的是,它没有完成分支名称。虽然,在bash中,你可以这样做:
git branch -D `git branch | grep -E '^3\.2\..*'`
答案 1 :(得分:130)
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-free:
git branch -D `git for-each-ref --format="%(refname:short)" refs/heads/3.2\*`
答案 2 :(得分:121)
嗯,在最坏的情况下,你可以使用:
git branch | grep '3\.2' | xargs git branch -d
答案 3 :(得分:74)
您可以使用git branch --list列出符合条件的分支,并使用git branch -D / -d删除符合条件的分支。
一个班轮示例:
async
答案 4 :(得分:36)
最近,我正在寻找同样问题的解决方案,最后我找到了一个答案并且它运作良好:
这个解决方案很棒,如果你想要完整解释每个命令及其工作方式,那么它的给定here。
答案 5 :(得分:25)
使用
git for-each-ref --format='%(refname:short)' 'refs/heads/3.2.*' |
xargs git branch -D
答案 6 :(得分:23)
要基于指定的模式删除多个分支,请执行以下操作:
打开终端或等效终端,然后键入以下命令:
git branch | grep "<pattern>" (preview of the branches based on pattern)
git branch | grep "<pattern>" | xargs git branch -D (replace the <pattern> with a regular expression to match your branch names)
删除所有3.2.x
分支,您需要输入
git branch | grep "3.2" | xargs git branch -D
仅此而已!
你很好!
答案 7 :(得分:8)
也许您会发现这很有用:
如果要删除所有非“ master”,“ foo”和“ bar”之类的分支
git branch -D `git branch | grep -vE 'master|foo|bar'`
grep -v'something'是具有反转功能的匹配器。
答案 8 :(得分:6)
如果您要删除多个分支进行清理,则可以使用
git branch -d branch1 branch2 branch3
如果您想向远程反映删除操作,也可以使用此按钮将其推送
git push origin --delete branch1 branch2 branch3
答案 9 :(得分:5)
如果您不仅限于使用git命令提示符,则可以始终运行git gui
并使用Branch-&gt; Delete菜单项。选择要删除的所有分支并将其翻录。
答案 10 :(得分:5)
我根据@gawi(上面)提供的答案制作了一个可能有用的小功能。
removeBranchesWithPrefix() {
git for-each-ref --format="%(refname:short)" refs/heads/$1\* | xargs git branch -d
}
将其添加到.bash_profile
并重新启动终端。然后你可以从命令行调用:
removeBranchesWithPrefix somePrefix
注意
我目前正在设置软删除,这意味着它不会删除分支,除非它们已经合并。如果您想生活在边缘,请将-d
更改为-D
,无论如何都会删除带有前缀的所有内容!
答案 11 :(得分:3)
您可能会喜欢这个小项目...它会拉出列表并要求确认每个项目,然后再删除所有选项......
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.
答案 12 :(得分:3)
如果您正在运行Windows,则可以使用Power Shell一次删除多个分支...
for _, value := range target
此命令将删除所有包含“ feature-”作为子字符串的分支。
您还可以使用Powershell的Select-String命令微调模式匹配的工作方式。看看powershell docs。
答案 13 :(得分:3)
对于在这里使用PowerShell的纯灵魂小脚本
git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })
答案 14 :(得分:1)
它对我来说正常工作:
git branch | xargs git branch -d
git branch | xargs git branch -D
删除所有本地分支机构
答案 15 :(得分:1)
使用以下命令删除所有分支(检出的分支将不会被删除)。
git branch | cut -d '*' -f 1 | tr -d " \t\r" | xargs git branch -d
答案 16 :(得分:1)
出于这个确切的原因,我将缩写和短划线(-)用作分支名称的前三个字符:
git branch -D `git branch --list 'at-*'`
答案 17 :(得分:1)
保留“开发”并删除本地所有其他
git branch | grep -v "develop" | xargs git branch -D
答案 18 :(得分:1)
如果要在文本文件(branches-to-del.txt)中删除所有分支(每行一个分支),则可以这样做以从远程(来源)删除所有这些分支:
xargs -a branches-to-del.txt git push --delete origin
答案 19 :(得分:0)
您可以使用git gui
一次删除多个分支。
从命令提示符/ Bash - &gt; git gui
- &gt;远程 - &gt;删除分支... - &gt;选择要删除的远程分支 - &gt;删除。
答案 20 :(得分:0)
您可以使用此命令:git branch -D $(printf "%s\n" $(git branch) | grep '3.2')
答案 21 :(得分:0)
今天我刚刚清理了一大堆陈旧的本地/远程分支机构。
下面是我的操作方式:
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 ”之类的文件相比,此文件的运行速度和可靠性要高得多。
这可能不是其他答案中列出的最聪明的方法,但是这种方法非常简单易用。
答案 22 :(得分:0)
如果您已安装Git GUI(这是Windows的默认加载项),则它是最简单的。您可以使用ctrl选择多个分支并一键删除。
答案 23 :(得分:0)
如果您使用的是Fish shell,则可以利用string
functions:
GOOGLE_SERVICE_INFO_PLIST_FROM="${PROJECT_DIR}/%YOUR_CUSTOM_PATH_TO_FOLDER%/${GOOGLE_SERVICE_INFO_PLIST_NAME}"
BUILD_APP_DIR="${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}"
GOOGLE_SERVICE_INFO_PLIST_TO="${BUILD_APP_DIR}/GoogleService-Info.plist"
cp "${GOOGLE_SERVICE_INFO_PLIST_FROM}" "${GOOGLE_SERVICE_INFO_PLIST_TO}"
这与其他一些答案中的Powershell选项没有太大区别。
答案 24 :(得分:0)
我在Windows上,您可以使用powershell来执行此操作:
git branch | grep 'feature/*' |% { git branch -D $_.trim() }
用您喜欢的任何模式替换feature/*
。
答案 25 :(得分:0)
git branch -d branch1 branch2 branch3
已经可以使用,但使用 Git 2.31(2021 年第一季度)会更快。
以前,当删除许多分支和标签时,代码曾经一次执行一个引用。
还有另一个 API 可以用来删除多个引用,当引用被打包时,它会产生很大的性能差异。
请参阅 commit 8198907 的 Phil Hord (phord
)(2021 年 1 月 20 日)。
(由 Junio C Hamano -- gitster
-- 在 commit f6ef8ba 合并,2021 年 2 月 5 日)
8198907795
:删除标签或分支时使用delete_refs
确认:以利亚纽伦
签字人:Phil Hord
'git tag -d
'(man) 接受一个或多个要删除的标签引用,但每次删除都是通过在每个 {{1} 上调用 delete_ref
来完成的}}.
从打包的引用中删除时,这非常慢。
改用 argv
,这样所有的删除都可以在一个事务中通过一次更新完成。
对“git branch -d
”执行相同的操作(man)。
由于 delete_refs
在单个事务中执行所有打包引用删除操作,如果任何删除操作失败,则所有删除操作都将被跳过。
实际上,它们都不应该失败,因为我们在调用 delete_refs
之前验证了每个的哈希值,但是在此更改后,某些网络错误或奇怪的权限问题可能会产生不同的结果。
此外,由于文件支持的删除不在同一个事务中执行,即使packed-refs 事务失败,这些删除也可能成功。
删除分支后,仅当分支引用被删除并且随后没有重新添加时才删除分支配置。
使用 delete_refs
手动测试删除 24,000 个标签需要大约 30 分钟。
使用 delete_ref
大约需要 5 秒。
答案 26 :(得分:0)
这是一个通用的解决方案:
git branch | grep "<pattern>" | xargs git branch -D
我建议在执行上述命令之前运行以下命令行以预览将被删除的分支。
git branch | grep "<pattern>"
在这种情况下
git branch | grep "^3\.2\..*" | xargs git branch -D
答案 27 :(得分:-1)
和Git一样,所有的分支都没有引用git repo,你为什么不删除转到.git/ref
的分支,然后如果遗漏任何东西,那么存储库中没有任何意义就会自动删除垃圾收集,所以你不需要打扰。
答案 28 :(得分:-2)
git branch -D <branchName>
答案 29 :(得分:-4)
您可以移除所有分支,删除所有不必要的引用:
AbsoluteLayout