既存の Git リポジトリを SVN にプッシュする 質問する

既存の Git リポジトリを SVN にプッシュする 質問する

私はすべての作業を Git で実行し、GitHub にプッシュしてきました。ソフトウェアとサイトの両方に非常に満足しており、現時点では作業方法を変更するつもりはありません。

私の博士課程の指導教官は、すべての学生に、大学でホストされている SVN リポジトリに作業を保存するように求めています。既存の SVN リポジトリを Git にプルダウンする方法に関するドキュメントやチュートリアルはたくさん見つかりましたが、Git リポジトリを新しい SVN リポジトリにプッシュする方法は見つかりませんでした。git-svn と新しいブランチ、リベース、その他すばらしい用語を組み合わせてこれを行う方法があるはずだと思っていますが、私は Git 初心者で、どれも自信がありません。

次に、選択したときにいくつかのコマンドを実行して、その SVN リポジトリにコミットをプッシュします。Git を使い続け、SVN リポジトリに Git の内容をミラーリングさせたいと思います。

もしこれが何か違いをもたらすなら、私は SVN にコミットする唯一の人になるでしょう。

ベストアンサー1

私もこれが必要だったので、Bombe の回答と少しいじってみて、うまくいきました。レシピは次のとおりです。

Git をインポート -> Subversion

1. cd /path/to/git/localrepo
2. svn mkdir --parents protocol:///path/to/repo/PROJECT/trunk -m "Importing git repo"
3. git svn init protocol:///path/to/repo/PROJECT -s
4. git svn fetch
5. git rebase origin/trunk
5.1.  git status
5.2.  git add (conflicted-files)
5.3.  git rebase --continue
5.4.  (repeat 5.1.)
6. git svn dcommit

3 番目以降では、次のような不可解なメッセージが表示されます。

上位レベルの URL の使用:protocol:///path/to/repo/PROJECT => protocol:///path/to/repo

それは無視してください。

5 を実行すると、競合が発生する可能性があります。これらの競合を解決するには、状態が「未マージ」のファイルを追加し、リベースを再開します。最終的には完了します。その後、 を使用して SVN リポジトリに同期し直しますdcommit。これで完了です。

リポジトリの同期を維持する

次のコマンドを使用して、SVN から Git に同期できるようになりました。

git svn fetch
git rebase trunk

Git から SVN に同期するには、次を使用します。

git svn dcommit

最後に

ライブ リポジトリに適用する前に、ローカル コピーでこれを試してみるとよいでしょう。Git リポジトリのコピーを一時的な場所に作成できます。cp -rすべてのデータはリポジトリ自体にあるため、 を使用するだけです。次に、以下を使用してファイルベースのテスト リポジトリを設定できます。

svnadmin create /home/name/tmp/test-repo

次のコマンドを使用して、作業コピーをチェックアウトします。

svn co file:///home/name/tmp/test-repo svn-working-copy

そうすれば、永続的な変更を加える前にいろいろ試してみることができます。

補足:失敗したらgit svn init

誤って間違った URL で実行しgit svn init、作業のバックアップを取っていなかった場合 (聞かないでください...)、同じコマンドを再度実行することはできません。ただし、次のコマンドを発行して変更を元に戻すことはできます。

rm -rf .git/svn
edit .git/config

そしてセクションセクションを削除します[svn-remote "svn"]

その後、新たに実行できますgit svn init

おすすめ記事