在Git中与Git LFS的数据进行git diff比较
首先
在搜索如何对由Git LFS管理的数据进行git diff时,可以找到以下方法。
-
- Git LFS管理下にあるテキストファイルをgit diffする
- Will there be a git lfs diff command?
然而,根据我平时的使用习惯,发现有些地方不太方便,于是我进行了一些改动。
特点
-
- ファイル名指定なしで使える。
通常の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命令将会使用分页器。
[pager]
lfs-diff=true