はじめに
Git LFSで管理されているデータをgit diff
する方法を調べると以下のようなものが見つかります。
ただ、私の普段の使い方からすると使いにくい部分があり、少し改造してみました。
特徴
- ファイル名指定なしで使える。
- 通常の
git diff
と同じように、引数なしで未コミットの変更箇所がすべて表示されます。 - 引数でファイル名を指定した場合はそのファイルのみ表示します。
- 元のスクリプトにあったリビジョン指定は実装していません。
- 圧縮したテキストデータが扱える。
- zip/gz/bzip2/xzは展開してからdiffします。
-
git diff
と(なるべく)同じフォーマット出力。 - 内部的に
git diff
そのものを使っているので色付けなどもgit diff
と同じです。 - 標準入力から
git diff
に無理矢理入れている関係で、ファイル名がハッシュ値になってしまいますが…。
スクリプト
# !/bin/bash
GIT=git
declare -A filters
filters['bz2']='bunzip2'
filters['gz']='gunzip'
filters['xz']='unxz'
filters['zip']='unzip -p'
MODIFIED=`$GIT ls-files -m`
function lfs_diff () {
lfs_info=`$GIT show HEAD:"./$1"`
if [[ "$lfs_info" =~ ^version\ https://git-lfs\.github\.com/spec/v1 ]]; then
echo $1
ext="${1##*.}"
filter=${filters[$ext]}
if [[ $filter != "" ]]; then
$GIT diff $($GIT show HEAD:"./$1" | $GIT lfs smudge | $filter | $GIT hash-object -w --stdin) $(cat "$1" | $filter | $GIT hash-object -w --stdin)
else
$GIT diff $($GIT show HEAD:"./$1" | $GIT lfs smudge | $GIT hash-object -w --stdin) $(cat "$1" | $GIT hash-object -w --stdin)
fi
echo ""
fi
}
if [[ $# == 0 ]]; then
for f in $MODIFIED; do
lfs_diff $f
done
else
for f in $@; do
lfs_diff $f
done
fi
使い方
スクリプトをgit-lfs-diff
というファイル名で保存して実行権限を付け、パスの通ったところに置いて下さい。以下の通りgitのサブコマンドとして動作します。
$ git lfs-diff
また、.gitconfig
に以下の設定をすれば、git diff
のデフォルト動作と同様にページャが使われます。
.gitconfig
[pager]
lfs-diff=true