Gitでファイルの差分抽出してzipにするいろいろなコマンド-『Git』

ファイルを納品するとき、「差分ファイルのみをください」と言われて断れない人のためのGitで差分抽出するtipsです。

git archive と git diff を使った差分抽出

コマンドはgit archivegit diffが組み合わせることで実現します。


git archive [to_commitID] `git diff --name-only [from_commitID] [to_commitID] --diff-filter=ACMR` -o diff.zip

ファイルをアーカイブする git archive

git archive は、指定したブランチをまるっとアーカイブするコマンドです。オプション-o archive.zip で、ファイル名を指定します。


git archive [commit_ID] -o diff.zip

commit ID は git log --oneline とかで調べたものを入力します。

差分を確認する git diff

git diffは差分を確認するコマンドです。[from_ID] のコミットから [to_ID] のコミットまでというように期間を指定します。オプション –name-only は更新されたファイル名だけを返すようにします。


git diff --name-only [from_commitID] [to_commitID]

git diff をフィルターする –diff-filter=ACMR

ここまでの流れは、git diff で比較して差分のあるファイル名を返して、git archive でzipファイルを生成します。このままだとgit diff の返す内容には削除したファイルも含まれていることが原因で、git archive するときファイルが削除されていて見つからないけどなあっていうエラーが出てしまいます。

そこで、git diff のオプション –diff-filter=ACMR で、A 追加、C コピー、M 変更、R リネームのステータスを持つファイルを返す、という処理を追加します。


git archive [to_commitID] `git diff --name-only [from_commitID] [to_commitID] --diff-filter=ACMR` -o diff.zip

というわけで、最初のコードが完成しました。

色々な差分を抽出する

コミット間の差分を取るコードを紹介しました。様々な差分を抽出してみます。

ブランチ間の差分を抽出

develop というブランチと、リモートの master ブランチの差分を抽出します。


git archive develop `git diff --name-only origin/master develop --diff-filter=ACMR` -o archive.zip

ブランチの最新コミットから数値で指定

作業しているブランチの最新コミット(HEAD)からいくつ前のコミットの差分を取るか指定します。HEAD~[number] で、任意の数前のコミットの差分を抽出します。


git archive HEAD `git diff --name-only HEAD~3 HEAD --diff-filter=ACMR` -o diff.zip

というわけで、いい感じに差分抽出できるようになりました。また、スクリプトを登録して、SourceTree からGUIで簡単に実行できるようにしても素敵かもですね。

おわります。

Gitでファイルの差分抽出してzipにするいろいろなコマンド-『Git』のアイキャッチ画像

share

related