私のチームメンバーには、うっかりして150以上のローカルブランチを中央リポジトリにプッシュしました。ありがたいことに、それらはすべて同じ接頭辞を持っています。そのプレフィックスを使用して、一度にそれらすべてを削除するgitコマンドまたはクールな小さなシェルスクリプトはありますか?
私のチームメンバーには、うっかりして150以上のローカルブランチを中央リポジトリにプッシュしました。ありがたいことに、それらはすべて同じ接頭辞を持っています。そのプレフィックスを使用して、一度にそれらすべてを削除するgitコマンドまたはクールな小さなシェルスクリプトはありますか?
回答:
次のコマンドを使用して、PREFIX
リモートサーバー上のプレフィックスを持つすべてのブランチを削除します。
git branch -r | awk -F/ '/\/PREFIX/{print $2}' | xargs -I {} git push origin :{}
最初に予行演習を実行して、削除するブランチであるかどうかを確認することができます。
git branch -r | awk -F/ '/\/PREFIX/{print $2}'
git branch -r | awk -F/ '/\/APR/{print $2}'
と、APRで始まるすべてのブランチ名が一覧表示されますか?
git branch -r | awk -F/ '/\/PREFIX/{print $2"/"$3}' | xargs -I % git push origin --delete %
より簡単なアプローチが必要な場合は、たとえば3つまたは4つのブランチを削除します。
git push origin --delete <branch1> <branch2> <branch3>
重要:Git v1.7.0以降でのみ機能します。
git branch -r | awk -F/ '/\/PATTERN/{print $2}' | xargs git push origin --delete
素晴らしいエレガントなソリューションを提供してくれた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 :{}
xargs -a file -L
代わりに使用しますcat file | xargs
。さらに簡単xargs -a file git push --delete origin
です。
これは重複した回答になる可能性がありますが、以下ではテストされ、完全に機能しました。
gitブランチ-Dブランチ名
git push origin --deleteブランチ名
gitブランチ-Dブランチ名1ブランチ名2
git push origin --deleteブランチ名1ブランチ名2
gitブランチ-D $(gitブランチ--list 'feature / *')
git branch -D backticks $(git branch --list 'feature / *' backticks)
gitブランチ-r | grep -Eo 'feature /.*'
gitブランチ-r | grep -Eo 'feature /.*' | xargs -I {} git push origin:{}
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
。
-i
それはデフォルトの置換を使用します{}
が、-I
あなたはあなた自身のものを宣言するかもしれません。...マニュアルに記載されています:-i ... the same as -I{}
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
xargs: replstr may not be empty
Neevekのソリューション、おそらくgitバージョンを使っていました。git version 1.9.5
しかし、これは私にとってはうまくいきました。おかげさまで
リソース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
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
Neevekに感謝します。私の目的のために再構成した後、これはうまくいきました:
git branch -r | awk -Forigin/ '/\/PATTERN/ {print $2 "/" $3}' | xargs -I {} git push origin :{}
フォルダ構造も考慮に入れる必要がありました。私の機能ブランチはorigin / feature / PREFIX-FEATURENUMBERのようなフォルダー構造にあります。したがって、パターンを$ 2 = folder + $ 3 = branchnameから構築する必要がありました。
誰もがを使用していますがawk
、理由はわかりません。それはもっと複雑な気がします。これが、fork
リモート上のすべてのリモートブランチを削除するために使用するものです。
$ git branch -r --list 'fork/*' | sed 's/fork\///' | xargs git push --delete fork
リモートブランチのサブセットのみにリストをフィルタリングする必要がある場合grep
は、xargs
との間にa を入れsed
ます。
origin/blaprefix_anotherbla
。しかし、使用sed
はそれをうまく処理しました。このアプローチのもう1つの利点は、bitbucketを使用していて、ブランチを削除するたびに認証パスワードを手動で入力する必要がないことです。これは、単一のバッチですべてのブランチを削除します。
git branch -r | egrep 'origin/greenkeeper' | sed 's/origin\///' | xargs -I {} git push origin --delete {}
origin / release / r1-1 *リモートブランチをすべて削除しようとしたので、次のコマンドラインはうまく機能しました。
git branch -r | awk -Forigin/ '/\/*r1-1/ {print $2}' | xargs -I {} git push origin :{}
ブランチの名前にスラッシュ構造を使用しているため、awkを使用できませんでした。
git branch -r | grep "origin/users/YOURNAME" | sed -r 's/^.{9}//'| xargs -i sh -c 'git push origin --delete {}'
これにより、すべてのリモートブランチが取得され、1人のユーザーのブランチのみが取得され、 "origin /"文字列がリモートになり、それぞれに対して削除が実行されます。
ドライラン:
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
以前の回答は、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コマンドを実行して、再試行してください。
私はリモートブランチを削除する方法が最善だと思います。
git branch -r | grep -v master | sed 's/origin\//:/'| xargs git push
$ 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'