7

タイトルとして、git-svn (r1 から始まるすべてのコミットを含む) を使用して完全なクローンから svn リポジトリを再構築する方法はありますか?

編集:

おそらく、それを行うための実用的な手段を探していることを追加する必要があります(元のsvnリポジトリと同じように使用できる限り、ほぼ完全なコピーで問題ありません)

4

2 に答える 2

9

はい、git-svn リポジトリの近くに SVN リポジトリを作成することは可能です (Git マージ コミットから svn:mergeinfo を復元し、.gitignore から svn:ignore を復元することもできます)。その手順は次のとおりです。

1.ブランチとタグを準備します。

refs/remotes/* ごとに refs/heads/* を作成します (現在の refs/heads/* の位置は失われます):

$ git branch -a | awk '/remotes\/([^\/])+$/{ref=substr($1, 9); system("git update-ref refs/heads/" ref " refs/remotes/" ref )}'

または、すべての興味深いブランチに refs/heads/* を手動で設定できます

refs/heads/master は SVN トランクにマップされますが、上記のスクリプトは refs/heads/trunk を refs/remotes/trunk に設定することに注意してください。したがって、実行後、refs/heads/master を refs/remotes/trunk に設定し、refs/heads/trunk を削除する必要があります。

$ git update-ref refs/heads/master refs/remotes/trunk
$ git branch --delete refs/heads/trunk

タグについても同じです: refs/tags/* を refs/remotes/tags/* の位置に設定します:

$ git branch -a | awk '/remotes\/tags\/([^\/])+$/{ref=substr($1, 14); system("git update-ref refs/tags/" ref " refs/remotes/tags/" ref )}'

これらの参照のみが変換されるため、すべての refs/remotes/* および refs/remotes/tags/* が refs/heads/* および refs/tags/* に変換されていることを確認します。

2.空のSVNリポジトリを作成する

$ svnadmin path/for/svn/repository

3. 手順 1 で準備した refs/heads/* と refs/tags/* を含むベア Git リポジトリを作成します。

$ git clone --bare path/to/git-svn/repository path/for/svn/repository/.git

4. このリンクを使用して SubGit をダウンロードしてインストールします(Git から「git-svn-id:」署名を削除する中間ビルドは、変換中にメッセージをコミットします)。一般に、SubGit は無料ではありませんが、ワン ショット変換 (あなたの場合) には無料で使用できます。SubGit でリポジトリを変換します (パス/for/svn/repository/.git で Git リポジトリを見つけることが期待されます)。

$ subgit install path/for/svn/repository

5.SubGit のインストール後、Git と SVN リポジトリは同期されます。必要に応じて、双方向同期を中断するには (いつでも有効にできます)、実行します。

$ subgit uninstall path/for/svn/repository
于 2012-11-08T16:56:55.943 に答える
1

理論的には、元の Subversion リポジトリに非常に近いリポジトリを再作成することが可能です。ただし、Subversion リポジトリ データ (プロパティや mergeinfo など) には、 によって複製されない側面がいくつかありますgit-svnしたがって、必ずしもオリジナルの正確なコピーを再作成できるとは限りません。

于 2012-11-08T08:00:45.907 に答える