同期

同期

元の SVN リポジトリに新しいコミットが追加された場合にGit リポジトリをそれと同期させるのは簡単なことです。この機能によって、移行期間中にもこれまでの SVN ワークフローを引き続き使用しつつ Git の練習を始めることが可能となり、移行プロセスを受け入れやすくなります。

同期は両方向に行うことも可能です。しかしながら、ここでは SVN から Git への一方向同期を推奨します。即ち、移行期間中のコミットは SVN リポジトリに対してのみ行ない、Git リポジトリに対して行ってはなりません。切り替えに対する開発チームの準備が整ったと判断された場合に初めて、移行プロセスを完了して、SVN ではなくGit への変更のコミットを開始します。

Git移行: SVNからGitへの一方向同期を推奨します。

それまでは開発者は引き続き SVN にコミットを行ない、必要に応じて開発者の Git リポジトリをそれに同期させます。このプロセスは変換のステップと似ていますが、この場合は変更の追加分のみを扱うのではるかに効率的です。

オーサーファイルの更新

SVN のユーザー名をフルネームおよび E メールアドレスにマップするために使用してきた authors.txtは、同期処理に必須のファイルです。このファイルがこれまであった場所、~/GitMigration/authors.txtから移動された場合は、次のコマンドを使用してその場所情報を更新する必要があります:

git config svn.authorsfile <path-to-authors-file>

最後の同期 (同期が一度も行われていない場合は最初のクローン) の後に新たに加わった開発者によるコミットが行われた場合は、それに応じてオーサー情報ファイルを更新しなければなりません。これを行うためには、authors.txtを手作業で編集して新しい開発者を追加するか、あるいは次のセクションで説明するように、--authors-progオプションを指定します。

同期を一度だけ行うのであれば多くの場合オーサー情報ファイルを直接編集する方が簡単ですが、定期タスクとして自力で同期を行わなければならない場合などでは --authors-progオプションが通常使用されます。

Git オーサー情報の自動生成

オーサー情報ファイルを更新する必要がない場合は、以降をスキップして次のセクションに進んでください。

git svnコマンドには--authors-progオプションが用意されており、これを指定すると SVN ユーザー名を Git のオーサー情報に自動的に変換するスクリプトを実行します。このとき、SVN ユーザー名を唯一の引数として取り込み、Name <email>の形式 (すでに作成したオーサー情報ファイルと同じ形式) で単一行に出力するようにこのスクリプトを設定する必要があります。このオプションは、プロジェクトに定期的に新しい開発者が加わる場合に極めて有用です。

この--authors-progオプションを使用する場合は、~/GitMigrationオプションにauthors.shファイルを作成してください。そして、authors.sh に次の 1 行を記述すると、authors.txtに見つからないオーサーに対してはダミーの Git 名と E メールアドレスを返すようになります:

echo "$1 <$1@example.com>"

念のため再度付け加えると、これは SVN ユーザー名をもとにダミーの名前と E メールアドレスを生成するので、意味のあるマッピングを行うためにそれを書き換えることは全く構いません。

新たな SVN コミットのフェッチ

SVN と異なり、Git では上流で行なわれたコミットのダウンロードとそのローカルリポジトリへの統合とを区別します。前者は「フェッチ」と呼び、後者の手段としてマージやリベースがあります。元の SVN リポジトリから新しいコミットをフェッチする場合は~/GitMigrationディレクトリで次のコマンドを実行します。

git svn fetch

このコマンドは、Git リポジトリのリモートブランチを更新するものでローカルブランチには更新が反映されないという点で、前のステップの git svn clone と似ています。しかしリモートブランチは SVN リポジトリのブランチと全く同一になります。

--authors-progオプションを指定する場合は、次のようにそれをコマンドに付け加える必要があります:

git svn fetch --authors-prog=authors.sh

フェッチしたコミットとの同期

フェッチしたコミットをリポジトリに統合するには次のコマンドを実行します:

java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar sync-rebase

これはフェッチしたコミットをローカルブランチにリベースし、ローカルブランチとリモートブランチは同一になります。その結果、新たなコミットが git log出力に表示されるようになります。

Git リポジトリのクリーンアッブ (再掲)

ここでも、最後の同期後に 元のSVN リポジトリから削除された不要なタグや不要なブランチを削除するために git-cleanスクリプトを実行することは良い習慣です:

java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git --force

これでローカルの Git リポジトリは SVN リポジトリと同期されました。

まとめ

移行期間中に開発者がコミットを行う先を SVN リポジトリに限定することは極めて重要なことです。Git リポジトリが更新されるのは上に述べた同期処理を行ったときのみとするべきです。この方法は、二方向の同期を行うワークフローの管理と比較するとはるかに簡単で、しかもその Git をビルドプロセスに適用することもできるのです。

Git を学習する準備はできていますか?

この対話式チュートリアルを利用しましょう。

今すぐ始める