1

ここで説明するには長い時間がかかるため、ローカル SVN リポジトリを作成し、リモート リポジトリの内容をコピーして、合計 60 回のコミットを行いました。その間、リモート リポジトリは少しも変更されていません。ここで、リモート リポジトリで 60 個のコミットを取得したいと考えています。これを達成するための最良の方法は何ですか?

私は解決策を探していました。最初に見つけたのは svnsync でしたが、これは新しい空のリポジトリに対してのみ機能します。

いくつかの同様の質問には、「git-svn を使用する」という回答がありましたが、これがどのように機能するかについての説明はありませんでした。私が得る問題は、GIT で 2 つの無関係なブランチになってしまうことです。git-replace を使用すると、ローカル ブランチの祖先をリモート ブランチにマークできるはずですが、小規模なテストでは大量のマージが発生します。最後の手段として、ローカル リポジトリからすべてのパッチを取得してリモート リポジトリに適用するシェル スクリプトを作成することができます。インターネットのどこかにあるはずなのですが、見つかりません。

将来のシナリオでは、私は常に GIT を使用してローカル リポジトリを取得します。そうすれば、多くの問題を解決できたはずです。


私の小規模な git-svn テストを詳しく説明するには:

  • SVN リポジトリ svn-original を作成し、チェックアウトし、いくつかのコミットを行います
  • SVN リポジトリ svn-local を作成し、svn-original チェックアウトの内容をコピーし、コミットし、他のいくつかのコミットを行います
  • 私はWindowsを使用しているので、svn-serveを使用して、デフォルトポートでsvn-original用のサーバーを作成し、ポート1234でsvn-localを作成します

次に、コンソールでこれを行いました:

cd temp/git
git svn init --prefix=svn-original –R svn-original svn://localhost/ --stdlayout 
git svn init --prefix=svn-local –R svn-local svn://localhost:1234/ --stdlayout
git svn fetch svn-original
git svn fetch svn-local
git checkout -b svn-original svn-original/trunk
git checkout -b svn-local    svn-local/trunk
git log svn-local --oneline
#  find the commit that adds code from the original
git log svn-original --oneline
#  find the last commit
git-replace <first-local> <last-original>

これは機能しません: svn-original の最後のコミットは、svn-local の一部として gitk に表示されるようになりました。マージするとマージ競合が発生し、dcommit が失敗します。

4

1 に答える 1