在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
bannerAds