作業メモですが情報がなかったので備忘録
課題感
- PR作成時にPRのFile Changedタブに表示されるファイルリストがほしい
- headで触ったファイルのみにdiffがでる
- headにbaseブランチをマージしてもdiffがでない
- コンフリクト解消を除く
- baseブランチにコミットが追加されてもdiffが増えない
- Githubのcheckoutは基本 shallow clone(depth=1でとってくる)で、cloneに時間のかかるツリーを使った比較はしたくない
- 3点ドット(
git diff branchA…branchB
)を使うとツリー上の2ブランチの共通の親コミットまで遡ってbranchB
とのdiffをだしてくれるが、2ブランチが互いの共通コミットまで深くfetchする必要がある(baseブランチの共通コミットまでの深さは追えない) - つまり2点のコミット間の比較にしたい
- 3点ドット(
このメモでの言葉の使い方
- baseブランチ: PRの向き先
- headブランチ: PRの指定ブランチ
ほぼやりたいこと
全体方針は良いがやりたい要件には少し合わなかった
必要なこと
- PR作成後、baseブランチに変更が入るとdiffにどんどん追加されていく
-
github.event.pull_request.base.sha
かgithub.sha
のどちらかが片方しか更新されてない
-
参照できる変数
説明はみれるが具体的にどのタイミングの何を指してるかがわかりづらい
検証した結果
github.sha
Githubが作成するPRのマージブランチ(baseブランチの最新にheadブランチをマージしたブランチ)の最新コミット。参照するごとに更新されていて常にbaseの最新を向いてる
-
refs/remotes/pr/*/merge
ブランチのHEAD
github.event.pull_request.base.sha
PR作成時のbaseブランチの最新コミット(用途がわからん、バグ?)
参照ごとに更新されるわけでも、baseブランチとheadブランチの共通の親コミットでもないので今回のユースケースに利用すべきではない
github.event.pull_request.head.sha
baseブランチの最新コミット、常に更新される
-
refs/remotes/pr/*/head
ブランチのHEAD
解決策
github.sha
とbaseブランチ( github.event.pull_request.base.ref
からdepth: 1でとってくる)の2点を比較する
-
github.sha
のマージブランチへのマージコミットの前後を比較する
実際のワークフロー
steps:
# baseブランチの最新のコミットの取得
# 公式のaction使った方が早いらしい
# https://qiita.com/osakiy/items/0e18eee444446307b970
- name: Fetch Base Branch Latest Commit
uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.base.ref }}
fetch-depth: 1
# マージブランチのチェックアウト(デフォはgithub.shaに向いてる)
- name: Checkout Pull Request
uses: actions/checkout@v3
- name: Notice diff files
id: skip-test
run: |-
diff=$(git diff --name-only origin/${{ github.event.pull_request.base.ref }}..${{ github.sha }})
echo "::notice diff: $diff"