2016-11-04 7 views
1

私のSVNの構造は、このようなものです:すべてのブランチがルートにあるSVNリポジトリをクローンするには?

/ 
|-- Branch1 
|-- Branch2 
|-- Branch3 
... 

にはどうすれば枝を維持gitリポジトリ(すなわちないフラット歴史)にこれを複製することができますか?

ボーナスに関する質問:SVNブランチのサブセットのみを新しいgitリポジトリにクローンする方法は?

+0

これは、SVNからGitへのワンタイム変換についてのことですが、Gitのみを使用していますか、GitからSVNにコミットしたいですか? – Vampire

+0

これは一回の変換ですが、私は新しいSVNコミットを私のgitリポジトリに転送できるようにしたいと思います。 – user1709708

答えて

0

私は、SVNブランチは単にフォルダであると信じています。 Gitは実際にブランチで動作します。これにより、アプローチがより簡単になります。

SVNリポジトリからデータを取得する必要があるので、リモートを作成する必要があります。構造から、あなたのgitリポジトリにBranch 1〜3を作成する必要があることがわかります。

Gitリポジトリを作成します。

git init 
git config --local --add user.name <Username> 
git config --local --add user.email <email> 
echo "MASTER" > master 
git add master 
git commit -m "Dummy commit" 

SVNブランチのリモートを作成します。

支社用
git config --add svn-remote.<BranchName>.url <SVN URL> 
git config --add svn-remote.<BranchName>.fetch :refs/remotes/<RemoteName> 

git config --add svn-remote.branch1.url https://svnhost/svn/MyRepo/Branch1 
git config --add svn-remote.branch1.fetch :refs/remotes/branch1_remote 

は、支社のSVNのデータを取得:

git svn fetch branch1 

を繰り返し、この他の二つの枝支社とBranch3ため。

クローンを作成しようとしている場合は、ここで停止することができます.Gitリポジトリを使用したい場合を除いて、先に進む必要はありません。 gitサブツリー上のGoogleが、なぜこれがあなたのケースで正しい解決策になるのかを知ってください。あなたのためのボーナス質問

Find last commit id: 
git checkout remotes/branch1_remote 
git svn log -n 1 --show-commit --oneline 
Output: 734713bc047d87bf7eac9674765ae793478c50d3 (This is yout LastCommitId value) 

Create subtree in mainline master branch: 
git checkout master 
git subtree add --prefix=Branch1 <LastCommitId> 

:この1つは簡単です。この

git svn clone https://svnhost/svn/MyRepo/Branch2 

を試してみて、他の方法は、上記の手順に従うことで、代わりに3つのリモコンを作成するのにサブツリーを作成する

同じリポジトリが毎回新しいリポジトリを作成し、ブランチのリモートを追加します。あなたの要件に基づいて、異なる方法でGoogleを行うことができます。

0

ブランチが作成される前に、トランクのみの最初のいくつかのリビジョンを複製します。私はあなたのブランチがリビジョン5より前に作られていないと仮定しています。私はまたあなたのトランクフォルダがtrunkという名前であると仮定しています。それに従って調整してください。うまくいけば、既に著者ファイルを作成していることを望みます。これにより、ローカルリポジトリが設定されます。

$ git svn clone https://svn.example.com/myrepo --authors-file=authors.txt -T trunk -r 1:5 myrepo 

次は、これに似myrepo/.git/configbranchesの行を追加:

:あなたの枝があなたの例のように、パターンと一致させることができる命名規則に従っている場合、あなたはこれを行うことが

[svn-remote "svn"] 
    url = https://svn.example.com/myrepo 
    fetch = trunk:refs/remotes/origin/trunk 
    branches = branches/Branch1:refs/remotes/origin/* 
    branches = branches/Branch2:refs/remotes/origin/* 
    branches = branches/Branch3:refs/remotes/origin/* 

[svn-remote "svn"] 
    url = https://svn.example.com/myrepo 
    fetch = trunk:refs/remotes/origin/trunk 
    branches = branches/Branch*:refs/remotes/origin/* 

編集後にmyrepo/.git/svn/.metadataを削除することをおすすめの人もいます。それが必要かどうかわかりません。

残りのリビジョンをフェッチするだけです。 Git svnはブランチ構造を整えて正しいことを行います。 branchesのいずれかに一致しないブランチは無視されます。

$ cd myrepo 
$ git svn fetch 

完了したら、このコマンドでブランチが作成されたことを確認できます。

$ git branch -r 
    origin/Branch1 
    origin/Branch2 
    origin/Branch3 
    origin/trunk 
関連する問題