SourceTreeの「カスタムアクション」を使うと、git コマンドを用いて様々な操作を自動処理させることができます。
納品ファイルなどを作成するために、ある特定のリビジョンから別のリビジョンまでの差分を、zipアーカイブとして出力する方法は、下記サイトに紹介されていました。
ただし、zip圧縮ではなく、単純に差分ファイルを別ディレクトリ内に展開したかったので、やり方を調べてみました。
(下記の説明はMac OS 10.10.4での操作を前提としています)
バッチファイルの作成
上記サイトでは、バッチファイル(シェルスクリプト)に git archive コマンドを登録していましたが、代わりに git checkout-index コマンドを用いることで、非圧縮型のアーカイブ化が実現できます。
#!/bin/sh
git checkout-index -f --prefix=archive/ $1 `git diff --name-only $1 $2`
git checkout-index
コマンドには、 --prefix
オプションで出力ファイルにプレフィックスを付けることができますが、これを用いて展開先のディレクトリ名を指定することができます。
カスタムアクションの登録
上記テキストファイルを export_diff.sh
等のファイル名で保存し、「指定された差分でアーカイブ」という名前でカスタムアクションとして登録しました。
(パラメータには $SHA
を入力)
また、作成したシェルスクリプトに実行権限を追加しないと、カスタムアクションの実行時に「launch path not accessible」というエラーが発生してしまうので、ターミナルから以下のコマンドを実行しておきます。
chmod +x export_diff.sh
カスタムアクションの実行
SourceTreeの「ログ表示」画面で、Commandキーを押しながら2つのリビジョンを選択し、右クリックから「カスタムアクション」→「指定された差分でアーカイブ」を実行します。
すると、プロジェクトのルートディレクトリに archive
というフォルダが作成され、その中に差分ファイルが保存されます。
archive
フォルダ内の差分ファイルは、ルートからの階層を維持した状態で、サブディレクトリも作成されます。
まとめ&応用
納品する際に、パスワード付きzip等で暗号化する必要がある場合は、このようにいったん非圧縮型でアーカイブ化してから、手動で圧縮するフローにした方が便利かもしれません。
出力先のディレクトリは相対パスで指定できるので、gitの監視下にあるルートディレクトリよりも上の階層に archive
フォルダを作った方が、管理がしやすいと思います。
また、シェルスクリプトを工夫することで、書き出し先のディレクトリ名を動的に生成させたりすることもできます。
一階層上のディレクトリに日付名でサブディレクトリを作って書き出す場合
#!/bin/sh
today=`date +"%Y%m%d"`
git checkout-index -f --prefix=../archive/$today/ $1 `git diff --name-only $1 $2`