删除本地Git分支后删除远程回购

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

在GitHub上的合并请求审查后,我合并并删除我的分支(远程)。 我怎样才能获取我的本地存储库中的这些信息,并让Git删除我的本地版本的分支以及?

快捷的方式

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

注意:如果你不是master ,这可能会删除分支。 继续阅读“更好的方式”。

确保我们保持主人

您可以确保master或其他任何分支机构不会因为这些问题而被删除。 在这种情况下,你会去:

 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添加别名。 我叫gbpurgegit branches purge ):

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

然后重新加载您的.bashrc.zshrc

 . ~/.bashrc 

要么

 . ~/.zshrc 

尝试:

 git pull --prune

如果删除了相应的远程分支,则删除本地分支。

更新:

上面的说法不正确。

事实上,运行git pull --prune 只会删除类似的远程跟踪分支

遥控器/产地/ FFF
遥控器/原产地的/ dev
遥控器/来源/主

然后,您可以运行git branch -r来检查机器上的远程跟踪分支。 假设左边的分支是:

原产地的/ dev
产地/主

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

所以,在运行git pull --prune ,运行:

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

你可以find所有的当地分支机构:

  1. 再也没有对应的远程分支了;
  2. 可以安全地移除。

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

我用GitHub使用同样的stream程,没有find满足我的以前的答案,作为git branch --merged列表分支被合并,但不是每个都被远程删除在我的情况。 所以,这为我工作:

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

哪里:

  • git fetch --all -p :更新本地分支机构状态
  • git branch -vv :列出本地分支机构状态
  • grep ": gone]" :过滤删除的
  • awk '{ print $1 }' :提取他们的名字
  • 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

这应该可以避免使用可接受的解决scheme删除masterdevelopment分支:

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

对于使用PowerShell的人来说,这相当于上面的答案:

 git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ } 
  1. 过滤所有标记为不存在的分支
  2. 在每个find的分支上调用git branch -D

这一切都没有为我工作。 你可以在这里看到我的其他答案: 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 

非常简单的解决scheme:删除您的本地回购,重新克隆远程回购。 可能看起来不是很优雅,但它很简单,你可以在不阅读手册页的情况下完全理解你在做什么:-)。

我已经写了这一行,列出所有没有相应远程分支的本地分支:

 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 

被投票的答案确实有可能删除主人。 以下实际例子。

我有两个function分支hemen_README和hemen_BASEBOX合并为开发,然后开发合并为主。 function分支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 

注意,它也显示了主人,最终将被删除。

无论如何,我能做到这一点。 我与你分享我的会话日志,我如何实现这一目标。

  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)