【问题标题】:git clone svn to split folders into separate git repositoriesgit clone svn 将文件夹拆分为单独的 git 存储库
【发布时间】:2013-11-25 12:23:46
【问题描述】:

我有一些结构简单的 SVN 存储库的旧转储:

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

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

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

[更新]

我只有一个 SVN 存储库的转储,没有 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 &lt; /path/to/my/folder1.dump,但又遇到了另一个错误,这次来自 svnadmin:

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

有什么想法吗?

【问题讨论】:

  • 转储 SVN 存储库?如svnadmin dump?当我遇到这个问题时,我设置了临时的本地 SVN 存储库,将转储导入那里,然后运行 ​​git svn clone
  • @Vi。 SVN repo 的转储 - 如cp -r /path/to/repo/root /some/other/place :)
  • 所以尝试使用常规的 Subversion 工具检查(或打印信息svn info)您要克隆的目录,然后,当您确定我们正确的路径语法时,将其插入到git svn clone .

标签: git svn git-svn


【解决方案1】:

这就是我的诀窍:

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

    svnadmin dump /svn/old_repo &gt; /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. 在新的空 svn 存储库中创建根目录。这个非常重要!由于一些不清楚的 svnadmin 错误,我错过了这一步,差点发疯:

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

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

    svnadmin load /tmp/svn/repos/folder1 &lt; /tmp/svn/dump/folder1.dump

  6. 现在一些 git 魔法。注意-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

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

【讨论】:

    【解决方案2】:

    有点像

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

    ?

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

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

    如果发生转储,您可能需要将其导入某个地方(例如,导入到临时本地 SVN 存储库)。

    【讨论】:

    • 没有分支,所以这不是问题。问题是我只有 SVN 转储。没有实际的 SVN 服务器,所以我使用git svn clone file://.....。我编辑了我的问题来解释这一点。
    猜你喜欢
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2011-06-20
    • 2011-01-23
    • 1970-01-01
    • 2016-01-23
    相关资源
    最近更新 更多