Linuxならできる。すぐできるが、Windowsで探しても記事が見当たらない。StackOverflowとかで探すと「オレはWSLでできたよ」とかそういうコメントがあるんですけど、いや違うんだよネイティブのWindowsでやりたいの。しかたないので自分でやる。

日付と時間を取得する


%DATE%%TIME%を使えばよいので、とりあえずこれらでechoすると下記のように表示される。

1
2
> echo %DATE%%TIME%
2019/10/18 23:30:58.04

これをもうちょっとフォーマットしたい。したいので、すこし加工して下記のようにする。なお、タイムゾーンも埋め込もうとしたが思ったより手間そうだったので諦めた。

1
2
> echo %DATE:~0,4%-%DATE:~5,2%-%DATE:~8,2%%TIME:~0,8%
2019-10-18 23:50:26

gitのコミットメッセージにタイムスタンプを含める


これを環境変数に設定してgit commit -mで指定してやればよい。具体的には下記のようになる。

1
2
3
4
> SET DATETIME=%DATE:~0,4%-%DATE:~5,2%-%DATE:~8,2%%TIME:~0,8% 
> git commit -m %DATETIME%
[master adc7fbb] 2019-10-18 23:42:17.10
1 file changed, 48 insertions(+)

npm scriptsでやりたい


npm scriptsでやるには下記のようにするとよい…と思ったが、ダメなのがわかった。

1
2
3
4
5
// dist はコミットしたいファイルが生成されているディレクトリです。
"scripts": {
"set-timestamp": "set DATETIME=%DATE:~0,4%-%DATE:~5,2%-%DATE:~8,2%%TIME:~0,8%",
"commit": "cd dist && npm run set-timestamp && git add -A && git commit -m %DATETIME%",
},

これを実行するとコミットメッセージは%DATETIME%というむなしいメッセージになる…。なん…だと…?どうもnpm scriptsからWindowsの環境変数を設定できないっぽい。

どう試行錯誤してもできない。結局のところ、Windowsかどうかは関係なくなってしまうが、JavaScriptをちょろちょろっと書いて、そちらからコミットすることにした。Node.jsからOSのコマンド実行するにはexecSyncを使えばいいので下記のようなJavaScriptを作る。

1
2
3
4
const execSync = require('child_process').execSync;
const datetime = new Date().toISOString();

execSync(`cd dist && git add -A && git commit -m \"${datetime}\"`)

これをcommit.jsとかそういう感じのファイル名で保存してnpm scriptsから実行するようにする。

1
2
3
"scripts": {
"commit": "node commit.js",
},

あとはnpm run commitを実行すると下記のコミットメッセージでコミットされる。

1
2019-10-18T15:14:22.561Z

うむ、いい具合にISO 8601のフォーマットでコミットメッセージを残すことができた。満足した。

おわり。