8

コードベースのほとんどをモノリシックsvnリポジトリから一連のgitリポジトリに移動しました。さまざまな理由から、一部の作業 (フィールドに展開されたプロジェクトの古いバージョンで) は、古いブランチに移動してから削除したsvn後、古いブランチで続行する必要があります。gittrunk

ブランチでこのような作業を行い、次のようにしてリポジトリからリポジトリにsvn変更を再適用しました。svngit

cd <common_svn_commit_root>
svn diff -r 12344:12345 > ~/r12345.diff
gedit ~/r12345.diff
cd <common_git_commit_root>
git apply ~/r12345.diff

svnしかし、コミットごとにこれを行うのはかなり面倒です。特に、gedit手動でsvnパスをgitパスに変更する必要があるステップ (通常は、最上位のディレクトリ名をプレフィックスとして付けます)。

これまでに提示されたオプションのいくつかを試す際の問題の 1 つは、古いsvnリポジトリと新しいgitリポジトリの構造が異なることです。これが、パッチ ファイルを編集しなければならない理由の 1 つです。

古いディレクトリ構造は

svn
    configurations
        blah
        mine
        blam
    plugins
        foo
        core
        mine
        bar

一方、新しい構造は

svn
    plugins
        bar
git
    my_git
        my_config
        plugins
            mine
    core_git
        plugins
            core
    foo_git
        plugins
            foo

これを行うためのより簡単な方法があるかどうかを知り、この状況でのベスト プラクティスが何であるかを理解したいと思います。

4

3 に答える 3

2

git svn を使用して、git リポジトリを svn からの変更と同期できます。

git svn --authors-file=authors.txt clone https://repo/svn/reponame/trunk reponame-git-svn

# if something aborts:
cd reponame-git-svn
git svn fetch

# create a new branch
git checkout -b dvcs

git remote add dvcs-svn https://repo/git/reponame.git

これにより、svn ソースが git ブランチに残ります。svn から git に同期するには:

git checkout master
# get the changes from svn
git svn rebase
git checkout dvcs

# apply the changes from svn
git rebase master

# fetch the changes from git repo to the local repo
git fetch dvcs-svn

# apply the changes from git repo to the branch dvcs
git rebase dvcs-svn/master

# push all changes back to git repo
git push dvcs-svn dvcs:master

マージよりもリベースの方が優れた経験があります。うまくいけば、これはあなたのためにも仕事をします.

于 2012-07-13T09:51:19.710 に答える
1

ソースのディレクトリ構造が同じであると仮定すると、古い SVN ブランチにリモートを追加することをお勧めします:

$ git config --add svn-remote.svn-branch.url http://my.svn.server/project/branches/my-branch
$ git config --add svn-remote.svn-branch.fetch :refs/remotes/old-svn-branch

このようにして、古い SVN ブランチとローカル ブランチの新しい Git サーバーの両方で変更を追跡し、git-cherry-pickを使用して修正を含むコミットを Git サーバー ブランチに適用できます。

編集

Git はファイルの移動を追跡します。

私はそれを自分で試しませんでしたが、SVNリポジトリを複製し、新しいGitサーバー構造に一致するようにディレクトリをローカルに移動すると、チェリーピックマージは移動したファイルに適用できます.

一部のファイルではすでに機能していましたが、いくつかの制限があるかもしれません。それは間違いなく試してみる価値があります。

于 2012-07-13T14:40:05.437 に答える