これは以下で取得できます。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
説明
git submodule foreach
は各 Submodule ディレクトリの中に入って何か処理を行う為のコマンドです。そのままだとEntering 'SUBMODULE_DIR_NAME'
のように「今ここにいますよ」適なログがでますが、今回みたいな値を取りたいときなどには不要ものなので、--quiet
というフラグを付けて非表示にしています。僕は
fish
シェルを使っているのですが、どうしてもif
文がシンタックスエラーになり認識してくれませんでした。なので、sh -c
で囲って?います。これだと認識してくれました。git rev-parse --show-toplevel
でその Submodule のルートディレクトリの絶対パスを取得して、grep SUBMODULE_DIR_NAME
で扱いたい Submodule のディレクトリかを調べています。扱いたい Submodule だった場合のみ、if
の中身が実行されます。そして
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/(上の内容)