我希望本地和远程存储库始终在分支方面保持同步。
在GitHub上的请求请求审核后,我合并并删除了那里的分支(远程)。我如何才能在本地存储库中获取此信息,并让Git也删除分支的本地版本?
git ls-remote
然后git show-ref
。
git symbolic-ref
和git update-ref
。
我希望本地和远程存储库始终在分支方面保持同步。
在GitHub上的请求请求审核后,我合并并删除了那里的分支(远程)。我如何才能在本地存储库中获取此信息,并让Git也删除分支的本地版本?
git ls-remote
然后git show-ref
。
git symbolic-ref
和git update-ref
。
Answers:
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
注意:如果您不在master
,则有可能删除分支。继续阅读“更好的方法”。
您可以确保ing master
或更多分支不会被删除grep
。在这种情况下,您可以:
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
branch
是瓷器而不是管道命令,所以请注意将来的Git版本中可能会破坏它的UI更改。
master
将被删除。
grep -Ev '(\*|master|important-branch)'
~/.gitconfig
,则将以下内容添加到该[alias]
部分:(gbpurge = !"git branch --merged | grep -Ev '\\*|master|develop|staging' | xargs -n 1 git branch -d"
无需在grep表达式中使用())。
我在GitHub上使用相同的流程,但没有找到令我满意的先前答案,因为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
参考:
git checkout master; git pull origin master; git fetch --all -p; git branch -vv | grep gone | awk '{ print $1 }' | xargs -n 1 git branch -d
branch -vv
显示了分支中的最后提交消息。如果您在该消息中碰巧已经“走了”,那grep gone
也将打到该分支。因此,grep ": gone]"
使用起来可能更安全一些。
awk '$3 $4 ~ /:gone]$/ { print $1 }'
-D
,-d
这是一个完美的答案!
尝试:
git pull --prune
如果删除了其相应的远程分支,则会删除您的本地分支。
上面的说法并不正确。
事实上,运行git pull --prune
将只删除远程跟踪分支诸如此类
遥控器/原点/ fff 遥控器/起源/开发 遥控器/原点/主机
然后,您可以运行git branch -r
以检查计算机上剩余的远程跟踪分支。假设左分支是:
原始/开发 起源/主人
这意味着该分支将origin/fff
被删除。
因此,运行后git pull --prune
,只需运行:
git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)
您可以找到所有本地分支机构:
然后,<the command above> | xargs git branch -d
可以删除所有这些。
git fetch --prune
,这是我的选择方式
git pull --prune
导致“您要求从远程'--prune'中拉出,但未指定分支。因为这不是当前分支的默认配置远程,必须在命令行上指定一个分支。”
这些都不对我有用。您可以在这里看到我的其他答案: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
非常简单的解决方案:删除本地存储库,然后重新克隆远程存储库。可能看起来不太优雅,但它很简单,您无需阅读手册页即可完全了解自己在做什么:-)。
我编写了此单行代码,列出了所有没有相应远程分支的本地分支:
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
master
也在列出我,它没有按预期工作;小心
投票的答案确实有可能删除母版。考虑以下实际示例。
我有两个功能分支hemen_README和hemen_BASEBOX合并到development中,然后将development合并到master中。功能分支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)