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

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

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

In the meantime, you should continue to commit to your SVN repository and synchronize your Git repository whenever necessary. This process is similar to the Convert phase, but since you’re only dealing with incremental changes, it should be much more efficient.


The authors.txt file that we used to map SVN usernames to full names and email addresses is essential to the synchronization process. If it has been moved from the ~/GitMigration/authors.txt location that we’ve been using thus far, you need to update its location with:

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

If new developers have committed to the SVN repository since the last sync (or the initial clone), the authors file needs to be updated accordingly. You can do this by manually appending new users to authors.txt, or you can use the --authors-prog option, as discussed in the next section.

For one-off synchronizations it’s often easier to directly edit the authors file; however, the---authors-prog option is preferred if you’re performing unsupervised syncs (i.e. in a scheduled task).

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


The git svn command includes an option called --authors-prog, which points to a script that automatically transforms SVN usernames into Git authors. You’ll need to configure this script to accept the SVN username as its only argument and return a single line in the form of Name <email> (just like the right hand side of the existing authors file). This option can be very useful if you need to periodically add new developers to your project.

If you want to use the --authors-prog option, create a file called option in ~/GitMigration. Add the following line to to return a dummy Git name and email for any authors that aren’t found in authors.txt:

echo "$1 <$>"

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

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

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

git svn fetch

This is similar to the git svn clone command from the previous phase in that it only updates the Git repository’s remote branches--the local branches will not reflect any of the updates yet. Your remote branches, on the other hand, should exactly match your SVN repo’s history.

If you’re using the --authors-prog option, you need include it in the above command, like so:

git svn fetch



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

This will rebase the fetched commits onto your local branches so that they match their remote counterparts. You should now be able to see the new commits in your git log output.

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

It’s also a good idea to run the git-clean script again to remove any obsolete tags or branches that were deleted from the original SVN repository since the last sync:

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

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


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

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