使用git remote prune origin
可以删除本地不再追踪的远程分支。
但是我也想删除从这些远程分支创建的本地分支(检查它们是否未合并会很好)。
我应该怎么做?
使用git remote prune origin
可以删除本地不再追踪的远程分支。
但是我也想删除从这些远程分支创建的本地分支(检查它们是否未合并会很好)。
我应该怎么做?
修剪之后,您可以使用git branch -r
获取远程分支列表。可以使用git branch -vv
检索具有其远程跟踪分支的分支列表。因此,使用这两个列表,您可以查找不在远程列表中的远程跟踪分支。
这行代码应该可以解决问题(需要bash
或zsh
,在标准Bourne shell下无法工作):
git fetch -p ; 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
的分支),然后获取该输出的第一列,即分支名称。最后将所有分支名称传递到删除分支命令中。
由于它使用了 -d
选项,因此当您运行此命令时,它不会删除未合并到您所在分支的分支。
git fetch -p
有时候并不足够? - Stefan Hendrikssh.exe": cannot make pipe for process substitution: Function not implemented sh.exe": egrep -v -f /dev/fd/0: No such file or directory fatal: branch name required
你有什么想法吗? - Ludderalias git-remove-untracked='git fetch --prune && git branch -r | awk "{print \$1}" | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk "{print \$1}" | xargs git branch -d'
- bryant1410git branch -D
对我们来说效果更好,因为我们倾向于在合并时压缩提交记录,如果带有 -d
参数运行,则会出现“分支 x 没有完全合并”的错误提示。 - Mateus Gondim如果您想要删除所有已经合并到主分支的本地分支,可以使用以下命令:
git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d
如果您使用 main
分支作为主分支,您应该相应地修改命令:
git branch --merged main | grep -v '^[ *]*main$' | xargs git branch -d
更多信息。
git branch --merged master --no-color | grep -v '^* master$' | xargs -n1 -r git branch -d
- Mike Dgit branch --merged master
会列出已经合并到主分支的分支,中间的 grep
部分排除了主分支本身(我们不希望删除主分支!),最后的 xargs
部分对结果中的每个分支执行 git branch -d
命令来删除它。或者您也可以阅读答案中提供的“更多信息”链接 ;) - jackocnrgit branch --merged master | egrep -v '^\s*\*?\s*master$' | xargs git branch -d
。在使用git版本2.10.1时,如果当前分支是master,则命令输出会显示 "* master"。不论是否有星号,上述命令均可删除master分支。 - Esteban在 git help fetch
提供的信息中,有这么一项:
-p, --prune
After fetching, remove any remote-tracking branches which no longer exist on the remote.
那么,也许 git fetch -p
就是你要找的东西?
编辑:好吧,对于那些在三年后仍然争论这个答案的人,我会提供一些更多关于为什么我提出这个答案的信息...
首先,原帖作者说他们想要“删除那些从那些不再存在于远程的分支创建的本地分支”,但这在 git
中并非毫无歧义的。以下是一个例子。
假设我有一个托管在中央服务器上的 repo,它有两个分支,叫做 A
和 B
。如果我将该 repo 克隆到我的本地系统上,我的克隆将具有称为 origin/A
和 origin/B
的本地引用(尚未是实际的分支)。现在假设我执行以下操作:
git checkout -b A origin/A
git checkout -b Z origin/B
git checkout -b C <some hash>
这里需要注意的是,我出于某种原因选择在本地repo上创建一个与它的源不同名的分支,并且我还有一个本地分支在源repo上(尚未)存在。
现在假设我删除远程repo上的A
和B
分支,并更新我的本地repo(某种形式的git fetch
),这将导致我的本地引用origin/A
和origin/B
消失。现在,我的本地repo仍然有三个分支,A
,Z
,和C
。它们中没有一个对应于远程repo上的分支。其中两个分支是“从...远程分支创建”的,但即使我知道原来在源上有一个名为B
的分支,我也无法知道Z
是从B
创建的,因为在此过程中已将其重命名,很可能是有充分理由的。因此,实际上,如果没有记录分支来源元数据的外部过程或者知道历史的人,就无法确定OP要删除的这三个分支中的哪一个(如果有)。没有一些git不能自动维护的外部信息,git fetch -p
是你能得到的最接近的东西,而任何试图实现OP所要求的字面意义的自动方法都存在删除太多分支或错过一些OP原本想要删除的分支的风险。
还有其他情况,例如我从origin/A
创建了三个单独的分支来测试三种不同的方法,然后origin/A
消失了。现在我有了三个分支,显然它们不可能都匹配名称,但它们是从origin/A
创建的,因此对于OP问题的字面解释要求删除所有三个分支。然而,如果你甚至能找到可靠的方法将它们匹配起来,这可能并不可取...
npx git-removed-branches
就像梦一样好用。 - Drazisil这将删除已经被远程跟踪分支修剪过的本地分支。(确保你在master
分支上!)
git checkout master
git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -d
细节:
当远程分支已被修枝时,git branch -vv
会显示本地分支为 "gone"。
mybranch abc1234 [origin/mybranch: gone] commit comments
-d
会检查是否已合并(-D
则无论如何都会删除它)。
error: The branch 'mybranch' is not fully merged.
git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d
命令缩短操作。 - chiborgmaster
),因为git branch -d
命令是将当前分支与HEAD
进行比较的。 - Steve Bennett: gone]
部分是本地化字符串。对于法语版本,您必须使用 : disparue]
。 - alexandre-rousseauxargs git branch -D
的任何人,请注意 -D
标志本质上是“强制删除”,但在删除远程分支被压缩合并或重新基础的分支时是必要的,因此作为一个好的中间地带,我建议在每次删除之前提示用户确认(更安全);使用 xargs -p git branch -D
。 - ksgj1对于微软 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 reference)
Select-String -Pattern ": gone]"
只获取已从远程删除的记录。
% { $_.toString().Split(" ")[0]}
获取分支名称
% {git branch -d $_}
删除分支
error: 分支 'bugfix/foobar' 没有完全合并。 如果您确定要删除它,请运行 'git branch -D bugfix/foobar'。'
,所以我在结尾处使用了大写字母 D {git branch -D $_}
,这对我起作用了。 - Kraego可以配置Git在获取时自动删除已删除远程分支的引用:
git config --global fetch.prune true
在调用git fetch
或git pull
之后,对已删除的远程分支的引用会被自动移除。
git branch -r
列出对远程分支的引用。 - wedesoft正如@tzacks所指出的...有一个方便的npm包可用于此。只需执行以下操作:
npx git-removed-branches --prune
(我的声望不够,否则我会留下评论的)
它将列出本地分支,其远程跟踪分支从远程中已被删除
$ git remote prune origin --dry-run
如果你想从本地删除那些未被跟踪的本地分支引用
$ git remote prune origin
git branch --merged | ? {$_[0] -ne '*'} | % {$_.trim()} | % {git branch -d $_}
列出当前分支以及已合并到当前分支的分支列表,过滤掉当前分支,清除每个剩余分支名中的前导或尾随空格,并删除已经合并的本地分支。强烈建议先单独运行git branch --merged
命令,以确保它只会删除您期望删除的内容。 (本段内容来源:http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/.)uat
prod
等),则可能不希望这样做。 - Shanerk
npx git-removed-branches
(干运行) 或npx git-removed-branches --prune
(真实运行)。详细信息请参见以下答案。 - Cristian Diaconescu