LoginSignup
5

More than 5 years have passed since last update.

git-svnでfile:///形式のリポジトリを連携する

Posted at

Gitで管理しているソースコードをSVNのリポジトリと連携させる方法です。
情報はたくさん出てきますが、割と分散していたのでまとめて共有することでお役に立てればと思います。

シェルの環境はGit for Windowsです。

GitからSVNを使う

git-svnで連携します。

下記を記事を参考にしました。

面倒くさいsvnリポジトリをgit-svnで扱う時に役立ちそうなオプション一覧

$ git svn clone -s <SVNのリポジトリ> <ローカルのディレクトリ>

-sオプションはSVNの標準的な構造(trunk, branches, tags)になっているリポジトリをcloneするためのオプションです。
ルートからいきなりtrunkが始まっているような場合は、--trunk=オプションなどで指定します。

# --trunk=/でルート直下をtrunkとして認識する。
# --tags=, --branches= もある。
$ git svn clone --trunk=/ <SVNのリポジトリ> <ローカルのディレクトリ>

ローカルもしくはネットワークドライブのリポジトリを連携する

今回はこちらが本題。

SVNのURLがfile:///Z:/foo/bar/repoという形式になっている場合、そのままgit svn cloneしようとするとエラーとなります。

$ git svn clone --trunk=/ file:///Z:/foo/bar/repo D:/local/path/repo
Initialized empty Git repository in D:/local/path/repo/.git/
Can't create session: Unable to connect to a repository at URL 'file:///Z:/foo/bar/repo': Unable to open repository 'file:///Z:/foo/bar/repo' at D:/local/mingw64/share/perl5/Git/SVN.pm line 310.

ドライブ文字の:を抜けという記事もありますが、フォーマットのバージョンが合わないと言われて失敗してしまいました。
もしかしたらこれだけで成功する環境もあるかもしれません。

$ git svn clone --trunk=/ file:///Z/foo/bar/repo D:/local/path/repo
Can't create session: Unable to connect to a repository at URL 'file:///Z/foo/bar/repo': Unable to open repository 'file:///Z/foo/bar/repo': Expected FS format between '1' and '7'; found format '8' at D:/local/mingw64/share/perl5/Git/SVN.pm line 310.

svnserveを使う

file:///ではなくsvn://でアクセスすればよいらしい。
以下の記事を参考にしました。

会社のSVNを一人だけ脱出してGitを使う

# svnserveはバックグラウンドで実行すること
$ svnserve.exe -d --root file:///Z:/foo/bar/repo &
$ git svn clone --prefix=svn/ svn://localhost D:/local/path/repo

ただし、このままだとgit svn cloneはできても編集後のgit svn dcommitで失敗してしまいます。

$ git svn dcommit
Committing to svn://localhost ...

ERROR from SVN:
Authorization failed: Authorization failed
W: 4a59fb5ccba3150e11f55996aead9b71d3c803ef and refs/remotes/svn/git-svn differ, using rebase:
:040000 040000 ebbccb7b2f0c9d467f1b3c571be367752531643a 5ec549645a5bac7b0952d5351416b01e867f6118 M      hoge
Current branch master is up to date.
ERROR: Not all changes have been committed into SVN, however the committed
ones (if any) seem to be successfully integrated into the working tree.
Please see the above messages for details.

svnserveの認証で失敗しているので、configファイルを作って認証なしで書き換え(write)可能となるように編集します。
本当はユーザ/パスワードを設定できるらしいのですが、今回はローカルのサーバなので割愛。

以下の記事を参考に。

Subversionのインストールと設定(svnserve編)

SVN DCommit failed : ERROR from SVN: Authorization failed

リポジトリの中にconf/svnserve.confを作成しておくのがプラクティスらしいですが、このためにリポジトリにゴミファイルを作りたくないので$(HOME)に作成しました。

~/svnserve.conf
[general]
anon-access = write

作成したファイルを指定してsvnserveを起動すれば、問題なくgit svn dcommitできます。

$ svnserve.exe -d --config-file ~/svnserve.conf --root file:///Z:/foo/bar/repo &
$ git svn dcommit

ユーザ名の設定

ここまでの方法だと、SVNのコミットログにユーザ名が反映されません。
git svn clone --username=hogehogeとか試してみましたがどうもうまくいかず。

継続調査ですね。

運用について

Gitで開発しているとローカルリポジトリに対するコミットが気軽にできる分、コミットログが汚れがちです。
正直なログを残すのはそれはそれで意味があると思いますが、リモートリポジトリのコミットログはある程度整理されていないと履歴を追いかけづらいということもあると思います。
特にSVNでの運用だとGitよりもコミットに対する敷居が高いのではないでしょうか。

現時点ではfeatureブランチを切って、master(SVNと連携しているブランチ)に対してgit merge --squashした後git commitでコミットを一つにまとめる運用にしています。
こうすることで他のメンバーに見えるコミットログと個人の作業ログを分離できるので、コミットメッセージを推敲するのはSVNにコミットするときだけで済みます。

以下の記事を参考にしました。

git-svnを使うときのベストプラクティス

最後に

参考にさせていただいた記事の筆者の皆様に感謝いたします。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5