【Tips】2つの端末間で同じGitローカルリポジトリを同期させたい

こんにちは。DA事業本部の春田です。

表題の件、あまりググっても解決方法が出てこなかったので残しておきます。

問題

Gitで開発していると、手元のPCで実装したコードを検証環境のサーバーに配置して試したい、なんてことは多々あると思います。これまでは検証環境のサーバーにもGitリポジトリをクローンしておいて、リモート経由で変更を反映していました。

しかし、いちいちコミットしてプッシュしてると、コミットの粒度や内容が雑になって保守性が悪くなりがちです。

解決策

Gitでローカルリポジトリを異なる端末間で同期する機能があれば嬉しかったのですが、なかったのでrsyncコマンドで解決しました。

rsync -av --inplace --ignore-errors --delete --force –progress -e "ssh -i ~/.ssh/prikey.pem" ~/work/target_repository ubuntu@XX.XXX.XXX.XX:~/work/

初回の実行では同期先の~/work/配下にtarget_repositoryが作成され、以降の実行では差分のみ更新されます。同期先に直接加えた変更も全て上書きされてしまうので注意してください。これを避けるには--inplace-uにしておきます。実行が怖い場合は--dry-runオプションをつけて試してみてください。

各オプションの意味は以下の通りです。

-a 色んなオプションが詰まったアーカイブモード。ディレクトリを再帰的に処理したり、権限周りをすべて保持したりする
-v 動作内容を表示する
--inplace ファイルを上書きする。同期先の方が新しくても上書きされる
--delete 同期元にないファイルを同期先から削除する
--force ディレクトリが空ではない場合も削除する
--ignore-errors I/Oエラーがあっても削除する。ファイル削除時に頻発していたので付与した
--progress 転送の進行状況を表示する
-e リモートシェルを記述する。デフォルトはsshだが秘密鍵が必要なので指定。

エイリアスを貼っておけば気軽に同期できますね。

alias syncrepo='rsync -av --inplace --ignore-errors --delete --force –progress -e "ssh -i ~/.ssh/prikey.pem" ~/work/target_repository ubuntu@XX.XXX.XXX.XX:~/work/'

短いですが以上となります。ご参考になれば幸いです。

参照

【 rsync 】コマンド(その1)――ファイルやディレクトリを同期する:Linux基本コマンドTips(82) - @IT