git diff でコミットハッシュを指定したら fatal: bad object 【Github Actions】

TIPS

こんにちは。ざわかける!のざわ(@zw_kakeru)です。
タイトルの通り、Github Actionsでハッシュ値を指定してgit diffしようとしたら出来なかった時のメモです。

起こったこと

Github Actionsでmainブランチへのpushをトリガーにして、前のコミットとの差分を見てゴニョゴニョしようとしました。(関係部分だけ抜粋)

on:
  push:
    branches:
      - main

jobs:
  hoge-job:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4
      - name: get diff
        run: |
          git diff --name-only ${{ github.event.before }} ${{ github.sha }}

${{ github.event.before }}で直前のコミットハッシュ、${{ github.sha }}で今積んだコミットハッシュが取得できるのでこれらのdiffを見ようとしたところエラーが出ていました。

fatal: bad object XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXX…のところに記述されたハッシュ値は直前のコミット(= ${{ github.event.before }}) の方でした。
コミット情報がうまく取れてない。。。???

やったこと

試しにコンソール上にgit logを出してみました。

      - name: get diff
        run: |
          git log

すると、ここで出力されたログは${{ github.sha }}のコミット分だけでした。

すなわち、GithubActionsのcheckoutでは最新のコミット(コミットをトリガーにしている場合は今積んだコミット)の情報しかチェックアウトされないみたいです。
どうもcheckout@v2からそういう仕様だそうです。(参考:https://github.com/actions/checkout/issues/161 )
そんなん知らんやん。。
というわけで過去のコミット情報が欲しいので、自前でgit fetchで取って来ます。

      - name: get diff
        run: |
          git fetch --depth 1 origin ${{ github.event.before }}
          git diff --name-only ${{ github.event.before }} ${{ github.sha }}

このように指定して実行することで、無事に2つのコミットのdiffを取る事ができました。
今回は直前のコミットを取ってくるだけだったので、depthを指定することで余計なコミット情報を取ってくることなくスマートに処理を行うことができましたね。
(diffを見るだけなのでgit checkoutも不要です。)
にしてもコミットハッシュは最初から取れるのに、その内容が取れなかったら意味ないのでは。。と思ってしまいました。

おわりに

調べてもなんかあんまり情報が出てこなかったので正しい対応ではないかもしれません。
ひとまずこれでできた&理解もできたので、メモとして残しておきます。
GithubActionsはテスト実行が結構大変なので本来なら何かしら簡単に行える仕組みを作らないといけないんだろうなあ。。いつかやりたいです。

タイトルとURLをコピーしました