2016-07-15 13 views
1

GitHubにはしばらくの間プロジェクトがありましたが、以前はsvnから移行されました。それが最初に移行されたとき、SVN履歴はGitに持ち込まれませんでした。プロジェクトの設定後にSVNの履歴をGitにコピー/インポート/クローン/移動する方法はありますか?SVNから既存のGitプロジェクトへの履歴をインポート

+0

Subversionの履歴に基づいて新しいクローンを作成し、それらの変更を既存のGitリポジトリにマージしようとすることができます。 Subversionの履歴を既存のGit履歴のベースとして紹介することはできませんが、今すぐマージする並列履歴として追加することができます。 – poke

+0

@pokeなぜ彼はできないはずですか?もちろん彼はそうです。もちろん、彼はこれを使って公開された履歴を書き直して、リポジトリを使用する人はいつでも、変更された公開履歴を持つようにすべてのブランチを手作業で再配置する必要があります。 – Vampire

+0

@ヴァンパイア彼は歴史を書き直すことはできません、それは私が言ったことです。プロジェクトがしばらく活動していれば、歴史をそのまま保つのが良い考えです。 – poke

答えて

1
を文句を言うだろう

git-svnではありませんレポジトリの1回の変換に適したツールです。 Gitを既存のSVNサーバーのフロントエンドとして使用する場合は便利ですが、ワンタイムコンバージョンの場合はではなくを使用してください。git-svnを使用しますが、svn2gitはこのケースに適しています。

svn2gitというPlenyツールがありますが、おそらく最も良いのはhttps://github.com/svn-all-fast-export/svn2gitのKDEです。そのsvn2gitツールを使用することを強くお勧めします。それは私がそこで利用できると知っている最高です、そして、それはあなたがそのルールファイルでできることに非常に柔軟です。

svnevereverからhttp://blog.hartwork.org/?p=763までの履歴は、SVNリポジトリの履歴をGitに移行する際の履歴を調べるのに最適なツールです。


あなたが適切なGitのリポジトリにあなたのSVNのレポを変換した後、既存のレポにリモートとして新しく生成されたレポを追加してコミットを取得します。次に、git replaceを使用して、新しい履歴の最初のコミットを古い履歴の最後のコミットに置き換えます。これをパーマネントにしたい場合は、を使用して、パーマネントを置き換えることができます。

公開された履歴を書き換え、元の履歴に基づいて地元の支店を持つすべての人は、git rebaseの文書に記載されているようにこの履歴の変更から回復する必要があることに注意してください。これを望まない場合は、新しく移行したリポジトリをGitリポジトリに引き込んで、SVN履歴から新しいブランチを作成するだけです。あなたはその後、技術的にはOKの複数のルートコミットと独立した履歴を持ちますが、ファイルの履歴は引き続き削除されます。

1

これは可能ですが、リポジトリを既にクローンしているすべてのユーザーに影響を与えます。それでそれが価値があるかどうかを最初に決める必要があります。

されていない場合は、単にのgit-svnの別のgitリポジトリ内で複製し、ソースコードの歴史のためにそこにそれを維持...

あなたは歴史が取得されると、さらに移動したい場合は、追加この新しいリポジトリはあなたの実際のリポジトリにリモートとしてあり、フェッチします。

git fetch --all 

これが完了したら、ばらばらの履歴があります。

次に、 'git replace'を使用して、新しいリポジトリの最初のコミットを、最後に取り出したブランチに置き換えます。

https://git-scm.com/docs/git-replace

そして最後には、間違いなく歴史を書き換えすることを、 'gitのフィルタ分岐' を使用しています。

次のようなもので、新しい歴史をプッシュする必要があります:クローンまたはすべての履歴を取得する必要があります

git push origin --all 

および他のすべての開発者...そして;-)

+0

アドバイスをいただきありがとうございます。現在のところ、レポのクローンはほんのわずかなので、コントロールしています...私は同様のことをする予定です。私の考えは、svnをgitに変換し、このレポを既存のレポのブランチとしてマージし、既存のレポのマスタを再配置することです。それがうまくいくと思いますか? – mattsun

+0

2つの解決策は同じです(私が記述したように、あなたが「フェッチする」と言っていない場合を除いて、2つの解決策は同じです)そうでなければ、あなたはまっすぐ地獄に行きます。 ... – Philippe

関連する問題