Gitで複数のリモートブランチを削除する


128

私のチームメンバーには、うっかりして150以上のローカルブランチを中央リポジトリにプッシュしました。ありがたいことに、それらはすべて同じ接頭辞を持っています。そのプレフィックスを使用して、一度にそれらすべてを削除するgitコマンドまたはクールな小さなシェルスクリプトはありますか?

回答:


150

次のコマンドを使用して、PREFIXリモートサーバー上のプレフィックスを持つすべてのブランチを削除します。

git branch -r | awk -F/ '/\/PREFIX/{print $2}' | xargs -I {} git push origin :{}

最初に予行演習を実行して、削除するブランチであるかどうかを確認することができます。

git branch -r | awk -F/ '/\/PREFIX/{print $2}'

2
ワンライナーなので、最初にドライランができるので、これが好きです。残念ながら、このメッセージで出てエラー: $ git branch -r | awk -F/ '/\/APR/{print $2}' | xargs -I {} git push origin :{} error: unable to push to unqualified destination: APR-04-DPH The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'GIT_URL'
ジェイクA.スミス

を使用するgit branch -r | awk -F/ '/\/APR/{print $2}'と、APRで始まるすべてのブランチ名が一覧表示されますか?
12

1
OK、APR-04-DPHブランチがすでに削除されているためです。これらの回答された質問を見てください:this and this and this this。これらの質問への回答は同じ問題を扱っているので、ソリューションを自分でテストすることをお勧めします。
neevek

26
あなたは(あなたはgitの流れか何かを使用している場合)あなたのブランチ名に/がある場合は、{$ 2「/」$ 3}の代わりを印刷する
ajma

4
私は、Windowsのmsysgitを使用していますし、次のコマンドは、スラッシュを含むブランチ名のajmaさんのコメント@と一緒に(私の仕事:git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
rikoe

96

より簡単なアプローチが必要な場合は、たとえば3つまたは4つのブランチを削除します。

git push origin --delete <branch1> <branch2> <branch3>

重要:Git v1.7.0以降でのみ機能します


6
結局使用しましたgit branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
Aram Kocharyan

36

素晴らしいエレガントなソリューションを提供してくれたNeevekに感謝!

しかし、awkフィールド区切り文字/-Fオプション)が原因で、ブランチ名のスラッシュ(Git Flowを使用しています)に問題があります。

したがって、私の解決策はNeevekのに基づいていますが、でブランチ名を正しく解析し/ます。この場合、私はあなたのリモコンがを呼んだと思いますorigin。で始まる名前のリモートブランチを削除するコマンドPATTERN

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}' | xargs -I {} git push origin :{}

また、何を削除するかを確認することを忘れないでください。

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2}'

便利なヒント:ブランチ名(origin/プレフィックスなし)がテキストファイル(1行に1つのブランチ名)に保存されている場合は、次のコマンドを実行します。

cat your_file.txt | xargs -I {} git push origin :{}

2
xargs -a file -L代わりに使用しますcat file | xargs。さらに簡単xargs -a file git push --delete originです。
musiKk 2015

15

これは重複した回答になる可能性がありますが、以下ではテストされ、完全に機能しました。

  1. ローカルブランチを強制的に削除します

gitブランチ-Dブランチ名

  1. リモートブランチを削除

git push origin --deleteブランチ名

  1. 複数のローカルブランチを削除する

gitブランチ-Dブランチ名1ブランチ名2

  1. 複数のリモートブランチを削除する

git push origin --deleteブランチ名1ブランチ名2

  1. 接頭辞付きのローカルブランチを削除します。たとえば、feature / *

gitブランチ-D $(gitブランチ--list 'feature / *')

git branch -D backticks $(git branch --list 'feature / *' backticks

  1. 接頭辞付きのリモートブランチを一覧表示します。

gitブランチ-r | grep -Eo 'feature /.*'

  1. 接頭辞付きのリモートブランチを削除します

gitブランチ-r | grep -Eo 'feature /.*' | xargs -I {} git push origin:{}


2
ステップ5でバッククォートをエスケープするつもりだったと思います
GPL

バックティックを追加するには?
Naren

1
@Naren:問題は、マークダウンフォーマットがバックティックをスタイリングコマンドに変えることです。私はそれらを別のコマンド置換メソッドで置き換えました(たとえば、「$(command)」は「command」と同等ですが、マークダウンによって変なものに変換されません。)他にできることは、「\」でバッククォートをエスケープすることです。
ステーブルドッグ

13

grep:でも同じです git branch -r | grep -Eo 'PREFIX/.*' | xargs -i git push origin :{}

branch -r示していますorigin/prefix/branchname。だからそれはかかりprefix/branchnameます。


私はあなたが意味するものだと思うxargs -I {} git push origin :{}、ではありません-i
ジョジョ

1
@ jojo、AFAIK、-iそれはデフォルトの置換を使用します{}が、-Iあなたはあなた自身のものを宣言するかもしれません。...マニュアルに記載されています:-i ... the same as -I{}
Kirby

10

Neevekのソリューションは洗練されていますが、より優れている場合があります。提案されているソリューションは、ブランチごとに1回「git push」を呼び出します。つまり、ブランチごとに追加のネットワークラウンドトリップが削除されます。とにかくawkを使用しているので、 ':'のプレフィックスに使用しないと、xargsは 'git push'を1回だけ呼び出して、すべてのブランチを一度に削除できます。

削除されるブランチをリストするための予行演習:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}'

削除を実際にプッシュする最終的な解決策:

git branch -r | awk -F/ '/\/PREFIX/{print ":" $2}' | xargs git push origin

2
以前のバージョンのbashがある場合、またはWindowsバージョンのgit bashを使用している場合に、xargsに "-I"オプションを使用できない状況で完全に機能します。
zchholmes 2015年

私はxargs: replstr may not be emptyNeevekのソリューション、おそらくgitバージョンを使っていました。git version 1.9.5しかし、これは私にとってはうまくいきました。おかげさまで
IamFace 2015年

8

リソースhttps://coderwall.com/p/eis0ba

    1 - List all your remote branches:

    $ git branch -r

    2 - Filter the branches by some regular expression. In this case I'm interested in deleting any branch with the 'feature-' prefix:

    $ git branch -r | awk -F/ '/\/feature-/{print $2}'
    3 - Pipe the last command to git push to delete them:
    # **Edit** - Removed extra colon, which is not needed
    $ git branch -r | awk -F/ '/\/feature-/{print $2}' | xargs -I {} git push origin {}
    4 - Grab a beer.

    5 - Remove any local reference to those branches:

    $ git remote prune origin

これは私のために働いてくれてありがとう。muの場合、複数のローカルブランチを削除できます。ありがとう!
Prashant Kabade 2017年

5

SteveとNeevekのおかげで、共有する価値があると思った解決策を見つけました。

スティーブの解決策は、1つの小さな調整で私のために働きました。私のリモコンに名前が付けられたorigin/feature/some-feature-nameので、私はあなたをトリミングしましたawk

git branch -r | awk -Forigin/ '/\/feature/ {print $2 $3}' | xargs -I {} git push origin :{}

これで、素敵な小さな削除フローが実行されます。

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
To github.com:project/project-name.git
- [deleted]         feature/search-placeholder
To github.com:project/project-name.git
- [deleted]         feature/server-error-message
To github.com:project/project-name.git
- [deleted]         feature/six-point-asterisk

しかし、誰かがよりエレガントなソリューションのアイデアを持っているかどうか疑問に思っていましたが、それは次のようなものを出力する可能性があります(私のCLIスクリプトはかなり貧弱なので、これを理解するにはしばらく時間がかかります):

git push origin :feature/search-min-chars :feature/search-placeholder :feature/server-error-message :feature/six-point-asterisk

これにより、1つのネットワークリクエストで1つの出力が生成されます。

To github.com:project/project-name.git
- [deleted]         feature/search-min-chars
- [deleted]         feature/search-placeholder
- [deleted]         feature/server-error-message
- [deleted]         feature/six-point-asterisk

4

Neevekに感謝します。私の目的のために再構成した後、これはうまくいきました:

git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2 "/" $3}' | xargs -I {} git push origin :{}

フォルダ構造も考慮に入れる必要がありました。私の機能ブランチはorigin / feature / PREFIX-FEATURENUMBERのようなフォルダー構造にあります。したがって、パターンを$ 2 = folder + $ 3 = branchnameから構築する必要がありました。


4

誰もがを使用していますがawk、理由はわかりません。それはもっと複雑な気がします。これが、forkリモート上のすべてのリモートブランチを削除するために使用するものです。

$ git branch -r --list 'fork/*' | sed 's/fork\///' | xargs git push --delete fork

リモートブランチのサブセットのみにリストをフィルタリングする必要がある場合grepは、xargsとの間にa を入れsedます。


1
どうもありがとう。これは実際にすべてのソリューションの中で私のために働きました。grepはと同様にリモート名で完全なブランチを返していましたorigin/blaprefix_anotherbla。しかし、使用sedはそれをうまく処理しました。このアプローチのもう1つの利点は、bitbucketを使用していて、ブランチを削除するたびに認証パスワードを手動で入力する必要がないことです。これは、単一のバッチですべてのブランチを削除します。
Madhur Bhaiya

すべてのグリーンキーパーブランチを削除するにはgit branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
abhisekp

4

私はこれがgitコマンド用であることを理解していますが、同様または同じ結果を行うための代替ソリューションを探している場合:

あなたはここからそれを行うことができます(Gitはリモートブランチを削除します):

次に、必要なブランチを選択します。

リモートブランチを削除する権限があることを確認してください。


これは最高の答えになるはずです。プラットフォームに依存しません。
カーミントン

ソフトウェアは何ですか?それはLinuxで利用できますか?
abhisekp

1

Githubには、ブランチをすばやく削除するための優れたUIとメカニズムもあります。つまり、UIを使用する場合です。


1
はい、ここに記載されていますが、個々のブランチごとに1回クリックする必要があります。ここで最も投票されたソリューションは、一致する正規表現を記述できる多くの分岐を行うための最良の方法です。
thewoolleyman

0

origin / release / r1-1 *リモートブランチをすべて削除しようとしたので、次のコマンドラインはうまく機能しました。

git branch -r | awk -Forigin/ '/\/*r1-1/ {print $2}' |  xargs -I {} git push origin :{}

0

ブランチの名前にスラッシュ構造を使用しているため、awkを使用できませんでした。

git branch -r | grep "origin/users/YOURNAME" | sed -r 's/^.{9}//'| xargs -i  sh -c 'git push origin --delete {}'

これにより、すべてのリモートブランチが取得され、1人のユーザーのブランチのみが取得され、 "origin /"文字列がリモートになり、それぞれに対して削除が実行されます。


0

ドライラン:

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} echo {}

リモートブランチを削除します。

git branch -r --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

完全にマージされたリモートブランチのみを削除します。

git branch -r --merged --list 'origin/your-branch-name/*' | sed "s/origin\///" | xargs -I {} git push origin --delete {}

説明:

sed "s/origin\///"origin/ブランチ名から削除されます。それを取り除くことなく、私は得ました:remote ref does not exist


0

以前の回答は、2018年からすべてのリリースブランチを削除するのに役立ちました。これをWindows 10コマンドプロンプトで実行しました。clinkをインストールしたので、Linuxのようなコマンドが機能します。

ドライラン:

git branch -a | grep -o "release-.*2018" | xargs -I {} echo {}

予行演習で、リモート/オリジンにないブランチが表示された場合。以下のgit pruneコマンドを実行して修正し、再度確認します。

git remote prune origin

上記の結果に満足したら削除します。

git branch -a | grep -o "release-.*2018" | xargs -I {} git push origin --delete {}

表示される場合:error: unable to delete 'release-...2018': remote ref does not exist。次に、前のpruneコマンドを実行して、再試行してください。


-4

警告:これにより、すべてのリモートブランチが削除されます。注意して使用してください。

私はリモートブランチを削除する方法が最善だと思います。

git branch -r | grep -v master | sed 's/origin\//:/'| xargs git push

警告:これにより、すべてのリモートブランチが削除されます。注意して使用してください。


4
明らかなトロールとして反対票を投じた。権利があれば削除します。
ジェイクA.スミス

どこでトローリングを見つけましたか?
Dmytro Gorpynenko、2014

2
これは正しくありません。xargsの重要な引数が不足しているため、質問の答えにはなりません。
Rob

@ JakeA.Smith Jake、このコードはリモートマスターを削除すると思ったと思います-これはgrep -v masterがマスター以外のすべて見つけるのとは異なります。
Vadim Samokhin、2014

@Robここで何が間違っていますか?最後に実行されるステートメントはgit push:some_branch:another_branchのように表示されますが、これは完全に正しいことです。
Vadim Samokhin、2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.