コミット間、コミット前の差分抽出方法

コミット間、コミット前の差分抽出方法

差分をフォルダに抽出する


folderName=../diff/date '+%Y%m%d'/${PWD##*/}/
diff=git diff --diff-filter=d --name-only HEAD^ HEAD
git checkout-index -f --prefix=$folderName $diff

git checkout-index -f --prefix=../diff/date '+%Y%m%d'/${PWD##*/}/ git diff --diff-filter=d --name-only HEAD^ HEAD
これを使うと「.git」が入っているフォルダの
ひとつ上の階層から「diff/日付/」の中に
「最後のコミット」とその「親コミット」の差分が格納されます。

解説

git checkout-index

指定されたファイルをカレントディレクトリにコピーする

-f (force)

コピー先に同じものがあったら上書きします

--prefix=

カレントディレクトリの'前(pre)'の階層を指定します。
※格納するフォルダ名

git diff xxxxx

上記の例は最後のコミットとその親コミットの名前を出力します

git diff

差分表示コマンドです

--diff-filter=

どの差分を取ってくるか
今回の小文字[d]は削除されたものは取ってこないという意味

--name-only

差分のあるファイルの名前だけ表示

差分の取得

上記の例ではHEAD^とHEADの差分を取得しています。
ここをコミットIDに変えればコミット間の差分も取得できます。

HEAD

最後のコミット

HEAD^

最後のコミットの親コミット

その他

で囲むと先に処理してくれます。

${PWD##*/}

カレントディレクトリが取得できます

差分をフォルダにzipで抽出する


folderName=../archive/date '+%Y%m%d'/
diff=git diff --diff-filter=d --name-only HEAD^ HEAD
git archive --format=zip --prefix=$folderName HEAD $diff -o ${PWD##*/}.zip

git archive --format=zip --prefix=../archive/date '+%Y%m%d'/${PWD##*/}/ HEAD git diff --diff-filter=d --name-only HEAD^ HEAD -o ${PWD##*/}.zip
これを使うと「.git」が入っているフォルダの
ひとつ上の階層から「archive /日付/」の中に
「最後のコミット」とその「親コミット」の差分がZIPで格納されます。

解説

※「差分をフォルダに抽出する」で説明したものは省きます。

git archive

指定されたファイルのアーカイブを出力する

--format

フォーマットです。今回はzip!!

-o

ファイルを出力する
その次にファイル名を入力

コミット前の差分を抽出する (おまけ)

最後にコミット前の差分を抽出する方法を解説します。

コミット前の差分の抽出は普通にはできないと思います。


git checkout-index -f --prefix=$prefix git diff --diff-filter=d --name-only HEAD

例えばこれですが、変更したファイルが抽出されますが
内容は最後のコミットのものになってしまいます。

なので、そのあとにfor分で差分ファイルをコピーしてくればできます。


prefix=../diff/date '+%Y%m%d'/${PWD##*/}/

diffs=git diff --diff-filter=d --name-only HEAD

git checkout-index -f --prefix=$prefix $diffs

for diff in $diffs
do
  cp $diff $prefix$diff
done

使い方
コピペして「.sh」を作ってそれを
git bashとかのCUIにドラッグアンドドロップしてください。

ただ、何かもっといいやり方あるんじゃないの?
っていう気持ちになります。

もっと良い方法を知っている方がいれば
ぜひご教示ください!

https://github.com/417shena/no-commit-diff/blob/main/no-commit-diff.sh

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です