随着git remote prune origin我可以删除本地分支机构不在遥控器上的任何更多.
但我还想删除从这些远程分支创建的本地分支(检查它们是否未合并会很好).
我怎样才能做到这一点?
Sch*_*eis 798
修剪后,您可以获取远程分支列表git branch -r.可以使用检索具有远程跟踪分支的分支列表git branch -vv.因此,使用这两个列表,您可以找到不在远程列表中的远程跟踪分支.
这行应该做的伎俩(需要bash或zsh不适用于标准的Bourne shell):
git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d
该字符串获取远程分支列表并通过egrep标准输入传递.并过滤具有远程跟踪分支的分支(使用git branch -vv和过滤那些有分支origin),然后获取该输出的第一列,它将是分支名称.最后将所有分支名称传递给delete branch命令.
由于它使用该-d选项,因此在运行此命令时,它不会删除尚未合并到您所在分支的分支.
还记得你需要运行的git fetch --prune 第一,否则git branch -r仍然会看到远程分支.
jac*_*cnr 387
如果要删除已合并为master的所有本地分支,可以使用以下命令:
git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d
Run Code Online (Sandbox Code Playgroud)
更多信息.
twa*_*erg 149
在提供的信息中git help fetch,有一个小项目:
-p, --prune
After fetching, remove any remote-tracking branches which no longer exist on the remote.
Run Code Online (Sandbox Code Playgroud)
那么,也许,git fetch -p你正在寻找什么?
编辑:好的,对于那些在事实发生3年后仍然在争论这个答案的人,这里有更多关于为什么我提出这个答案的信息......
首先,OP表示他们想要"删除那些从那些远程分支创建的本地分支[在远程分支上不再存在]".这并非毫无疑问是可能的git.这是一个例子.
假设我在中央服务器上有一个repo,它有两个分支,叫做A和B.如果我克隆了一个回购协议,以我的本地系统,我的克隆将具有本地裁判(不是实际的分支机构还)叫origin/A和origin/B.现在让我们说我做了以下事情:
git checkout -b A origin/A
git checkout -b Z origin/B
git checkout -b C <some hash>
Run Code Online (Sandbox Code Playgroud)
这里的相关事实是我出于某种原因选择在我的本地仓库上创建一个分支,其名称与其来源不同,并且我还有一个本地分支,但尚未存在于原始仓库中.
现在让我说我删除远程仓库上的A和B分支并更新我的本地仓库(git fetch某种形式),这会导致我的本地参考origin/A并origin/B消失.现在,我的本地回购有三大分支的是,A,Z,和C.这些都没有在远程仓库上有相应的分支.其中两个是"从...远程分支创建的",但即使我知道曾经有一个分支B在原点上调用,我也无法知道它Z是从B,因为它在这个过程中被重命名,可能是有充分理由的.因此,实际上,如果没有一些外部过程记录分支起源元数据,或者知道历史记录的人,就不可能分辨出哪三个分支(如果有的话)OP正在瞄准去除.如果没有一些git不能为你自动维护的外部信息,git fetch -p就会尽可能接近,并且任何自动尝试OP所要求的方法都会冒着删除过多分支的风险,或者错过一些OP否则想要删除.
还有其他场景,例如,如果我创建三个单独的分支origin/A来测试三种不同的方法,然后origin/A消失.现在我有三个分支,显然不能全部匹配名称,但它们是由创建的origin/A,因此对OP问题的字面解释将需要删除所有三个.然而,如果你甚至找到一种可靠的方法来匹配它们,这可能是不可取的......
wis*_*cky 105
这将删除已修剪远程跟踪分支的本地分支.(确保你在master分支!)
git checkout master
git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -d
Run Code Online (Sandbox Code Playgroud)
细节:
git branch -vv 显示遥控器已被修剪的本地分支"已消失".
mybranch abc1234 [origin/mybranch: gone] commit comments
Run Code Online (Sandbox Code Playgroud)-d将检查它是否已合并(-D将删除它无论如何)
error: The branch 'mybranch' is not fully merged.
Run Code Online (Sandbox Code Playgroud)wed*_*oft 47
可以将Git配置为在获取时自动删除对已删除远程分支的引用:
git config --global fetch.prune true
Run Code Online (Sandbox Code Playgroud)
在呼叫时git fetch或git pull之后,对已删除的远程分支的引用会自动删除.
tza*_*chs 33
有一个简洁的NPM包为你做(它应该跨平台工作).
安装它: npm install -g git-removed-branches
然后git removed-branches将向您展示所有陈旧的本地分支,并git removed-branches --prune实际删除它们.
chr*_*389 29
对于Microsoft Windows Powershell:
git checkout master; git remote update origin --prune; git branch -vv | Select-String -Pattern ": gone]" | % { $_.toString().Trim().Split(" ")[0]} | % {git branch -d $_}
git checkout master 切换到主分支
git remote update origin --prune 修剪远程分支
git branch -vv得到所有分支的详细输出(git引用)
Select-String -Pattern ": gone]" 只获取从远程删除它们的记录.
% { $_.toString().Split(" ")[0]} 获取分支名称
% {git branch -d $_} 删除分支
027*_*027 24
它将列出远程跟踪分支从远程删除的本地分支
$ git remote prune origin --dry-run
Run Code Online (Sandbox Code Playgroud)
如果要从本地取消引用这些未跟踪的本地分支
$ git remote prune origin
Run Code Online (Sandbox Code Playgroud)
Gna*_*nat 14
如果使用Windows和Powershell,则可以使用以下命令删除已合并到当前检出的分支中的所有本地分支:
git branch --merged | ? {$_[0] -ne '*'} | % {$_.trim()} | % {git branch -d $_}
Run Code Online (Sandbox Code Playgroud)
说明
git每个剩余分支名称的输出中的任何前导或尾随空格它git branch --merged首先值得自己运行,以确保它只会删除你的预期.
S'c*_*ock 11
这是我的解决方案:
git fetch -p
git branch -vv | grep ": gone" | awk '{print $1}' | xargs git branch -d
Run Code Online (Sandbox Code Playgroud)
-p是删除远程上不再存在的任何远程跟踪引用。所以第一步将删除对远程分支的引用。
-vv用于显示每个头部的 sha1 和提交主题行,以及与上游分支的关系(如果有)。第二步将获取所有本地分支,grep 命令将过滤掉已删除的分支。
我想要一些东西可以清除跟踪远程分支的所有本地分支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)
注意:使用-D标志git branch可能非常危险.所以,在上面的config命令中我使用-d选项git branch而不是-D; 我-D在我的实际配置中使用.我使用-D是因为我不想听到Git抱怨未合并的分支,我只是想让它们消失.您可能也想要这个功能.如果是这样,只需使用-D而不是-d在该config命令的末尾.
似乎没有一个安全的单线,太多的边缘情况(例如一个分支将“master”作为其名称的一部分等)。最安全的是这些步骤:
git branch -vv | grep 'gone]' > stale_branches.txt awk '{print $1}' stale_branches.txt | xargs git branch -d此命令和下面的脚本可在 Linux 和 Windows 中使用 Git Bash (MinGW) 运行。
最好使用 git 的内部命令,这样注释或名称就不会意外匹配并删除您不想删除的分支。有许多内部“原子”可以与git for-each-ref的 format 选项一起使用来输出所需的信息。这样我们就不必依赖管道awk或grep检查输出上可能包含不必要信息的正则表达式。
下面的命令仅使用 的git for-each-ref内部低级命令来仅列出孤立的本地分支。一旦你有了这些,你就可以通过管道连接到git branch -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
Run Code Online (Sandbox Code Playgroud)
这是一个细分:
git fetch -p- 修剪删除的引用并从远程获取新的引用
git for-each-ref --format- 列出使用特定输出格式的所有引用。
%(if:equals=[gone])%(upstream:track)- 仅当上游跟踪分支为“[gone]”时输出。
%(then)%(refname:short)%(end)- 输出分支名称(当跟踪消失时)。
refs/heads/**- 限制头部引用(为了效率)。
| xargs -r git branch -D- 管道输出作为删除参数。表示-r忽略空白输入。
就其本身而言,这个解决方案很长,打字起来很荒谬,而且很难记住。幸运的是,向 git 添加自定义命令很容易。下面是一个使用上面相同命令的脚本,但它允许用户查看将使用选项选择哪些分支--dry-run。
我命名了我的文件git-prune-local并将其放入我的PATH. 它还需要执行权限(chmod 755 git-prune-local)。
Git 自动查找可执行文件,例如git-[command]. 这样,您只需键入git prune-local要删除的正确分支即可。
git-prune-本地
#!/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"
Run Code Online (Sandbox Code Playgroud)
您可以使用该--no-contains选项来避免master在使用分支时删除分支--merged。
单独运行看起来像
$ git branch --no-contains master --merged master
old-branch1
old-branch2
old-branch3
Run Code Online (Sandbox Code Playgroud)
要在 Unix shell 中删除分支,请使用xargs
git branch --no-contains master --merged master | xargs git branch -d
Run Code Online (Sandbox Code Playgroud)
使用管道删除 Powershell 中的分支
git branch --no-contains master --merged master `
| % { $_.toString().Trim().Split(" ")[0] } `
| % { git branch '-d' $_ }
Run Code Online (Sandbox Code Playgroud)
更短更安全的单线:
git branch -d $(git branch --merged | cut -c 3- | grep -v master)
Run Code Online (Sandbox Code Playgroud)
在运行之前,请务必签出尚未合并的分支.因为您无法删除当前签入的分支.
小智 6
正如@tzacks所提到的...有一个npm软件包很方便。做就是了:
npx git-removed-branches --prune
Run Code Online (Sandbox Code Playgroud)
(我会发表评论,但声誉不足)
在Powershell中:
git branch -D (git branch --merged |% { $_.trim() } )
Run Code Online (Sandbox Code Playgroud)
根据上面的答案,我正在使用这种较短的衬里:
git remote prune origin | awk 'BEGIN{FS="origin/"};/pruned/{print $2}' | xargs -r git branch -d
Run Code Online (Sandbox Code Playgroud)
此外,如果您已经修剪并有本地悬垂的分支,那么这将清理它们:
git branch -vv | awk '/^ .*gone/{print $1}' | xargs -r git branch -d
Run Code Online (Sandbox Code Playgroud)
小智 5
删除远程分支
$git remote prune origin
Run Code Online (Sandbox Code Playgroud)
删除已经合并的本地分支
$git branch -D $(git branch --merged)
Run Code Online (Sandbox Code Playgroud)
在 OS X 上,支持cut -w
git branch -d $(git branch -vv | grep ': gone]' | cut -w -f 2 )
Run Code Online (Sandbox Code Playgroud)
git branch -d ...
Run Code Online (Sandbox Code Playgroud)
$ git branch -vv | grep ': gone]'
chore/TECH-456 a4bdac8ac8 [origin/TECH-456: gone] chore: syntax error
feature/TECH-678 0342f8e277 [origin/feature/TECH-678: gone] Added IsGross in new Income Details
Run Code Online (Sandbox Code Playgroud)
$ git branch -vv | grep ': gone]' | cut -w -f 2
chore/TECH-456
feature/TECH-678
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
279274 次 |
| 最近记录: |