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

table of contents

    ファイルを納品するとき、「差分ファイルのみをください」と言われて断れない人のための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