実現したいこと
GitLabにおいて、マージ済みのブランチを自動で削除したいです。
GitLab CIを利用して、パイプラインの中で削除する仕組みを考えています。
前提
Git-Flowを採用
developブランチにマージ済みのfeatureブランチを削除したい
発生している問題・エラーメッセージ
bash
1git branch -a --merged $TARGET_DEVELOP_BRANCH | egrep -v "(^*|master|develop)" | xargs -I% git push -d origin %
ネット検索すると上記のような削除するスクリプトがたくさん表示されましたが、意図しないブランチも削除されてしまいました。
それは、developブランチからブランチを作成した直後のコミットが入っていないfeatureブランチも削除されてしまうことです。
例えば、
develop/hogeというブランチから
- feature/no_commit : まだコミットが入っていない
- feature/plan_to_commit : コミットがありマージされる
のブランチを作成するケースを考えます。
bash
1git clone $GIT_REPO 2git checkout develop/hoge 3git branch feature/no_commit 4git checkout -b feature/plan_to_commit 5echo hogehoge >> README.md 6git add . 7git commit -m "Update README.md" 8git checkout develop/hoge 9git merge feature/plan_to_commit
ここで、マージ済みを抽出するために下記コマンドを実行すると、
bash
1git branch --merged
このような結果になります。
master * develop/hoge feature/plan_to_commit feature/no_commit
この際に、feature/plan_to_commitだけをマージ済みブランチとして表示したいのですが
feature/no_commitもマージ済み対象となってしまいます。
Gitの仕様上、ブランチ作成後にコミットがない場合はマージ済みとして扱われるのは仕方ないとは理解しています。
しかし私の状況に照らし合わせると、
折角リモートのGitLab上でfeatureブランチを作成したにもかかわらず
ローカルで開発中でまだリモートにPushしていない時に、リモートのfeatureブランチが削除されてしまうことになります。
(毎回、git push --set-upstream origin $BRANCH_NAME
のようにブランチを再作成するのは避けたい)
試したこと
aheadとbehindの差から判断する
bash
1git rev-list --left-right --count develop/hoge...feature/no_commit
参考:stack overflow : git ahead/behind info between master and branch?
git merge-baseでancestorを探す
補足情報
下記によりブランチ削除ができることは調査済みです。
- GitLabの機能でMerge Request承認時にブランチを削除するか選択できる
- マージ済みブランチを削除するGitLab APIが存在する
これらの解決方法はそれぞれ下記の点から採用しづらい状態です。
- 開発者がチェックを忘れる時があるため、不要ブランチが残存することがある
- default branchがmasterではない。また、default branchと指定するdevelopブランチ以外にも他のdevelopブランチが複数存在している。
ここまでご覧頂きありがとうございました。何か解決策をお持ちの方がいらっしゃいましたら、ご教授いただけると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。