タグ: git

  • Gitで差分ファイルのアーカイブ(ZIP)を取得する。特に“/usr/bin/git: Argument list too long”と怒られた人向け。

    これに至った経緯。

    ・すでに稼働中のWebサイト(他社が構築したもの)の改修案件。
    ・既存のソースをすべてGitにぶち込んで、SourceTreeで管理。
    ・WordPressで構築されているのでファイル多杉。差分ファイルだけを納品したい。

    みたいな感じ。

    20150528_01
    こんな感じで、Commandクリックで2つ選択して、その差分ファイルをZIPで書きだそうぜ!という試み。

    手順としては、ターミナルから動作するシェルプログラムを作成して、それをSourceTreeのカスタムアクションに登録して起動させるというもの。

    まずはシェルの作成。

    diff_archive.sh

    #!/bin/sh
    if [ "$2" = "" ]; then
    	git diff --name-only HEAD $1 | xargs git archive --format=zip --prefix=_diff_archive/ HEAD -o _diff_archive.zip
    else
    	git diff --name-only $1 $2 | xargs git archive --format=zip --prefix=_diff_archive/ $1 -o _diff_archive.zip
    fi

    ネットでよく見かけるのは、

    git archive --format=zip --prefix=archive/ $1 `git diff --name-only $1 $2` -o archive.zip

    こんな感じのもの。この場合、差分ファイル数が多すぎる場合、/usr/bin/git: Argument list too longって怒られます。その対策として、多少環境に依存しちゃいますが、xargsでgit archiveに放り込んで行きます。

    んで、このシェル(diff_archive.sh)に実行権限を付与。
    右クリックの「情報を見る」で、ユーザ行の実行チェックボックスをチェック。

    次に、そのシェルプログラムをSourceTreeのカスタムアクションに登録。

    20150528_02
    SourceTreeの環境設定から、カスタムアクションタブを開いて、アクションを追加。

    これで準備完了。
    このエントリーの最初の画像のように、2つのコミット行を選択して、右クリック。
    カスタムアクションから「指定された差分をZIPで書きだす」(追加したアクションで登録した名称)をクリックで、gitのディレクトリに_diff_archive.zipが書きだされます。

    参考サイト

    Argument list too longって怒られない人向け
    http://ics-web.jp/lab/archives/4475

    怒られちゃった人への対処方法
    http://blog.shnr.net/gitで差分のエクスポート/

    で、このページがその両方をまとめたものになります。

    Gitが、おもしろいほどわかる基本の使い方33〈バージョン管理、SourceTree、Bitbucket〉
    大串 肇 久保靖資 豊沢泰尚
    エムディエヌコーポレーション
    売り上げランキング: 4,591