開発を始める前にローカルの git リポジトリをフェッチするのが面倒なので、定期的に自動的にフェッチするようにした。
具体的には、毎日10時にローカルの全てのリポジトリに対して fetch するように設定した。
環境
macOS Venture
main ブランチをローカルに pull する運用を止めた
最初は、ローカルにある main ブランチを pullし直すような自動化を考えていたが、複雑になりそうだった。 (featureブランチで開発中のコミットしていないファイルをどうするかとか考えるのが大変)
そもそも main ブランチはなくても運用できそうなので、main ブランチを全て消した。
find . -name .git -type d -prune -exec dirname {} \; | xargs -I {} sh -c 'cd {} && pwd && git branch -D main'
参考: https://qiita.com/mizukmb/items/cc603cf5654e6531c8e7
git-refresh.sh の作成
#!/bin/sh
dir=/path/to/github/directory
ex_dir={除外したいディレクトリ名}
find $dir -type d -name $ex_dir -prune -o -name .git -type d -prune -exec dirname {} \; | xargs -I {} sh -c 'cd {} && pwd && git fetch' > /path/to/log 2>&1
git-refresh.app アプリケーションの作成
スクリプトエディタで以下を入力し、アプリケーションとして書き出す。
/path/to/git-refresh.app
on run
do shell script "/bin/bash /path/to/git-refresh.sh"
end run
アプリを手動で実行すると、フルディスクアクセスの許可を効かれるので許可しておく。
LaunchAgents の設定
launched.git-refresh.plist
を作成する
毎日10時に起動する設定にした。
/Users/{USERNAME}/Library/LaunchAgents/launched.git-refresh.plist
<?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>launched.refreshallgit</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/open</string>
<string>/path/to/git-refresh.app</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>10</integer>
</dict>
</dict>
</plist>
LaunchAgents の登録
$ launchctl load /Users/{USERNAME}/Library/LaunchAgents/launched.git-refresh.plist
確認
$ tail -f /path/to/log
止める場合
止めるたいときはこのコマンド
$ launchctl unload /Users/{USERNAME}/Library/LaunchAgents/launched.git-refresh.plist
調査メモ
Macで定期的にコマンドを実行するには cron ではなく launchd が良いらしい。 https://blog.shibayu36.org/entry/2018/08/01/193000
コマンドが長いので shell script にしておく
#!/bin/sh
dir=$1
ex_dir=$2
find $dir -type d -name $ex_dir -prune -o -name .git -type d -prune -exec dirname {} \; | xargs -I {} sh -c 'cd {} && pwd && git fetch'
実行権限をつける
chmod u+x git-refresh
https://zerolaunched.herokuapp.com/
というサイトで launchd の設定ファイルが(plist) が作れるらしいので作ってみた。
/Users/{USERNAME}/Library/LaunchAgents/
の下に配置する。
<?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>launched.refreshallgit</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>/path/to/bin/git-refresh</string>
</array>
<key>StandardErrorPath</key>
<string>/path/to/log</string>
<key>StandardOutPath</key>
<string>/path/to/log</string>
<key>StartInterval</key>
<integer>10</integer>
</dict>
</plist>
デバッグしやすいように 10秒に一度起動している。後からまともな値に変える。
起動してみる
launchctl load /Users/{USERNAME}/Library/LaunchAgents/launched.git-refresh.plist
エラーが出てた。権限不足なのか?
$ tail -f /path/to/log
/bin/sh: /path/to/bin/git-refresh: Operation not permitted
/bin/bash にフルディスクアクセスを付与したら解決するらしいが、与える権限が大きすぎる気がする。
シェルスクリプトをapp化すれば解決するらしい。
https://blog.ottijp.com/2020/05/29/backup-fda/
スクリプトエディタを開いて、以下を入力し、アプリケーションとして書き出す。
on run
do shell script "/bin/bash /path/to/git-refresh"
end run
plistの起動部分をこうする
<string>/usr/bin/open</string>
<string>/path/to/git-refresh.app</string>
定期的に起動できるようになった。