SVNリポジトリをgit cloneする完全ガイド【git svn clone 全オプション解説 2026年版】

2012年11月29日


SVNリポジトリを引き続き使いながら、手元ではgitのコマンドで作業したい——そんなニーズに答えるのが git svn コマンドです。

このガイドでは、SVNリポジトリを git svn clone でローカルに取り込む方法を基本から応用まで体系的に解説します。単に「動く手順」を紹介するだけでなく、各オプションが何をしているか・なぜそのオプションが必要かを丁寧に説明するので、自分の環境に合わせて応用できるようになります。

筆者はSVNからGitへの移行プロジェクトを複数経験しており、本ガイドの手順はLinux / macOS / Windows (Git Bash) 環境で動作確認済みです。

SVNリポジトリとGitローカルリポジトリが git svn でブリッジされている構成図


前提条件

このガイドを進める前に、以下の環境・知識が必要です。

  • 環境: Linux / macOS / Windows (Git Bash)
  • 必要なツール: Git(git-svnサブコマンド含む)、SVNサーバへのネットワーク疎通
  • 前提知識: gitの基本操作(clone / commit / branch)、SVNの基本概念(trunk / branches / tags)
# バージョン確認
git --version
# 期待する出力例: git version 2.43.0

git svn --version
# 期待する出力例: git-svn version 2.43.0 (svn 1.14.x)

git-svnが見つからない場合: Ubuntuなら sudo apt install git-svn、macOSなら brew install git-svn を実行してください。


全体の流れ

このガイドは以下の5ステップで構成されています。

  1. 基本的なgit svn clone — 5〜30分(リポジトリサイズによる)
  2. ブランチ・タグを含めたclone(-sオプション) — 5〜30分
  3. カスタム構成のSVNリポジトリへの対応 — 10分
  4. 日常的なgit svn操作(dcommit / rebase / branch) — 継続的に使用
  5. 応用編:大規模リポジトリ・ユーザマッピング

git svnの全体フロー(SVNサーバ → git svn clone → ローカルgitリポジトリ → dcommit → SVNサーバ)


ステップ1: 基本的な git svn clone

SVNのtrunkディレクトリだけをgitリポジトリとして取り込む、最もシンプルなコマンドです。

trunk単体をcloneする

git svn clone http://server/svn/trunk/repo

これにより、repo というディレクトリが作成され、SVNのtrunkの内容がgitリポジトリとして取り込まれます。

コマンドの内部動作:

  1. SVNサーバに接続し、リビジョン履歴を順番にフェッチする
  2. 各SVNリビジョンをgit commitに変換する
  3. git-svn-id: という形式でSVNのリビジョン情報をコミットメッセージに埋め込む
# cloneの進捗確認例
$ git svn clone http://server/svn/trunk/repo
Initialized empty Git repository in /home/user/repo/.git/
r1 = abc1234 (refs/remotes/origin/git-svn)
r2 = def5678 (refs/remotes/origin/git-svn)
...
Checked out HEAD:
  http://server/svn/trunk/repo r100

cloneが遅い場合: SVNのリビジョン数が多いほど時間がかかります。--revision オプションで取り込むリビジョン範囲を限定できます(後述)。

git svn clone実行後のgit logの例

ステップ1完了の確認: cd repo && git log --oneline でコミット履歴が表示されればOKです。


ステップ2: ブランチ・タグを含めたclone(-s オプション)

SVNのブランチやタグも一緒に取り込みたい場合は -s--stdlayout)オプションを使います。

-s オプションの使い方

git svn clone -s http://server/svn/repo

-s は「SVNの標準ディレクトリ構成(Standard layout)」を前提とするオプションです。具体的には以下の構成を想定します。

http://server/svn/repo/
├── trunk/       ← メインの開発ライン
├── branches/    ← 各ブランチ
└── tags/        ← タグ(リリースポイント)

注意点: -s オプションを使う場合、URLはリポジトリルート(trunk/ の一つ上のディレクトリ)を指定します。

# 正しい指定(リポジトリルート)
git svn clone -s http://server/svn/repo

# 誤った指定(trunkを直接指定するとブランチ・タグが取れない)
git svn clone -s http://server/svn/repo/trunk   # ← NG

cloneした後の確認

cd repo
git branch -a

期待する出力:

* master
  remotes/origin/trunk
  remotes/origin/branches/feature-x
  remotes/origin/tags/v1.0

SVNのブランチが remotes/origin/branches/<name> として、タグが remotes/origin/tags/<name> として取り込まれていることを確認できます。

git branch -a の出力例(SVNブランチがリモートとして見えている状態)

ステップ2完了の確認: git branch -a でSVNのブランチ・タグが remotes/ 配下に表示されればOKです。


ステップ3: カスタム構成のSVNリポジトリへの対応

-s オプションはSVNの標準レイアウトを前提としています。組織によっては独自の構成でSVNを運用している場合があります。その場合は各パスを明示的に指定します。

–trunk / –branches / –tags オプション

git svn clone \
  --trunk=<trunkのパス> \
  --tags=<tagsのパス> \
  --branches=<branchesのパス> \
  <リポジトリURL>

具体例:

SVNリポジトリの構成が以下のような非標準レイアウトの場合:

http://server/svn/project/
├── main/          ← trunkの代わり
├── feature/       ← branchesの代わり
└── release/       ← tagsの代わり

コマンドは次のようになります:

git svn clone \
  --trunk=main \
  --branches=feature \
  --tags=release \
  http://server/svn/project

複数のブランチディレクトリがある場合

--branches は複数回指定できます:

git svn clone \
  --trunk=trunk \
  --branches=branches \
  --branches=teams \
  --tags=tags \
  http://server/svn/repo

非標準SVNレイアウトのディレクトリ構成例

ステップ3完了の確認: git branch -a で期待するブランチが取り込まれているか確認してください。


ステップ4: 日常的な git svn 操作

git svn clone が完了したら、日常的な作業は通常のgitコマンドと git svn の専用コマンドを組み合わせて行います。

SVNリポジトリへのpush(dcommit)

ローカルでgit commitした内容をSVNサーバに反映するには git svn dcommit を使います。

# ローカルでの作業
git add modified_file.txt
git commit -m "バグ修正: nullポインタ例外を修正"

# SVNへ反映
git svn dcommit

git push に相当する操作ですが、git push ではなく git svn dcommit を使う必要があります。

重要: git svn dcommit は、SVNサーバにコミットする際にコミットメッセージを書き換えます(git-svn-id: という行が追加されます)。これは正常な動作です。

SVNから最新の更新を取得(rebase)

SVNサーバの最新変更をローカルに取り込むには git svn rebase を使います。

git svn rebase

これは git pull --rebase に相当する操作です。SVNのリビジョンをフェッチしてリベースします。

fetchだけしたい場合: git svn fetch でSVNの変更を取り込みつつ、ローカルHEADは動かさないことができます。

SVNブランチの一覧確認

git branch -r

SVNサーバ上のブランチ一覧が表示されます。git svn clone -s--branches オプションで取り込んだブランチが remotes/origin/branches/<name> 形式で一覧表示されます。

SVNブランチをローカルで作業する

# SVNブランチをローカルブランチとして作成
git branch local-feature-x remotes/origin/branches/feature-x

# ローカルブランチをチェックアウト
git checkout local-feature-x

# 作業してコミット
git add .
git commit -m "feature-xでの作業"

# SVNへ反映
git svn dcommit

# 作業完了後、masterへ戻りローカルブランチを削除
git checkout master
git branch -d local-feature-x

タグの操作

SVNのタグも同様にローカルブランチとして操作できます。ただし、SVNのtagはgitのtagとは異なり、単なる「コピー」として実装されています。

# タグの確認
git branch -r | grep tags

# タグをgit tagとして作成
git tag v1.0 remotes/origin/tags/v1.0

git svn の操作フロー(rebase → 作業 → dcommit のサイクル)


応用編

大規模リポジトリ:特定リビジョンからclone

SVNの歴史が長く、数千〜数万リビジョンあるリポジトリでは、全履歴を取り込むと非常に時間がかかります。直近のリビジョンからのみcloneする方法:

# リビジョン1000以降のみ取り込む
git svn clone -r 1000:HEAD http://server/svn/trunk/repo

この方法では取り込めないリビジョンの履歴は失われますが、ブランチ作業やdcommitは問題なく行えます。

ユーザマッピング(SVN作者 → Gitコミッター)

SVNのコミットユーザ名をGitのコミッター(名前+メールアドレス)にマッピングできます。

# authors.txt を作成
cat > authors.txt << 'EOF'
tanaka = 田中太郎 <tanaka@example.com>
yamada = 山田花子 <yamada@example.com>
EOF

# authorsファイルを指定してclone
git svn clone -A authors.txt http://server/svn/trunk/repo

このマッピングを行わないと、SVNのユーザ名がそのままgitのコミッターとして記録されます。

git svn fetch で段階的に更新

git svn clone は初回に全リビジョンを取り込みますが、その後の更新は git svn fetch で増分だけ取り込めます。

# 最新リビジョンまでフェッチ
git svn fetch

# フェッチ後にrebaseを別途実行
git svn rebase

完全移行:svn2git を使ったSVN→Git完全移行

長期的にはSVNリポジトリをGitに完全移行することを推奨します。git svn はブリッジ手段であり、完全移行には svn2git コマンドが便利です。

# svn2gitのインストール(Ubuntu)
sudo apt install git-svn ruby rubygems
sudo gem install svn2git

# 完全移行
svn2git http://server/svn/repo

svn2git は内部で git svn を使い、タグをgitのtagに、ブランチをgitのbranchに正しく変換します。


トラブルシュート

症状 原因 解決策
git svn コマンドが見つからない git-svnがインストールされていない sudo apt install git-svn または brew install git-svn
cloneが非常に遅い SVNのリビジョン数が多い -r HEAD:HEAD または -r <最新数千>:HEAD で絞り込む
ブランチが取り込まれない リポジトリURLが誤っているか -s の対象構成でない --trunk / --branches / --tags で明示指定する
dcommit で “Cannot commit to a directory path" エラー ブランチの向き先が誤っている git svn info で現在の追跡先を確認する
認証エラー(401 Unauthorized) SVNサーバへの認証情報が不正 git svn clone --username=<user> で明示指定する
文字化けする SVNとgitのエンコーディング差異 git config svn.pathnameencoding UTF-8 を設定する

まとめ

このガイドでは git svn clone を使ってSVNリポジトリをgitで操作する方法を解説しました。

  • ステップ1: git svn clone <URL> でtrunkのみを取り込む基本操作
  • ステップ2: -s オプションでブランチ・タグも含めた標準レイアウトのclone
  • ステップ3: --trunk / --branches / --tags で非標準レイアウトに対応
  • ステップ4: git svn dcommit(push)と git svn rebase(pull)による日常操作

git svn はSVNからgitへの移行を段階的に進める際の強力なブリッジです。まずは手元の環境で git svn clone を試し、gitの快適なブランチ操作やローカルコミットをSVN環境でも活用してみてください。

次のステップとして、チーム全体をGitに移行する場合は svn2git を使った完全移行もぜひ検討してください。


関連記事

git

Posted by GENDOSU