gitのローカルリポジトリに自動コミット・自動プッシュを設定する

以前のエントリで示したように,ローカルの作業フォルダをgitで管理してクラウドドライブにpushするようにしたわけだが,
livingdead0812.hatenablog.com
案の定,手動での同期は操作忘れを頻発することがわかったので,自動でのコミットとプッシュのためにいくつか方法を試みた.

やったこと1: .bash_profileで自動でコミットするスクリプトを実行する

簡便な方法として,一定時間おきにgitコマンドを実行するシェルスクリプトをログイン時に実行するという方法を試した.

#! /bin/bash

while true; do
    git pull
    git add .
    git commit -m "auto commit"
    git push
    sleep 300

下記のサイトを参考に上のようなスクリプトを作成し,bash /hoge/huga/auto-commit.shを.bash_profileに書き込んだ.
qiita.com

結果,.bash_profileを読み込んで起動するすべてのシェル上でスクリプトが実行され,すべてのシェルが待機状態になるという結果になった.
用は足りるのかもしれないが,そういうことがしたかったのではない.

やったこと2: launchdを設定して定期的に実行する

以下を参考にして,git操作だけをするシェルスクリプトを実行するようにした.
qiita.com

#! /bin/bash

git pull
git add .
git commit -m "auto commit"
git push

実行するためには,以下のようなplistファイルを作り,~/Library/LaunchAgent/に置く.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>auto-commit</string>
    <key>ProgramArguments</key>
    <array>
	<string>/bin/bash</string>
	<string>/Users/username/work/auto-commit.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>StandardOutPath</key>
    <string>/Users/username/commitlog/auto-commit.out</string>
    <key>StandardErrorPath</key>
    <string>/Users/username/commitlog/auto-commit.err</string>
</dict>
</plist>

plistファイルを作ったら,以下のコマンドを実行.

$ launchctl load ~/Library/LaunchAgent/filename.plist

これでバックグラウンドでgitコマンドが実行されるようになる.

やったこと3: もう少し行き届いたコミットをさせたい

ここまでだと,コミットメッセージがずっと同じで追随性が悪いし,いろいろ不便がある.

コミットメッセージに変更をある程度反映させたい

とりあえず変更のあったファイル名を取得し,それをコミットメッセージに含めるため,commitの行を以下のように変更.

git commit -m " auto commit `git diff --name-only`"

git diff --name-onlyで変更のあったファイル名を取得し,それをバッククオートでくくることで文字列として出力する.
これをcommit -mのクオート内に書くことでコメントに流しこむ.

もう少し変更内容を反映したい

git diff --name-onlyのオプションを--statに変えると,以下のような表示が得られる.

     hoge | 2 --
     huga | 0
     2 files changed, 2 deletions(-)
新規ファイルも同様に反映したい

上記二つの方法は既存のファイルしか表示してくれない.
新規ファイルの差分も取得するためには,git add -N filenameを使う.

rainbowdevil.jp

git add -N filenameは新規ファイルをステージ対象にするだけで,実際にステージするわけではない(ステージするだけならgit add .でいい)ので,このあとでgit addが必要.

最終的にはこんな感じ.

#! /bin/bash

git pull
git add -N .
git add .
git commit -m "auto commit" -m "`git diff --stat`"
git push

2019/5/12追記

上記の設定でとりあえず起動すると,gitの出力が保存されるcommitlogというフォルダが作られる.
勝手に作られた状態だと,オーナーがrootでパーミッションが711(たぶん)になっていて,launchdが書き込めない状態になっている.
これが原因で,この状態だと動かず,ステータスコード78が返ってくる.
stackoverflow.com
この問題はパーミッションとオーナーを変えれば解決する.

cd # -> to home directory
sudo chmod 755 commtlog
sudo chown username commitlog

このログをファイルに残す必要があるかというと,ないような気がするが,StandardOutを指定しないとうまく動かなかったので,検討の余地あり.
残さないためには出力先を/dev/nullにすればいいとは思う.