シェルスクリプトで便利な 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 が便利だった話もあり、シェルスクリプトはいくつになっても書く機会がある。