9

リモート ブランチのクリーニングを自動化したい。ブランチがすでにマスターにマージされているかどうかを確認できるようにしたい。当初、私の計画は git merge-base を使用して最後の共通コミットを確認することでした。

しかし、ブランチを master にマージする際に、すべてのブランチを押しつぶしてしまうことがわかりました。これにより新しいコミット ハッシュが作成されるため、マスターとブランチの間で共通のコミットを見つけることができません。

マージ時にブランチをすべて押しつぶした場合、ブランチがマージされたかどうかを判断するにはどうすればよいですか?

前もって感謝します!

4

2 に答える 2

3

1 つのアプローチを次に示します。

  1. GitHub API を使用して、マージされたすべてのプル リクエストの HEAD SHA を取得します。
  2. これらの SHA をローカル ブランチと照合します。

ローカル ブランチの HEAD が、マージされた PR の HEAD に対応している場合は、安全に削除できます。これは、PR がどのようにマージされたか (完全なマージ、早送り、スカッシュ、およびマージ) に関係なく機能します。

このアプローチをdelete-squashed-branchesスクリプトに実装しました。使い方はこんな感じです。

(master) $ git branch
  delete-merged-prs
  fixup
  unmerged-branch
* master

(master) $ delete-squashed-branches
Finding local branches which were merged onto origin/master via GitHub...
warning: deleting branch 'delete-merged-prs' that has been merged to
     'refs/remotes/origin/delete-merged-prs', but not yet merged to HEAD.
Deleted branch delete-merged-prs (was 325a42b).
warning: deleting branch 'fixup' that has been merged to
     'refs/remotes/origin/fixup', but not yet merged to HEAD.
Deleted branch fixup (was e54f54b).

(master) $ git branch
  unmerged-branch
* master

(ブランチは Squash & Merge を介して master にマージされているため、警告は無視できます。)

警告:

  • pip install pygithubスクリプトを使用する必要があります。
  • にマージされたローカル ブランチを探しますorigin/(current branch)。したがってmaster、 、developまたは作業しているブランチで実行する必要があります。
  • 存続期間の長いブランチが複数ある場合、このアプローチはうまく機能しません。
于 2016-11-03T19:25:07.193 に答える
2

次のように、実験的なマージを実行して、変更が導入されるかどうかを確認できます。

git checkout -b foo-merge-test-branch master
git merge --squash foo
if [ -n "$(git status --porcelain)" ]; then 
  echo "foo has not been merged";
else 
  echo "foo is already merged";
fi
git reset --hard && git checkout master && git branch -d foo-merge-test-branch

これは、元のファイルで変更されたファイルのいずれも、それ以降git merge --squash foo競合する変更が行われていない場合にのみ機能しますmaster

于 2014-12-03T02:13:58.570 に答える