2012-04-04 22 views
8

はい、わかっています。なぜGitからSVNに移行したいのですか?Git-2-SVNの移行?

私は巨大なGitリポジトリをSubversionに移行する必要があるという状況に陥ってしまいました!ここで私はエドウィンさんのコメントごとにしようとした1つのワークフローです:

最初にローカルのSVNリポジトリを作成します。myProjectgit clone git:myNameSpace/myProject

cdと実行します: svnadmin create svn_repo

次は、私は私のGitのレポをチェックアウト

git svn init -s --prefix=svn/ file:///home/myHome/svn_repo/myProject

git svn fetch

git rev-list --parents master | grep '^.\{40\}$'あなたのルートコミットのハッシュを調べ、必要なだけコミットを1つ与えます。次は、空のトランクのハッシュを取得することです

はコミット: はgit rev-parse svn/trunk

この1つは、残念ながらで失敗します。

fatal: ambiguous argument 'svn/trunk': unknown revision or path not in the working tree. Use '--' to separate paths from revisions

まあ、私はこの後ずっと行くことができない....

+5

SubversionよりGitを好む多くのマーケティングがありますが、Subversionを好む多くの理由がありますGitにも。大正真正銘のファイル処理が念頭に置かれています(一つの理由で)。 –

+0

確かに、私はGitを愛し、Subversionに心拍で好意を...しかし、私はこの移行をとにかくする必要があります... –

+0

実際には、私はgitの上の転覆が好きですが、それは私の親しみやすさ、 Subversionとの統合の専門知識。 gitの機能セットとはほとんど関係がありません。 –

答えて

8

いくつかの簡単な手順でSubGitで移行することをお勧めします。

$ svnadmin create svn.repo 
$ subgit configure svn.repo 
$ nano svn.repo/conf/subgit.conf #edit path to your (bare!) Git repository (you may use "git clone --bare <URL> bare.git.repo" if you don't have it locally) 
$ subgit install 

それだけです。翻訳中SubGitは可能な限りすべてのコミット(一時的なものでも)、ブランチ、マージ、無視、日付、EOLの設定、タグなどを保持しようとします。

翻訳後、リポジトリは同期します(Gitへの各プッシュはSVNリビジョンに変換され、その逆もあります)。同期を中断する(必要がない場合)

$ subgit uninstall svn.repo 
+1

SubGitにはサーバー側の設定(つまり 'svn.repo/conf/subgit.conf'ファイル)が必要なので、サーバー自体にアクセスできない場合は使用しないでください。 – Siggen

+1

2.0以降、 'subgit configure --svn-url

'を使ってリモートリポジトリと同じことができます。代わりに(より良い方法として、pre-revprop-changeフックが許せば)リポジトリをローカルに変換し、 'svnsync'または' svndump + svnrdump'を使ってアップロードすることができます。 –

+0

SubGitはすべてのSVN履歴を消去するか、gitコミットに基づいて追加のリビジョンを作成するだけですか? – igorsantos07

3

---詳細を編集後に編集---

空の初期のcom svn/trunkにmit?もしそうでなければ、なぜそれが歴史のなかで見つけられないというエラーを得るのかを説明するでしょう。

(組み合わせ)コメント

The --prefix gives you remote tracking branches like "svn/trunk" which 
is nice because you don't get ambiguous names if you call your local 
branch just "trunk" then. 

Then get the hash of the empty trunk commit: 

は、彼らがsvn/trunkは、既存のtrunkディレクトリとSVNの競合を防ぐためにコミットしたことを暗示する傾向があります。そうだとしたら、おそらく唯一の間違いはsvn/trunkを後で見つけようとしていないのでしょうか?

---オリジナルのポストは、以下の---

あなたはthisを試したことがありますか?トランク(またはブランチ)履歴を線形化するまで、dcommitは正常に動作しません。

移行の試行の詳細を投稿してください。あなたが投稿したものは有用なエラーメッセージですが、そのエラーに到達するまでに使用したステップのリストでは10倍も役立ちます。

+0

'git svn fetch'が失敗します: W:SVNからのエラーを無視して、パスはおそらく(160013):ファイルシステムにはアイテムがありません:ファイルが見つかりません:リビジョン1、パス '/ gentkt' W:上記のメッセージに気をつけないでくださいgit-svnは古い履歴を積極的に検索しています。 svn/trunk fatal:あいまいな引数 'svn/trunk':未知のリビジョンまたはパスがワーキングツリーにありません。これは大きなリポジトリ –

+0

で時間がかかり、 'git rev-parse svn/trunk' リビジョンからパスを区切るには ' - 'を使用してください。 –

+0

Edwin、投稿された質問とあなたがリンクしたステップを更新しました。助けてくれてありがとう、私がもっとやることができるかどうか教えてください。 –