git-svn をうまく使うコツ: チームが Git を使っていなくても Git を使う

Nicola Paolucci
Nicola Paolucci
リストに戻る

アトラシアンに入社する前に取り組んでいたさまざまなプロジェクトでは、まだ Subversion (SVN) をバージョン管理システムとして使用していました。私は何年も前に Git に移行したので、できるだけ Git を使い続けたいと思っていました。

幸いにも私は git-svn を使用できました。これは、Git パワー ツールセットの快適さをそのままに Subversion リポジトリとやりとりできる、信じられないほど完全なソリューションです。しかし、落とし穴があります。この投稿は、あなたが git-svn について多少の知識を持っていて、git-svn によって SVN リポジトリとやりとりする方法を知っていることを前提としています。

次のリストには、SVN と組み合わせて Git を楽しく使い続けるために、私が調査してワークフローに統合しなければならなかったすべてのコツとヒントが含まれています。ぜひご覧ください!

無視するファイルのセットアップ

SVN が無視するファイルと同じファイルを Git が必ず無視するようにしてください。最も簡単なコツは、git が除外するデフォルト ファイルに svn:ignore ファイルのリストを付加することです。

git svn show-ignore >> .git/info/exclude

別の方法として、魔法のような update-index があります。

git update-index --assume-unchanged files to ignore

これはとてもすばらしい方法で、私は過去 1 年間絶えず使用してきました。詳細は Stackoverflow に関する記事をご覧ください。後者の方法を使用する場合に Git でファイルが無視されたことを後で確認するには、次を使用できます。

git ls-files-v | grep ^ [a-z] | sed-e 's/^h\//'

注: update-index はインデックスを直接操作する上級コマンドなので、慎重にご使用ください!

大規模リポジトリを shallow clone する

私は 1.5Gb を超える SVN コードベースを処理して全体をチェックアウトしていました。同様のシナリオでは、リポジトリが単に大きすぎるため、git-svn のように履歴コミット全体をコミットごとに確認すると時間がかかる可能性があります。この問題を回避するには、リポジトリの shallow clone を作成します。プロジェクトの履歴全体をコピーするのではなく、直近 n 個のコミットをコピーしてそこから作業を開始します。次の例をご覧ください。

git svn clone -s -r604:HEAD http://nick@svn.xxxxxx.com/repos/-T トランク -b ブランチ -t タグ

"604" は、残しておきたい以前のリビジョンに置き換える必要があります。Stackoverflow リファレンスをご覧ください。

.svn フォルダーを Git に誤って追加した場合

遅かれ早かれ、思わぬ障害にぶつかるでしょう。たとえば、以前、私は git-svn を使わずに SVN からプロジェクトを確認した際に、Git によって独自に追跡したいと考えたことがありました。その時、誤って .svn フォルダーを git のインデックス (ステージング領域) に追加してしまいました。これらの重要なファイルを維持したままインデックスから削除するにはどうすればよいでしょうか。難問です! git で実際に削除せずにファイルの追跡を解除する方法は次のとおりです。

git status -s | grep .svn| awk {'print $3'} | xargs git rm --cached

ここのキーワードは --cached です。これはインデックスでは機能しますが、作業ディレクトリでは機能しません。この点については、Pro Git の章に簡潔に明記されています。

SVN リポジトリが移動したらどうするか

SVN リポジトリが移動した (または VPN 経由でアクセスしてアドレスを変更するスマート トンネルを利用する必要がある) 際は、全体の再チェックアウトを避けるために正しい手順に従う必要があります。git wiki にリストされている最初の方法は、私が一貫して成功していた方法です。wiki から直接、ここが重要な部分です。

  • .git/configsvn-remote URL を編集して、新しいドメイン名または IP アドレスを指すようにします。
  • git svn fetch を実行します。これは svn から最低 1 つの新しいリビジョンをフェッチする必要があります。
  • svn-remote url を元の url に戻します。
  • git svn rebase -l を実行して (最後のフェッチ操作で行われた変更と併せて) ローカル リベースを実行します。
  • svn-remote url を新しい url に戻します。
  • git-svn rebase を実行します。これで再び普通に機能するようになったはずです!

これは、git-svn fetch ステップで実際に何かをフェッチできた場合にのみ機能します!

結論

私は Git を使うのが好きです。完全な自由と制御を手中に収めることで、無制限にコミット、コミットを再フォーマット、そのコミットを新たなコミットに押し込み、何より好きなだけ分岐できます。SVN とやり取りする必要がある時ですら、同じ楽しみを味わえます。私はこれを 2 年間ずっと行ってきましたが、万事快調です。

チーム全体で Git に移行する準備ができたら、包括的なステップ バイ ステップ ガイドを用意しておくと役立ちます。そこで作成したのが

『簡単な SVN から Git への移行ガイド』です!

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

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

今すぐ始める