LoginSignup
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-06

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

私は、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
  3. You can use dark theme
What you can do with signing up
3