ある Submodule の HEAD コミットハッシュをワンライナーで取得

これは以下で取得できます。SUBMODULE_DIR_NAMEは Submodule がマウントされているディレクトリ名に置き換えます。

git submodule --quiet foreach sh -c 'if echo `git rev-parse --show-toplevel` | grep SUBMODULE_DIR_NAME > /dev
/null; then echo `git log -1 --format="%H"`; fi'
# 75eb096b9114701bee035c203310e4f13aae365d

説明

  1. git submodule foreachは各 Submodule ディレクトリの中に入って何か処理を行う為のコマンドです。そのままだとEntering 'SUBMODULE_DIR_NAME'のように「今ここにいますよ」適なログがでますが、今回みたいな値を取りたいときなどには不要ものなので、--quietというフラグを付けて非表示にしています。
  2. 僕はfishシェルを使っているのですが、どうしてもif文がシンタックスエラーになり認識してくれませんでした。なので、sh -cで囲って?います。これだと認識してくれました。
  3. git rev-parse --show-toplevelでその Submodule のルートディレクトリの絶対パスを取得して、grep SUBMODULE_DIR_NAMEで扱いたい Submodule のディレクトリかを調べています。扱いたい Submodule だった場合のみ、ifの中身が実行されます。
  4. そしてecho $(git log -1 --format="%H")をします。これは-1は最新のコミットだけを対象にして、そのコミットのハッシュだけを表示するようにカスタマイズしたgit logです。

見やすいように整形

git submodule --quiet foreach \
  sh -c '
    if echo `git rev-parse --show-toplevel` | grep SUBMODULE_DIR_NAME > /dev/null
    then
      echo `git log -1 --format="%H"`
    fi
  '

ブランチ名で使う

Submodule の更新を都度プルリクで行うような場合、そのプルリク作成時に以下のように実行すると最新ハッシュを含んだブランチ名にできます。

git checkout -b SUBMODULE_DIR_NAME/(上の内容)
# すでにいる場合は以下でブランチ名リネームで
git branch -M SUBMODULE_DIR_NAME/(上の内容)