10

これが私の問題です:

  1. Git に切り替えるまで、Subversion をしばらく使用していました。さらに時間が経過しました。
  2. Subversion から Git への履歴のインポートはありませんでした。それは厳密なチェックアウト、.svn ディレクトリの削除、そして git init でした。賢明な動きではありません。
  3. 今、何千もの git コミットが行われた後、最初の git コミットが発生したときに作成された Subversion リポジトリのバックアップを見つけました。あはは!

gitリポジトリを0日目にロールバックし、svnリポジトリを適切にインポートしてから、すべてのgit変更を再適用して、最初に行われなかったものを修正したいと思います。

誰もこれを試みましたか?どうすればこれを行うことができますか?すべてのリベースの母のように聞こえます。

4

2 に答える 2

15

git グラフトの仕事のように聞こえます。これに関するドキュメントは少し大ざっぱですが、基本的にやりたいことは次のとおりです。

  1. リポジトリ内の svn の git-svn コピーを取得します。これを行う最も簡単な方法は、svn クローンを git してから、既存のリポジトリで svn クローンを取得することです
  2. svn コミットの後にどのベース コミットが続くかを判断します。したがって、おそらくどこかに git ルート (「最後の SVN バージョン」) があり、実際の SVN の最後のバージョンに従う必要があります。これは、先ほど取得した git-svn クローンの先頭です
  3. ファイル .git/info/grafts を作成し、2 つの sha を 1 行に配置します。最初は最初の git コミット、次にスペース、そして最後の svn コミットです。これは、git コミットが親なしではなく、実際には最後の svn コミットを親として持っていることを git に伝えます。
  4. 2 つのリポジトリが接続されていることを gitk/gitx/whatever で確認できるようになりました
  5. 変更を永続的にするには、git filter-branch を実行します。おそらく最初にそのマンページを読みたいと思うでしょう。

もちろん、すべてのブランチに対してステップ 3 を実行することもできます。jpalecek のアプローチの問題は、リベースが履歴を平坦化することです。そのため、マージがあった場合、リベースはそれらを失います。フィルター ブランチ アプローチでは、履歴がそのまま保持されます。

于 2009-01-19T23:39:40.033 に答える
1

私はあなたが望むものを試したことはありませんが、CVS で似たようなことをしています。

基本的に、私はお勧めします:

  1. svn の履歴を使用して新しい git リポジトリを作成します
  2. この新しいリポジトリでgit fetchは、git リポジトリのすべて (共通のコミットはありません)
  3. 次に、git branch remote/branch branch-lastgit rebase --onto svn-last remote/branch-first branch-lastインポートremote/branch-firstした git リポジトリの最初のコミットなどです。

より多くのブランチがある場合、事態はより複雑になります。手順 3 を繰り返すとよいと思いますが、自分で試した方がよいでしょう。git 履歴にマージがある場合は、git rebase -i -p .... git の利点は、基本的に何も台無しにできないことです (特に、別のリポジトリで作業している場合)。

于 2009-01-19T23:18:47.423 に答える