2

SubGit 2.0.3 を使用して Subversion リポジトリを Git に移行する作業を行っていますが、再構築全体で完全な履歴を維持しようとしています。ブランチの再構築全体で履歴を維持しているように見える構成がありますが、トランクは維持されていません。

再構築自体は少し...珍しいものでした...そして中間のレイアウトが含まれていました。

初期レイアウト:

  • トランク: /ProjectOldName
  • ブランチ: /ProjectOldName/Releases
  • タグ: なし

中間レイアウト:

  • トランク: /trunk/ProjectNewName
  • ブランチ: /releases/ProjectNewName
  • タグ: なし

最終的なレイアウト:

  • トランク: /ProjectNewName/トランク
  • ブランチ: /ProjectNewName/branches/releases
  • タグ: /ProjectNewName/tags

したがって、変換に使用した subgit マッピングは次のとおりです。

trunk = ProjectNewName/trunk:refs/heads/master
branches = trunk/ProjectNewName:refs/heads/old-master-interim
branches = ProjectOldName:refs/heads/old-master
branches = ProjectNewName/branches/releases/*:refs/heads/releases/*
branches = releases/ProjectNewName/*:refs/heads/old-releases-interim/*
branches = ProjectOldName/Releases/*:refs/heads/old-releases/*
tags = ProjectNewName/tags/*:refs/tags/*
shelves = ProjectNewName/shelves/*:refs/shelves/*

これにより、リリース ブランチの履歴が維持され、ファイルのログは再構築を超えてしまいます...ただし、ブランチの作成 (再構築の前に発生) で停止するように見えました。ただし、マスター上の同じファイルの履歴は、再構築の最終ステップの作成で停止し、予期された「old-master-interim」および「old-master」ブランチは git リポジトリに存在しませんでした。

svn コピーを使用して再構築が行われたようです (つまり、手動でファイルをコピーして再コミットしませんでした)。最終的なレイアウトの履歴は正しく保存されていました。中間レイアウトは 2 回作成されましたが、最初の試みは削除され、履歴が保存されていないことを示すコメントが付けられました。したがって、再構築コミットのチェーンが(トランクの場合)行ったことがわかります。

  • /ProjectOldName から始めます
  • ディレクトリ /trunk/ProjectNewName を追加
  • /ProjectOldName/ から /trunk/ProjectNewName/ に複数のディレクトリ (すべてではありませんがほとんど) を追加します。これらのディレクトリの削除は追加されません (ディレクトリがそのブランチにまだ存在していないため、これがどのように行われたかはわかりません)。
  • /trunk/ProejctNewName/ 内の複数のディレクトリ (上記で追加したものと同じセット) を /ProjectOldName/ から置き換えます (わずかに異なるリビジョンで、おそらく以前の追加をやり直そうとしていますか?)
  • ディレクトリ /trunk/ProjectNewName を削除 (履歴が保存されていないというコメント付き)
  • ディレクトリ /trunk/ProjectNewName を追加 (2 回目)
  • /ProjectOldName/ から /trunk/ProjectNewName/ に複数のディレクトリを追加します。同じディレクトリのセットをもう一度追加しますが、今回は削除が存在しませんでした
  • ディレクトリ /ProjectNewName/trunk を追加
  • /trunk/ProjectNewName/ から /ProjectNewName/trunk/ に複数のディレクトリを追加します
  • ディレクトリ /trunk/ProjectNewName を削除

似ていますが、リリース ブランチでは少し異なります。

  • /ProjectOldName/Releases から始めます
  • ディレクトリ /releases を追加
  • 複数のディレクトリ (ブランチごとに 1 つ) を /ProjectOldName/Releases/ から /releases/ に追加します。
  • ディレクトリ /releases を削除
  • ディレクトリ /releases/ProjectNewName を追加
  • 複数のディレクトリ (ブランチごとに 1 つ) を /ProjectOldName/Releases/ から /releases/ProjectNewName/ に追加します。
  • ディレクトリを追加 /ProjectNewName/branches/releases
  • /releases/ProjectNewName/ から /ProjectNewName/branches/releases/ に複数のディレクトリ (ブランチごとに 1 つ) を追加します。
  • ディレクトリ /releases/ProjectNewName を削除

唯一の本当の違いは、ブランチではなくトランクで発生した「複数のディレクトリを置き換える」ステップのようです。

結局のところ:

  • トランクの再構築全体で履歴を維持しながら、SubGit に上記を変換させる方法はありますか?
  • SubGit は、元のリポジトリ レイアウトのようにトランクの下にブランチを持つことを処理できますか (つまり、/OldProjectName のトランク、/OldProjectName/Releases のブランチ)?
  • 「トランク」マッピングについて何か特別なことはありますか? それとも、実際には「ブランチ」マッピングと変わらないのでしょうか? 私の知る限り、svn と git の両方について、それぞれ「trunk」ディレクトリと「master」ブランチについて特別なことは何もありません。
  • ブランチの履歴は再構築に問題がないように見えますが、ブランチの元の場所に進むのではなく、ブランチの作成で停止します。これは何が原因で、どのように修正できますか (可能な場合)?
4

1 に答える 1

1

トランクの再構築全体で履歴を維持しながら、SubGit に上記を変換させる方法はありますか?

SubGit は、ブランチ ディレクトリ全体がある場所から別の場所にコピーされたときに、ブランチ履歴を追跡できます。

$ svn cp ^/trunk ^/branches/foo

ただし、ブランチ サブディレクトリの一部がコピーされたときの履歴を追跡することはできません。

$ svn add ^/branches/foo
$ svn cp ^/trunk/dir1 ^/branches/foo/dir1
$ svn cp ^/trunk/dir2 ^/branches/foo/dir2
...
$ svn cp ^/trunk/dirN ^/branches/foo/dirN

残念ながら、これはProjectOldName/trunk/ProjectNewName、および/ProjectNewName/trunkディレクトリの再構築が行われた方法です。その結果、SubGit はそれらの履歴を保存できません。

あなたのケースで考えられる回避策の 1 つは、これらのディレクトリを別々のブランチにインポートしてから、インポートした部分をgit-replaceを使用して 1 つの履歴に移植することです。

ただし、この回避策は次の疑問につながります。

SubGit は、元のリポジトリ レイアウト (つまり、/OldProjectName のトランク、/OldProjectName/Releases のブランチ) のように、トランクの下にブランチを持つことを処理できますか?

いいえ、この場合、SubGit はOldProjectNameディレクトリを無視します。

SubGit がOldProjectNameディレクトリをインポートしようとすると、 OldProjectName/Releasesにブランチを追加するリビジョンは、SubGit がそれをまったく新しいディレクトリとして扱うため、意図的に作成しました。

OldProjectNameの履歴を他のブランチに移植するには、そのブランチを個別にインポートすることをお勧めします。

$ subgit configure --svn-url URL REPO
$ git config -f REPO/subgit/config svn.trunk OldProjectName:refs/heads/master
$ subgit import REPO

その後、既に述べた設定でインポートされた Git リポジトリにインポートされた変更をフェッチし、 ProjectOldName/trunk/ProjectNewName、および/ProjectNewName/trunkgit replaceの履歴を結合するために使用できます。

ブランチの履歴は再構築に問題がないように見えますが、ブランチの元の場所に進むのではなく、ブランチの作成で停止します。これは何が原因で、どのように修正できますか (可能な場合)?

これは以前の問題が原因だと思います: ProjectOldNameディレクトリが無視されるため、SubGit は次のようにコピーされたブランチの履歴を保存できません。

$ svn cp ^/ProjectOldName ^/ProjectOldName/Releases/BRANCH

残念ながら、これはProjectOldNameまたはProjectOldName/Releases/*のインポートを選択できることを意味しますが、両方を選択することはできません。ここでも使用git replaceすると、ブランチの履歴を移植することで役立つ場合があります。

「トランク」マッピングについて何か特別なことはありますか? それとも、実際には「ブランチ」マッピングと変わらないのでしょうか? 私の知る限り、svn と git の両方について、それぞれ「trunk」ディレクトリと「master」ブランチについて特別なことは何もありません。

トランクブランチの構成オプションの違いは、Git から SVN へのインポート時にのみ有効です。Git の履歴を SVN にインポートする際、SubGit はトランクとして指定されたブランチが最初のリビジョンから作成され、削除または置換されないようにします。ブランチとして指定されたブランチは、インポートされた SVN 履歴での有効期間が短くなる傾向があります。

SVN の履歴を Git にインポートする場合、トランクブランチの違いはありません。

警告: 1 回限りのインポートを実行するのではなく、Git と SVN リポジトリの同期を維持する場合は、
決して useコマンドを使用しないでください。git replace

質問に必要なすべての詳細を提供していただきありがとうございます。うまくいけば、私の答えは十分に役に立ちます。

于 2015-02-18T07:37:02.650 に答える