Help us understand the problem. What is going on with this article?

SourceTreeでコミット間の差分ファイルを圧縮しないで取り出す方法

More than 5 years have passed since last update.

SourceTreeの「カスタムアクション」を使うと、git コマンドを用いて様々な操作を自動処理させることができます。

納品ファイルなどを作成するために、ある特定のリビジョンから別のリビジョンまでの差分を、zipアーカイブとして出力する方法は、下記サイトに紹介されていました。

ただし、zip圧縮ではなく、単純に差分ファイルを別ディレクトリ内に展開したかったので、やり方を調べてみました。
(下記の説明はMac OS 10.10.4での操作を前提としています)

バッチファイルの作成

上記サイトでは、バッチファイル(シェルスクリプト)に git archive コマンドを登録していましたが、代わりに git checkout-index コマンドを用いることで、非圧縮型のアーカイブ化が実現できます。

export_diff.sh
#!/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 フォルダを作った方が、管理がしやすいと思います。

また、シェルスクリプトを工夫することで、書き出し先のディレクトリ名を動的に生成させたりすることもできます。

一階層上のディレクトリに日付名でサブディレクトリを作って書き出す場合

export_diff2.sh
#!/bin/sh
today=`date +"%Y%m%d"`
git checkout-index -f --prefix=../archive/$today/ $1 `git diff --name-only $1 $2`
youthkee
ライブと写真が好きなWebデベロッパー。 本業の傍ら、Webサービスの制作・運営を行なっています。
http://littlebird.mobi
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした