Skip to content
On this page

📆 2022-09-24

ローカルの git リポジトリを自動的にフェッチするようにした

#git #自動化

開発を始める前にローカルの 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 の作成

bash:/path/to/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

applescript
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
<?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 の登録

bash
$ launchctl load /Users/{USERNAME}/Library/LaunchAgents/launched.git-refresh.plist

確認

bash
$ tail -f /path/to/log

止める場合

止めるたいときはこのコマンド

bash
$ launchctl unload /Users/{USERNAME}/Library/LaunchAgents/launched.git-refresh.plist

調査メモ

Macで定期的にコマンドを実行するには cron ではなく launchd が良いらしい。 https://blog.shibayu36.org/entry/2018/08/01/193000

コマンドが長いので shell script にしておく

sh:git-refresh
#!/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'

実行権限をつける

shell
chmod u+x git-refresh

https://zerolaunched.herokuapp.com/

というサイトで launchd の設定ファイルが(plist) が作れるらしいので作ってみた。

/Users/{USERNAME}/Library/LaunchAgents/ の下に配置する。

xml:/Users/
<?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 にフルディスクアクセスを付与したら解決するらしいが、与える権限が大きすぎる気がする。

https://stackoverflow.com/questions/58442951/how-to-fix-operation-not-permitted-when-i-use-launchctl-in-macos-catalina

シェルスクリプトをapp化すれば解決するらしい。

https://blog.ottijp.com/2020/05/29/backup-fda/

スクリプトエディタを開いて、以下を入力し、アプリケーションとして書き出す。

on run
	do shell script "/bin/bash /path/to/git-refresh"
end run

plistの起動部分をこうする

xml:/Users/
		<string>/usr/bin/open</string>
		<string>/path/to/git-refresh.app</string>

定期的に起動できるようになった。

Released under the MIT License.