受託案件をやっていると
「差分で納品ファイルください」
と言われることが多いと思いますが、
その時の納品ファイルを一発で作る方法。
私は、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)の処理も自動化する
というわけで、シェルスクリプトに改良を加えてみました。
#!/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