git clone svn将文件夹拆分为单独的git存储库

时间:2013-11-25 12:23:47

标签: git svn git-svn

我有一个SVN仓库的旧转储,结构简单:

trunk/src/
  folder1/
  folder2/
  folder3/
  ...

我知道每个folder实际上都是一个单独的项目,所以我想将这个svn repo克隆到git中,但是将每个folder拆分成单独的git存储库并保留历史记录。我怎么能这样做?

我不需要魔术循环脚本。我可以手动命名每个文件夹。我只想知道如何将特定文件夹从svn克隆到新的git存储库中保存历史记录。

[更新]

我只有一个SVN repo转储,没有SVN服务器。所以我无法做到

git svn clone svn://path/to/my/trunk/src/folder1

相反,我正在使用

git svn clone file://path/to/my/dump

[我尝试过的]

我使用svnadmin创建了一个svn转储文件,然后使用svndumpfilter过滤掉了我需要的文件夹。我设法将原始的svn转储拆分为单独的文件,每个folder一个。

svnadmin dump /svn/old_repos > ./repository.dump
svndumpfilter include /trunk/scr/folder1
      --drop-empty-revs
      --renumber-revs
      --preserve-revprops
    < ./repository.dump > ./folder1.dump

我尝试使用git svn clone file:///path/to/my/folder1.dump但是我收到了这个错误:

Couldn't open a repository:
    Unable to open an ra_local session to URL:
        Unable to open repository `file://path/to/my/filtered/dump/folder1.dump`
           at /usr/lib/git-core/git-svn line 2143

这看起来像转储文件已损坏。我试过了svndump load /repos/folder1 < /path/to/my/folder1.dump但是我又收到了一个错误,这次来自svnadmin:

svnadmin: File not found: transaction `0-0`, path `trunk/src/folder1

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

这就是我的诀窍:

  1. 创建一个svn存储库转储文件以供以后处理:

    svnadmin dump /svn/old_repo > /tmp/svn/repository.dump

  2. 使用svndumpfilter将转储文件拆分为单独的转储:

    svndumpfilter include /trunk/scr/folder1 --drop-empty-revs --renumber-revs --preserve-revprops < /tmp/svn/repository.dump > /tmp/svn/dump/folder1.dump

  3. 创建新的空svn存储库

    svnadmin create /tmp/svn/repos/folder1

  4. 创建root dir insde新的空svn存储库。这是非常重要的!由于一些不清楚的svnadmin错误,我错过了那一步并且几乎疯了:

    svn mkdir file:///tmp/svn/repos/folder1/trunk/src/folder1 --parents -m "Go"

  5. 将新转储加载到空的svn存储库中:

    svnadmin load /tmp/svn/repos/folder1 < /tmp/svn/dump/folder1.dump

  6. 现在有些魔法。注意-T arg - 它非常方便。我用这个来让我的生活更轻松,让folder1成为git repo的根。如果我不这样做,我最终会得到一个像这样的git repo结构:trunk/src/folder1/*(这是我最初在我的svn repo中所拥有的)。我想让folder1作为根:

    git svn clone -T /trunk/src/folder1 file:///tmp/svn/repos/folder1 /new/path/folder1

  7. 就是这样。对于要为其创建新git存储库的每个目录,重复步骤2-7。我最后为此编写了一个简单的脚本。

答案 1 :(得分:0)

这样的东西
git svn clone svn://path/to/your/trunk/src/folder1 

Subversion目录通常被认为是一种自己的存储库。

请注意,在这种情况下不会有SVN分支和标记集成。

如果是转储,您可能需要将其导入某处(例如,进入临时本地SVN存储库)。