概要
ソースのホスティングサービスを、オンプレ版からクラウド版へ移行したり、BitbucketからGitHubへ移行したりするときがあると思います。しかも一時的に同時並行で開発を進めなきゃいけないなんてこともあります。
同期する作業はミスると怖いですし、手順を覚えるのも面倒、かつやり方を忘れたころにまた同期しなきゃいけない時期が来てしまうということもあって、備忘として記事にしておくことにしました。
この記事は、シェルスクリプトを使って、簡単に2つのGitリポジトリ間を同期する方法を紹介します。
前提
- リモートに同期元と同期先2つのブランチが存在していること(GitHubとBitbucketなどホスティングサービスはなんでもOK)
- 英語表記では、同期元をsrc(sourceの略)、同期先をdest(destinationの略)と表記しています
初回にやること
1. 同期元をローカルにgit clone --mirror
git clone --mirror <src_repo>
e.g.) git clone https://github.com/myname/src-repo.git
2. 同期元のディレクトリに移動して、リモートに同期先を登録
git remote add <dest_remote_name> <dest_repo>
e.g.) git remote add dest https://bitbucket.org/teamname/dest-repo.git
3. 同期用のシェルスクリプトを準備して実行
同期元のディレクトリから1つ上の階層に上がって、下記のシェルスクリプトを作成します。
git-sync.sh
#!/bin/bash
# 同期元
src_name=src-repo
# 同期先(手順2で指定したものと同一のものを指定)
dest_remote_name=dest
if [ -d ./$src_name ]; then
cd $src_name/
git fetch origin # 同期元リモートのデータをローカルに取得
git push --mirror $dest_remote_name # 同期先リモートにローカルのデータを反映
cd ..
else
echo 'no target directory'
fi
スクリプトが準備できたら、TerminalやCMD上で./git-sync.sh
と実行すると、同期が完了します。
2回目以降にやること
同期元で変更が生じたら、同期元でgit push
後、シェルスクリプトを実行しましょう。
おわりに
この記事では取り上げていませんが、チームメンバー全員が同じように同期作業を行わなければならないという状況では、JenkinsやCodeBuild、またはcronなどを用いて自動実行するのがおすすめです。