シェルスクリプトで便利な git
の使い方
概要
git
コマンドはとにかく便利で、大体なんでも取れる。
SHA-1 Hash を取る。
予想外に色々なやり方がある。
git rev-parse HEAD
git rev-parse --short HEAD # short
git rev-list --max-count=1 HEAD
git show -s --format=%H HEAD
git show -s --format=%h HEAD # short
git show-ref --hash --head HEAD
検証はしていないけど、多分 git rev-parse
が速そうな空気感を醸し出している。
Commit Message を取る。
git show -s --format=%B HEAD
例は HEAD だけど勿論 Branch や Hash を直で指定も出来る。
Commit したときの UNIX time を取る。
git show -s --format=%ct HEAD
UNIX time が取れると便利で、例えば「HEAD より過去のコミットが指定された時は無視する」みたいな機能を割と簡単に実装することが出来る。
指定された Hash が指すコミットが存在するのか調べる。
git show
の終了コードを見れば良い。
#!/usr/bin/env bash
HASH="0123456789abcdef0123456789abcdef01234567"
git show "$HASH" > /dev/null 2>&1
if [ 0 -ne $? ]; then
echo 'not found.' 1>&2
exit 1
fi
バリデーション用途や、既に存在してれば git fetch
をスキップするなどの用途などが考えられる。
diff があるかチェックする。
git diff
に --exit-code
を付けると diff
コマンドと同じような終了コードで終わってくれるので判定に使うことが出来る。
ついでに --quiet
を付ければ > /dev/null 2>&1
する必要もなくなり見通しも良い。
#!/usr/bin/env bash
TARGET="path/to/file_or_dir"
HASH_1="0123456789abcdef0123456789abcdef01234567"
HASH_2="fedcba9876543210fedcba9876543210fedcba98"
git diff --exit-code --quiet "$HASH_1" "$HASH_2" "$TARGET"
if [ 0 -ne $? ]; then
echo 'diff exists.'
fi
「このファイルが変わってるときだけ再起動する」とか「このディレクトリに変化があるときだけキャッシュを飛ばす」などの用途に使える。
念のため remote の URL をきっちり指定し直す。
拠所無い事情から「ssh を使って欲しくて user も git に指定して port も 22 番を指定するように origin
の remote url を直したい」みたいなときがあって、そういうときは git remote set-url
でなんとかなる。
git remote set-url origin ssh://git@github.com:22/user/repository.git
などとすれば良い。良いのだけど、しかし、こういう場合は ~/.gitconfig
に
[url "ssh://git@github.com:22/"]
insteadOf = git@github.com:
insteadOf = http://github.com/
insteadOf = https://github.com/
などと書いたりする方が健全かなとも思う。
SHA-1 っぽい文字列かどうかチェックする。
これは git
に関係ないけど、 grep -E
で ^[0-9a-f]{40}$
にヒットするか調べて終了コードを見れば良い。
#!/usr/bin/env bash
HASH="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
echo "$HASH" | grep -E '^[0-9a-f]{40}$' > /dev/null 2>&1
if [ 0 -ne $? ]; then
echo 'invalid format.' 1>&2
exit 1
fi
MD5
なら 32 文字で SHA-256
なら 64 文字になるはず。
締め
GIT_SSH_COMMAND が便利だった話もあり、シェルスクリプトはいくつになっても書く機会がある。