3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Git LFSのデータをgit diffする

Posted at

はじめに

Git LFSで管理されているデータをgit diffする方法を調べると以下のようなものが見つかります。

ただ、私の普段の使い方からすると使いにくい部分があり、少し改造してみました。

特徴

  • ファイル名指定なしで使える。
  • 通常の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のデフォルト動作と同様にページャが使われます。

.gitconfig
[pager]
lfs-diff=true
3
4
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
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?