我有一个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
有什么想法吗?
答案 0 :(得分:2)
这就是我的诀窍:
创建一个svn存储库转储文件以供以后处理:
svnadmin dump /svn/old_repo > /tmp/svn/repository.dump
使用svndumpfilter
将转储文件拆分为单独的转储:
svndumpfilter include /trunk/scr/folder1
--drop-empty-revs
--renumber-revs
--preserve-revprops
< /tmp/svn/repository.dump > /tmp/svn/dump/folder1.dump
创建新的空svn存储库
svnadmin create /tmp/svn/repos/folder1
创建root dir insde新的空svn存储库。这是非常重要的!由于一些不清楚的svnadmin错误,我错过了那一步并且几乎疯了:
svn mkdir file:///tmp/svn/repos/folder1/trunk/src/folder1 --parents -m "Go"
将新转储加载到空的svn存储库中:
svnadmin load /tmp/svn/repos/folder1 < /tmp/svn/dump/folder1.dump
现在有些魔法。注意-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。我最后为此编写了一个简单的脚本。
答案 1 :(得分:0)
像
这样的东西git svn clone svn://path/to/your/trunk/src/folder1
Subversion目录通常被认为是一种自己的存储库。
请注意,在这种情况下不会有SVN分支和标记集成。
如果是转储,您可能需要将其导入某处(例如,进入临时本地SVN存储库)。