5

バックグラウンド

私たちの分散した開発チームには、リモートに配置された集中型の SVN リポジトリがあり、複数のチームがソース コードをコミットするために使用されます。ローカル パフォーマンスを改善するために、コード レビュー プロセスにGerrit (SVN の代わりに確かに Git) を使用することを決定したため、Git のマスターをリモート SVN リポジトリと相互運用する「ハブ」として設定しています。

問題

通常、この問題の回避策は git-svn です。ただし、git-svn を介して複製されたブランチは、従来の ".git" とは異なるフォルダー構造を持ち、Gerrit によって認識されません。

現時点での回避策

そこで、ちょっとナイーブに見える手段を採用。

  1. リモート SVN リポジトリをチェックアウトします。
  2. SVN 作業コピーとまったく同じディレクトリで、対応する git リポジトリを git clone します。したがって、このディレクトリには「.svn」のほかに「.git」もあります。

    $ svn co http://remote.svn.repository/some_project

    $ cd some_project

    $ git clone --no-checkout git_reop ./tmp

    $ mv ./tmp/.git ./ # Move .git directory to SVN working copy.

    $ rm -rf ./tmp

    $ git reset --hard HEAD # This is tricky to tell git I want to use this directory as unstaged.

質問

SVN と Git の間で共有リポジトリを使用している場合、git-svn を使用せずに Git リポジトリを SVN 作業コピーと同じディレクトリにプルするだけで問題はありますか?

4

2 に答える 2

1

Subversion のリビジョンと対応する Git の間のマッピングが暗黙的であるため、このアプローチはすぐに面倒になります。また、Subversion および Git リポジトリで無視パターンの適切な対応を維持することも困難です。

代替ソリューションは、サーバー側の双方向 Git-SVN ミラーであるSubGitを使用することです。以下は、SubGit 2.0を使用した例です(現在 EAP 段階にあります)。

$ subgit configure --svn-url http://host.com/svn/repo GIT_REPO
# Adjust GIT_REPO/subgit/authors.txt to add author names and emails
# Specify at least one username/password at GIT_REPO/subgit/passwd
$ subgit install GIT_REPO

その後、GIT_REPO は Subversion リポジトリと同期されます。任意の Git クライアントを使用して、この Git リポジトリを操作できます。プッシュされたすべてのコミットは、すぐに SVN に送信されます。

さらに、Gerrit サーバーをセットアップして、次のように操作できます。

$ git init .
$ git remote add subgit SUBGIT_URL
$ git fetch subgit
$ git remote add gerrit GERRIT_URL
$ git fetch gerrit
$ git commit -m 'Work in progress'
$ git push gerrit
$ git push subgit

最後のコマンドが発行されるとすぐに、対応する Git コミットが SubGit によって SVN リビジョンに変換されます。

SubGit は商用製品ですが、EAP 段階にある限り無料です。私は SubGit 開発者の 1 人です。

于 2013-05-06T15:42:40.417 に答える