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
を使う.
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
にすればいいとは思う.