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

私はアトラシアンに入社する前、バージョン管理システムとして Subversion (SVN) を使用している多様なプロジェクトに携わってきました。私はすでに Git へ移行して数年経っていたので、可能な限り Git を利用したいと思いました。

そして幸運にも、git-svn を使うことができました。Git-svn は、パワフルな Git ツールセットの快適な使用感を手放すことなく、Subversion リポジトリとやり取りができるすばらしい完全なソリューションです。そして、それには知っておくと便利な点がいくつかあります。この投稿では、すでに git-svn の知識が少しあり、git-svn を使用して SVN とやり取りする方法を知っている人を対象に話を進めていきます。

ここでは、SVN と連動して Git を快適に使用し続けるために、私が自ら調べて学んできたワークフローに統合する必要のあるヒントや技をすべて紹介します。お楽しみください!

SVN から Git への簡単移行ガイド!

無視するファイルの設定

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


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

別の方法は、魔法の update-index の使用です。


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

これはかなり有効な技で、私は昨年一貫してこの技を使ってきました。詳細情報をご希望の方は、Stackoverflow に関する投稿をご覧ください。後者の手段を使う場合、実効後に Git でファイルが無視されたことを確認するには、次の方法が使えます。


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

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

大規模リポジトリの shallow clone

以前、1.5GB を超す SVN コードベース全体のチェックアウト作業に携わったことがあります。同様の状況において、git-svn が行うような履歴全体のコミットごとの確認は、リポジトリがとにかく大き過ぎるので長々と手間がかかることがあります。この問題を回避するには、プロジェクトの履歴全体をコピーする代わりに、リポジトリの shallow clone を作成することです。最後の n コミットをコピーし、そこから作業を開始します。以下に例を挙げます。


1
git svn clone -s -r604:HEAD http://nick@svn.xxxxxx.com/repos/ -T trunk -b branches -t tags

604」を維持したい旧リビジョンと置き換える必要があります。必ず、Stackoverflow リファレンスを読んでください。

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

誰もが遅かれ早かれ、思わぬ障害に突き当たることでしょう。例えば、私は git-svn を使用せずに SVN からプロジェクトを確認した時、Git を使って自分でトラッキングをしたいと考えたことがありました。同時に、誤って .svn フォルダーを git のインデックス (ステージング領域) に追加してしまいました。これらの重要なファイルを維持しつつ、インデックスから取り除くにはどうすればいいでしょうか? かなりの難問です! gitでファイルを実際削除することなくファイルを untrack (未追跡)する方法を紹介します。


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

ここでのキーワードは –cached です。-cached はインデックスでは機能しますが、作業ディレクトリでは機能しません。この点については、progit に関する章に非常に明確な説明があります。

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

SVN リポジトリを移動 (または VPN 経由でリポジトリにアクセスし、そのアドレスを変更する何らかの賢いトンネル操作をする必要がある場合)、再度のフルチェックアウトを避けるために正確な手順を踏む必要があります。git wiki の最初に挙げられている手段で、私は一貫して成功を収めています。重要な部分を Git 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 への簡単移行ガイド!

*本ブログは Atlassian Blogs の翻訳です。本文中の日時などは投稿当時のものですのでご了承ください。
*原文 : 2013 年 12 月 23 日 "Use Git even if your team doesn't: git-svn tips and tricks"