141

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

4

18 に答える 18

171

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

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

最初にドライランを実行して、削除するブランチであるかどうかを確認することをお勧めします。

git branch -r | awk -F/ '/\/PREFIX/{print $2}'
于 2012-05-11T16:36:23.890 に答える
31

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

  1. ローカルブランチを強制削除

git branch -D ブランチ名

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

git push origin --delete ブランチ名

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

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

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

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

  1. プレフィックス付きのローカル ブランチを削除します。たとえば、機能/*

git branch -D $(git branch --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 プッシュ元:{}

于 2019-02-14T19:33:24.963 に答える
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
于 2014-01-30T15:00:58.320 に答える
5

ニーベックに感謝します。これは、私の目的に合わせて再構成した後、うまく機能しました。

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

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

于 2014-09-04T11:30:34.850 に答える
1

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

于 2015-09-09T09:06:05.890 に答える
1

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

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

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

于 2015-01-28T17:13:24.097 に答える