如何修剪本地跟踪分支,这些分支在远程不存在了?

1322

使用git remote prune origin可以删除本地不再追踪的远程分支。

但是我也想删除从这些远程分支创建的本地分支(检查它们是否未合并会很好)。

我应该怎么做?


12
可能是「删除不在远程的本地分支」的重复问题。 - kolen
6
一句话介绍:跨平台的命令行工具,不会让人觉得像猫睡在你的键盘上一样混乱。要使用此工具,请先安装_node.js_。使用npx git-removed-branches(干运行) 或 npx git-removed-branches --prune(真实运行)。详细信息请参见以下答案 - Cristian Diaconescu
我通常认为这些事情应该是有意识地完成,而不是自动化的,否则你会面临删除你不想删除的东西的风险。因此,我会坚持使用 git branch -d localBranchName 和 git push origin --delete remoteBranchName。 - Epirocks
3
对于使用IntelliJ的用户,以下插件正好满足您的需求:https://plugins.jetbrains.com/plugin/10059-git-branch-cleaner - Daniel
40个回答

1

在 git bash 中尝试以下操作,以获取和修剪删除分支的引用,然后修剪跟踪已删除分支的本地分支:

git fetch -p && git branch -d `git branch -vv | grep ': gone]' | awk '{print $1}' | xargs`

记得首先检出一个不会被删除的分支,以避免阻止分支的删除。


0

检查目标

for target in $(git branch | grep -Eiv "master|develop|branchYouWantToLive"); do echo $target; done

使用for和子命令运行

for target in $(git branch | grep -Eiv "master|develop|branchYouWantToLive"); do git branch -D $target; done

您可以扩展其他关于分支的功能。


0
我发现当遥控器不再存在时,这里的答案没有用处。我一直看到不存在的远程分支,但找不到删除它们的git命令。 对我来说解决方法是进入.git\refs\remotes目录,并直接删除不再相关的文件。文件结构非常容易理解。它与您在git branch -r中看到的结构相同。

0
除了Schleis的答案(完美地解决了问题),这个功能还可以集成到Visual Studio中,因此在VS中打开git repo时修剪本地分支非常简单。
您可以使用“外部工具”功能调用带有特定目录和命令的sh.exe(git bash)。这位于“工具”>“外部工具”菜单选项中(在VS 2022 17.1.0中)。我使用的参数如下:
命令:{Path-To-Git-Installation-Location}\bin\sh.exe 参数:--cd=$(SolutionDir) -c "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"
初始目录:$(SolutionDir) Git Prune Local Branches截图 值得注意的是,只有在您在VS中打开的解决方案位于git repo目录中时,此方法才有效。

最后注意事项 - 可以通过 Visual Studio 键绑定用户界面在“设置”>“常规”>“键盘”中搜索 Tools.ExternalCommand[n] 来绑定快捷键,其中 n 是您将此外部工具放置在外部命令表中的位置(可以在“工具”>“外部工具”对话框中重新排序)。请参见下面的屏幕截图。

绑定外部工具命令的快捷键


0

我来到这个页面是为了寻找答案:“如何删除本地检出的分支,而这些分支已经没有上游分支了”

我也不在意本地分支是否已经合并,因为将其导入git branch -d中只会发出警告而不会删除未合并的本地分支。

git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3 | egrep -v -f /dev/fd/0 <(git branch -a | grep -v origin) | grep branch_prefix_that_I_care_about | xargs git branch -d

# translation
# git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3
## this finds all remote branch names minus the "remote/origin/" part
#
# <(git branch -a | grep -v origin)
## this finds all local branch names and redirects it into the previous command
#
# egrep -v -f /dev/fd/0 STUFF
## this is doing some weird magic that I'm grokking as "take the set difference from whatever was piped in"
#
#
# overall translation: (STUFF TO CONSIDER) | egrep magic <(STUFF TO REMOVE FROM CONSIDERATION) | do cool things with resulting stuff

0
我喜欢下面的方法。我在我的历史记录中保存了它,只需输入gfa + UP,就可以获取以gfa开头的最新的shell历史记录项,然后我就完成了。这个方法已经在我身上使用了6年了。
gfa && gco develop && gl && for branch in $(git for-each-ref --format '%(refname) %(upstream:track)' refs/heads | awk '$2 == "[gone]" {sub("refs/heads/", "", $1); print $1}' | egrep -v '\*|master|main|develop'); do git branch -d $branch; done

这里使用的别名解析为(与.zshrc兼容格式):
alias gfa='git fetch --all --prune --jobs=10'
alias gco='git checkout'
alias gl='git pull'
alias gb='git --no-pager branch'

-1

我已经将被接受的答案转化为一个稳健的脚本。你可以在我的git-extensions仓库中找到它。

$ git-rprune --help
Remove old local branches that do not exist in REMOTE any more.
With --test, only print which local branches would be deleted.
Note: To do this automatically on each fetch / pull:
    git config --global fetch.prune true
Usage: git-rprune REMOTE [-t|--test|-f|--force] [-?|-h|--help]

链接已经失效。此外,这不会与默认的 git prune 冲突吗? - Macadameane
1
@Macadameane 抱歉链接失效了;我已经将脚本移动到了 bin/ 子目录中。我还将其重命名为 git-rprune,以避免名称冲突;实际上,我从未直接调用该命令,而是使用别名 oprune=rprune origin。迄今为止,我从未见过内置的 git prune,因为它是一条不常见的低级命令。 - Ingo Karkat

-2
删除任何与主分支不同步的分支。
git co master && git branch | sed s/\*/\ / | xargs git branch -d 2> /dev/null

-3
我相当确定你想要的是git remote prune origin
你可以运行git remote prune origin --dry-run来查看它会在不做任何更改的情况下做什么。

12
这实际上并没有删除本地分支本身。 - Taytay

-11

使用GUI界面?手动操作虽然繁琐,但快捷简便。

$ git gui

选择“分支 -> 删除”。您可以使用ctrl-click(Windows)选择多个分支并将它们全部删除。

4
有趣的是,这个回答被认为是非常负面的。在我看来,如果你喜欢图形用户界面,这是完全有效的方法。 - serraosays

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接