Git LFSとは
この辺を参照
https://www.slideshare.net/hibiki443/git-git-lfs-60951449
Git LFS 管理下のファイルのdiff
UnityのSceneファイル(.unity)やPrefabファイル(.prefab)はYAML形式で記述されていますが、
大きなプロジェクトでは、.unityと.prefabだけで1GBを超えるほど巨大になることがあります。
そのため、GitHubの1リビジョンあたりの容量制限(1GB)に引っかかり、泣く泣くこれらをLFS管理としています。
LFS管理下のファイルのdiffを取ろうとすると以下のように表示されます。
何かが変更されてサイズが変わったことしかわかりません。
また、GitHub上ではこのような表示になります。サイズ情報以外なにもわかりません。
LFS管理下ファイルのdiffの表示機能は、2014年ごろ、2015年ごろに2回議論されているようですが、
現在でもまだ実装されていないようです。
https://github.com/git-lfs/git-lfs/issues/440
https://github.com/git-lfs/git-lfs/issues/604
Git LFS管理下ファイルをdiffする
git lfsには smudge
という、LFS参照ファイルを実体ファイルに戻すコマンドがあるので、
これを利用して、リビジョン間のファイル比較をするShell Scriptを書いてみました。
#!/bin/bash
DIFFCOMMAND=diff
if [ $# -lt 1 ] ; then
echo "usage: $0 [rev1] [rev2] filename"
exit 1
elif [ $# -eq 1 ] ; then
$DIFFCOMMAND <(git show HEAD:"${@:1}" | git lfs smudge) "${@:1}"
elif [ $# -eq 2 ] ; then
$DIFFCOMMAND <(git show $1:"${@:2}" | git lfs smudge) "${@:2}"
else
$DIFFCOMMAND <(git show $1:"${@:3}" | git lfs smudge) <(git show $2:"${@:3}" | git lfs smudge)
fi
git lfs smudge
でLFS管理下ファイルの過去の状態を見に行って、
普通のdiffコマンドで比較しています。
ついでの機能として、ファイル名にスペースが含まれる場合、
スペースをエスケープしてもしなくても動くようにしています。
./lfs_diff.sh Assets/Aaa\ Bbb.prefab # これでも
./lfs_diff.sh Assets/Aaa Bbb.prefab # これでもよい
もともと.unityや.prefabのdiffを見てもあまり有益な情報は得られませんが、
「テキストを追加しただけなのにGameObjectの座標が変わっている。」とか、
「テキストが明らかにtypo」だとか、
「AttachしたはずのComponentが全部外れている」など、
diffからある程度のコードレビューはできるはずです。