删除本地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
所以,如果我们想保持master
, develop
和staging
,我们会去:
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
尝试:
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所有的当地分支机构:
- 再也没有对应的远程分支了;
- 可以安全地移除。
然后, <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
参考:
这应该可以避免使用可接受的解决scheme删除master和development分支:
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 $_ }
- 过滤所有标记为不存在的分支
- 在每个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)