在远程回购中删除本地 Git 分支之后再删除它们

我希望我的本地和远程存储库在分支方面始终同步。

在 GitHub 上进行拉请求检查之后,我合并并删除那里的分支(远程)。 如何在本地存储库中获取这些信息,并让 Git 删除本地版本的分支?

71389 次浏览

尝试:

git pull --prune

如果相应的远程分支被删除,它将删除您的本地分支。

更新:

上述说法并不正确。

事实上,运行 git pull --prune只移除远程跟踪分支这样的

remotes/origin/fff
remotes/origin/dev
remotes/origin/master

然后,您可以运行 git branch -r来检查机器上留下的远程跟踪分支:

origin/dev
origin/master

这意味着分支 origin/fff被删除。

因此,在运行 git pull --prune之后,只需运行:

git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)

你可在此找到以下所有本地分行:

  1. 不再有相应的遥远分支;
  2. 可以安全地移除。

然后,<the command above> | xargs git branch -d可以删除所有这些。

捷径

git branch --merged | grep -v "\*" | xargs -n 1 git branch -d

注意: 如果你不在 master上,这有可能删除分支。请继续阅读“更好的方法”。

确保我们保持主人

您可以确保 master或任何其他分支不会被 greping 删除。这种情况下,你会说:

git branch --merged | grep -v "\*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d

例如,如果我们想保留 masterdevelopstaging,我们可以这样做:

git branch --merged | grep -v "\*" | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d

把这个做成化名

因为它有点长,所以您可能需要在 .zshrc.bashrc中添加一个别名。我的叫做 gbpurge(代表 git branches purge) :

alias gbpurge='git branch --merged | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d'

然后重新加载 .bashrc.zshrc:

. ~/.bashrc

或者

. ~/.zshrc

投票的答案确实有可能删除主人。请参考下面的实际例子。

我有两个功能分支 Hemen _ README 和 Hemen _ BASEBOX,它们被合并到开发中,然后开发被合并到主机中。特征分支 hemen _ README 和 hemen _ BASEBOX 被远程删除,但仍然在本地显示。我也不是本地的硕士,但在发展。

这样的话

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
* develop                      671ad6c Merged in hemen_README (pull request #1)
hemen_BASEBOX                a535c0f added global exec paths to puppet manifest
hemen_README                 ba87489 Updated Readme with considerable details
master                       8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
remotes/origin/develop       671ad6c Merged in hemen_README (pull request #1)
remotes/origin/hemen_BASEBOX a535c0f added global exec paths to puppet manifest
remotes/origin/hemen_README  ba87489 Updated Readme with considerable details
remotes/origin/master        2f093ce Merged in develop (pull request #3)

所以如果我运行上面的部分命令

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch --merged | grep -v "\*"
hemen_BASEBOX
hemen_README
master

注意,它也显示了 master,这最终将被删除。

无论如何,我做到了。我与你分享我的会议日志,我是如何实现这一点的。

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin --dry-run
Pruning origin
URL: git@bitbucket.org:hemenkapadiapublic/vagrant-webdev.git
* [would prune] origin/hemen_BASEBOX
* [would prune] origin/hemen_README
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin
Pruning origin
URL: git@bitbucket.org:hemenkapadiapublic/vagrant-webdev.git
* [pruned] origin/hemen_BASEBOX
* [pruned] origin/hemen_README

我只是检查了一下什么会被修剪,然后再修剪。看看下面的分部指挥我们已经搞定了遥控器

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
* develop                671ad6c Merged in hemen_README (pull request #1)
hemen_BASEBOX          a535c0f added global exec paths to puppet manifest
hemen_README           ba87489 Updated Readme with considerable details
master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
remotes/origin/master  2f093ce Merged in develop (pull request #3)

现在继续删除本地分支

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_BASEBOX
Deleted branch hemen_BASEBOX (was a535c0f).
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_README
Deleted branch hemen_README (was ba87489).

现在好了,树枝都如愿以偿了。

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
* develop                671ad6c Merged in hemen_README (pull request #1)
master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
remotes/origin/master  2f093ce Merged in develop (pull request #3)

这样可以避免使用公认的解决方案删除 师父发展分支:

git branch --merged | egrep -v "^\*|master|development" | xargs -n 1 git branch -d

我在 GitHub 中使用了相同的流程,并没有找到令我满意的答案,因为 git branch --merged列出了被合并的分支,但是在我的例子中,并不是每个分支都被远程删除了。 所以,这对我很有用:

git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d

地点:

  • 更新本地分行状态
  • 列出本地分支机构的状态
  • 过滤删除的
  • 提取他们的名字
  • xargs -n 1 git branch -d: 将名称传递给 delete 命令

注意: 如果您愿意,可以使用 -D 而不是 -d,这将强制执行删除操作。

例如:

someUsr@someHost:~/repo$ git branch -a
basic-testing
integration-for-tests
* master
origin
playground-for-tests
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services


someUsr@someHost:~/repo$ git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
Fetching origin
Deleted branch integration-for-tests (was fbc609a).
Deleted branch playground-for-tests (was 584b900).


someUsr@someHost:~/repo$ git branch -a
basic-testing
* master
origin
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services

参考文献:

Http://git-scm.com/book/en/v2/git-branching-remote-branches

非常简单的解决方案: 删除本地回购并重新克隆远程回购。可能看起来不是很优雅,但是它很简单,不用阅读手册页,你就能准确地理解你在做什么: ——)。

这些对我来说都不管用,你可以在这里看到我的另一个答案: Https://stackoverflow.com/a/34969726/550454

但是本质上,我现在在我的 ~/.gitconfig里有这个:

[alias]
prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -d

对于使用 powershell 的人来说,这相当于回答 以上:

git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
  1. 筛选所有标记为 消失了的分支
  2. 对每个找到的分支调用 git branch -D(使用 -D删除分支,而不管其合并后的状态如何)。

我编写了这个一行程序来列出所有没有相应远程分支的本地分支:

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -

完成此操作后,使用 xargs删除这些本地分支很容易:

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -|xargs -r git branch -d

我这样做只是为了删除合并的本地分支:

git branch -d $(git branch --merged)

如果你想删除不存在的跟踪:

git pull --prune

如果您刚刚推送并合并了分支到 master,那么在 git bash 中执行以下操作:

git branch -d branch_name_to_delete

如果你现在在那个分支,它会把你推回到主人那里

git pull