Edited at

Git LFS管理下にあるテキストファイルをgit diffする

More than 1 year has passed since last update.


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を書いてみました。


lfs_diff.sh

#!/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


https://gist.github.com/gecko655/a76f9185e635b80410dd9b4c2c55a1a0

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からある程度のコードレビューはできるはずです。