如何git克隆所有分支都位于root中的SVN存储库?

时间:2016-11-04 10:10:08

标签: git branch git-svn

我的SVN结构是这样的:

scroll","x":0,"y":290},{"timestamp":1477783331,"event_type":"dom.
scroll","x":0,"y":295},{"timestamp":1477783331,"event_type":"dom.
scroll","x":0,"y":299},{"timestamp":1477783331,"event_type":"dom.
scroll","x":0,"y":301},{"timestamp":1477783331,"event_type":"dom.
scroll","x":0,"y":302},{"timestamp":1477783331,"event_type":"dom.
scroll","x":0,"y":303},{"timestamp":1477783332,"event_type":"dom.
scroll","x":0,"y":306},{"timestamp":1477783332,"event_type":"dom.
scroll","x":0,"y":326},{"timestamp":1477783332,"event_type":"dom.
scroll","x":0,"y":347},{"timestamp":1477783332,"event_type":"dom.
scroll","x":0,"y":367},{"timestamp":1477783332,"event_type":"dom.
scroll","x":0,"y":381},{"timestamp":1477783332,"event_type":"dom.
scroll","x":0,"y":393},{"timestamp":1477783332,"event_type":"dom.
scroll","x":0,"y":405},{"timestamp":1477783332,"event_type":"dom.
scroll","x":0,"y":414},{"timestamp":1477783332,"event_type":"dom.
scroll","x":0,"y":427},{"timestamp":1477783332,"event_type":"dom.
scroll","x":0,"y":434},{"timestamp":1477783332,"event_type":"dom.

如何将其克隆到保存分支的git存储库中(即不是平坦的历史记录)?

奖金问题:如何只将一部分SVN分支克隆到新的git存储库中?

2 个答案:

答案 0 :(得分:0)

在创建任何分支之前,仅克隆仅有主干的前几个修订版。我假设您的分支在修订版5之前没有创建。我还假设您的trunk文件夹名为trunk。相应调整。希望您已经创建了一个authors文件。这将设置本地存储库。

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

接下来,在branches中添加myrepo/.git/config行,类似于:

[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

答案 1 :(得分:0)

我相信在SVN分支只是文件夹,它只是一个约定。 Git实际上与分支机构合作。这样,方法就变得更容易了。

由于您需要从SVN存储库获取数据,因此您需要为其创建远程数据。从结构中我看到你需要在你的git存储库中创建分支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>
Branch1的

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

获取branch1的SVN数据:

git svn fetch branch1

对其他两个分支Branch2和Branch3重复此操作。

如果您只是尝试克隆,可以在这里停止除非您想使用Git存储库,否则无需继续操作。谷歌在git子树上知道为什么在你的情况下这可能是正确的解决方案。

创建子树:

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>

对于你的奖金问题:试试这个

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

这个很简单,另一种方法是按照上面的步骤,而不是在同一个存储库中创建三个遥控器,每次都创建新的存储库,然后添加你的分支机构的遥控器。根据您的要求,您可以采用不同的方式进行谷歌搜索。