分散リポジトリでそれぞれ好きなように進化していけるのがgitの良いところだと思うけど、それでも運用上同期を取らないといけない場合がある。
そんなときの運用は、
- 定期的にmergeする
- 片方のリポジトリにコミットがpushされたら自動的にもう一方にmergeする
などが考えられる。
もちろん2.の方法がベターなんだけど、過渡期だからあんまりアグレッシブなことがしたくないとか、リリース前だから片方のリポジトリは触れないとかの制約が厳しくて2.の方法がとれない場合、1.の方法を取ることになる。
前置きが長くなったが、その場合は下記のようにすればリモートリポジトリ間の差分があるかどうかを確認できるので、下記のコマンドを定期的にまわし、差分があるときだけアラートを投げるようにすれば運用の手間が少しは減らせる。
mkdir remote-sync-check
cd remote-sync-check
git init --bare
git remote add origin1 /homge/GIT/sample-repo1.git
git remote add origin2 /homge/GIT/sample-repo2.git
git fetch --all
git ls-remote origin1 > ls-remote-origin1.txt
git ls-remote origin2 > ls-remote-origin2.txt
diff -u ls-remote-origin1.txt ls-remote-origin2.txt
ぶっちゃけ本質は最後の3行だけ。git ls-remote リポジトリ
でリモートリポジトリの全ブランチのSHA1-IDが出力されるので、その出力結果を比較すればOK。タグの情報も出力してくれるので、タグが一方にしかうたれていない状況にも気づける(そのことが問題になる場合、そのことが問題になる運用自体に問題がありそうだけど)。もちろん実際にこのチェックを定期的に行う場合はfetch以下だけで十分。
ブランチやリポジトリの差分は大きくなればなるほどmergeがめんどくさくなっていくので、あるべき姿でなくなっているなら早めに気づけるようにしておきたい。
ちなみに最後の3行は、下記のようにすれば1行にまとめられるけど、diffの出力がわかりにくくなるのであまりオススメしない。
diff -u <(git ls-remote origin1) <(git ls-remote origin2)
参考:標準入力同士の diff