ブランチに関して、ローカルとリモートのリポジトリを常に同期させたい。
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
ます。
回答:
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
注:をオンmaster
にしていない場合、ブランチが削除される可能性があります。「より良い方法」のために読み続けてください。
あなたはそれを保証することができmaster
、またはそのことについては、他のブランチは、によって除去されないgrep
多くのためINGの。その場合、あなたは行くでしょう:
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
orにエイリアスを追加したいかもしれません.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
:名前を削除コマンドに渡します注:必要に応じて、削除を強制する-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-プルーン
対応するリモートブランチが削除された場合、ローカルブランチを削除します。
上記の説明は正しくありません。
実際、実行git pull --prune
すると、次のようなリモート追跡ブランチのみが削除されます
remotes / origin / fff remotes / origin / dev リモート/オリジン/マスター
次に、実行git branch -r
して、マシンに残っているリモート追跡ブランチをチェックできます。左のブランチが次のとおりだとします。
origin / dev 起源/マスター
つまり、ブランチ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
非常にシンプルなソリューション:ローカルリポジトリを削除し、リモートリポジトリを新たに複製します。とてもエレガントに見えないかもしれませんが、それは単純であり、manページを読まなくても、あなたが何をしているかを正確に理解できます:-)。
対応するリモートブランチがないすべてのローカルブランチを一覧表示するために、この1行を作成しました。
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
が、期待どおりに動作しません。注意してください
ブランチをマスターにプッシュしてマージした場合は、git bashで次のようにします。
git branch -d branch_name_to_delete
現在そのブランチにいる場合は、マスターに戻ります。この時点で、
git pull
投票した回答には、マスターを削除する可能性があります。以下の実際的な例を検討してください。
私は2つの機能ブランチ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
マスターも表示されていることに注意してください。マスターは最終的に削除されます。
いずれにせよそれはできた。どのようにしてそれを達成したかについて、セッションログをあなたと共有します。
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)