search
LoginSignup
3

More than 1 year has passed since last update.

posted at

updated at

SourceTreeを使った差分抽出、最終版【macOS】

受託案件をやっていると
「差分で納品ファイルください」
と言われることが多いと思いますが、
その時の納品ファイルを一発で作る方法。

私は、GitクライアントソフトにSourceTreeを使っているので、
以下のICSさんの記事を元に納品ファイルを作っています。

今回の記事は、上記の記事の設定を少しカスタマイズしたものになります。

いつも上記の方法で差分データを作成してから
さらに2つの工程を手動で行ったのち
クライアントにデータを納品していました。

(1). SourceTreeの「カスタムアクション」で差分のzipファイルを作る → [スクリプト]
(2). zipのデータからhtdocsのデータだけを抜き出す → [手動]
(3). (2)のデータを日付のフォルダに格納して、zipにする → [手動]

これは、イケていないのでなんとか自動化して、
そのまま納品ファイルを送りたいものです。。

(a).差分データからhtdocsのデータだけを抜き出す

これがgitで管理している、
私のプロジェクトのルートのファイル群です。

webpack.config.js
tasks
src
README.md
path.config.js
package.json
package-lock.json
node_modules
htdocs // 納品するのはこいつだけ
.prettierrc
.node-version
.gitignore
.git
.eslintrc
.editorconfig

実際にクライアントに納品するのって、htdocs以下だけなんですよね。
でも、差分には当然それ以外の開発データが含まれてしまいます。
なので、
htdocsだけをzipに入れて、それ以外のファイルは含めない必要があります。

(b).日付のフォルダに格納して、zipにする

納品って、大抵1度ではなく、多い時は、同じ日に何回もする場合があります(これが地獄)。
ですが、毎回「archive.zip」という名前だと、
送られた方はバージョンに混乱してしまい、間違ったデータをサーバーに上げてしまうことも考えられます。

なので、私は
「data_20200401.zip」
「data_20200401-2.zip」
のようにわかりやすいようにリネームして送っていました。
これも正直辛いです。。

(a)(b)の処理も自動化する

というわけで、シェルスクリプトに改良を加えてみました。

export_diff_zip.sh
#!/bin/sh

# ファイル名を指定
FILE_NAME=`date '+data_%y%m%d_%H%M%S.zip'`

# 古→新の順番じゃないとファイル削除の場合などにエラーになる [例] $1 HEAD, $1 $2

if [ "$2" = "" ]; then
    # コミットハッシュが1つの場合
    git archive master:htdocs --format=zip -o $FILE_NAME --prefix=htdocs/ `git diff --name-only --relative=htdocs --diff-filter=AMCR $1 HEAD`
else
    # コミットハッシュが2つの場合
    git archive master:htdocs --format=zip -o $FILE_NAME --prefix=htdocs/ `git diff --name-only --relative=htdocs --diff-filter=AMCR $1 $2`
fi

まず、スクリプトの

master:htdocs


--relative=htdocs

のところで、対象ディレクトリを指定しています。
このままだと、zip内にhtdocsは含まれないので


--prefix=htdocs/

を指定しています。
あとは、日付です。


# ファイル名を指定
FILE_NAME=`date '+data_%y%m%d_%H%M%S.zip'`

ここで、タイムスタンプをそのままファイル名に反映しています。

この設定でカスタムアクションを走らせると、、

data_yymmdd_hhmmss.zip → data_200506_215510.zip

のように、タイムスタンプのzipが作成され、
解凍すると、htdocsからファイルが展開されます。

終わりです。

参考記事

https://qiita.com/hironaito/items/9b5135698ea1a497a3c0
https://qiita.com/nyamogera/items/04f5b8c6a7ab6c860f29
https://qiita.com/usamik26/items/9a2d14aea30cb01a60c6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3