LoginSignup
2
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-02-27

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を取ろうとすると以下のように表示されます。

スクリーンショット 2017-02-27 10.21.27.png

何かが変更されてサイズが変わったことしかわかりません。

また、GitHub上ではこのような表示になります。サイズ情報以外なにもわかりません。

スクリーンショット 2017-02-27 10.23.04.png

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

スクリーンショット 2017-02-27 10.46.35.png

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

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3