web-dev-qa-db-ja.com

リモートリポジトリでローカルGitブランチを削除した後に削除する

ブランチに関して、ローカルとリモートのリポジトリを常に同期させたい。

GitHubでプルリクエストのレビューを行った後、ブランチをマージして削除します(リモート)。ローカルリポジトリでこの情報を取得し、Gitにブランチのローカルバージョンも削除させるにはどうすればよいですか?

157
sf89

簡単な方法

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

したがって、たとえばmasterdevelop、およびstagingを保持したい場合は、次のようにします。

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
176
sf89

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

参照:

http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches

76
Alessio

試してください:

 git pull-プルーン

対応するリモートブランチが削除されると、ローカルブランチが削除されます。

更新しました:

上記の記述はそれほど正確ではありません。

実際、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はそれらすべてを削除できます。

71
nicky_zs

これは、受け入れられたソリューションでmasterおよびdevelopmentブランチの削除を回避するために動作するはずです:

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

Powershellを使用している場合、これは答え 上記 と同等です。

git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
  1. goneとしてマークされているすべてのブランチをフィルタリングします
  2. 見つかった各ブランチでgit branch -Dを呼び出します
14
amaechler

これは私には役に立たなかった。私の他の答えはここにあります: 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
5
Karl Wilbur

非常に簡単なソリューション:ローカルリポジトリを削除し、リモートリポジトリを新たに複製します。とてもエレガントに見えないかもしれませんが、それは単純で、manページを読まずにあなたが何をしているのか正確に理解できます:-)。

5

マージされたローカルブランチを削除するには、次のようにします。

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

存在しない追跡も削除したい場合:

git pull --Prune
2
alacambra

対応するリモートブランチを持たないすべてのローカルブランチをリストするために、このワンライナーを作成しました。

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
1
ks1322

ブランチをマスターにプッシュしてマージしたばかりの場合は、git bashで次の操作を実行します。

git branch -d branch_name_to_delete

現在そのブランチにいる場合は、マスターにプッシュバックされます。この時点で、プルを行います

git pull
0