如何转换为 GIT 一个旧的 SVN 存储库,后来创建了 trunk/branches

How to convert to GIT an old SVN repository with trunk/branches created later

我正在尝试将一个非常旧的 SVN 存储库迁移到 GIT 维护历史记录,但要记住该存储库一直没有 trunk/branches/tags 结构,而是它是在没有它们的情况下创建的,后来将存储库迁移到 trunk/branches/tags 结构。

我已经尝试使用 git-svn 命令:

git svn clone <repo_url> --stdlayout

但问题是历史记录在“创建的主干、分支和标签”提交时被切断,因此该提交之前的所有内容都丢失了。我也尝试过:

git svn clone <repo_url> -T/ -bbranches -ttags

它获取所有提交,但在提交图中创建一个真正的网格,因为它在分支和主干中复制提交,并且不在主分支和分支之间创建任何关系。我尝试使用如下命令清理它:

git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch branches tags" -- --all

wich 从 trunk 分支中删除了 branches 文件夹,大部分是正确的,(并删除了很多重复的提交)并且还尝试将 trunk 文件夹移动到根目录:

git filter-branch --tree-filter "if test -d 'trunk'; then  git mv trunk/\* .; fi" --tag-name-filter cat --prune-empty -- --all

但不起作用。我正在研究 windows,所以 git-svn 文档中用于移动所有项目的命令对我不起作用(缺少 sed):

git filter-branch --index-filter \
    'git ls-files -s | sed "s-\t\"*-&newsubdir/-" |
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
            git update-index --index-info &&
     mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD

(我重写为:)

git filter-branch --index-filter \
    'git ls-files -s | sed "s-\t\"trunk/\(*\)--" |
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
            git update-index --index-info &&
    mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD

知道我正在尝试做的事情是否可行,或者我应该退出并仅保留历史直到创建 trunk/branches/tags?

我终于找到了一个解决方案:使用 svn-all-fast-export (svn2git) 我必须使用以下脚本创建一个包含所有历史记录的存储库:

create repository REPONAME
end repository

# Master branch

match /
  repository REPONAME
  max revision REVISION_BEFORE_TRUNK_BRANCHES_TAGS_CREATION
  branch master
end match

match /trunk/
  repository REPONAME
  branch master
end match

# Common branches

match /branches/([^/]+)/
  repository REPONAME
  branch 
end match

# Ignore everything else
match /
end match

因为我在 windows,必须在 Windows Substime 编译 Linux,安装 "build-essential subversion git qtchooser qt5-default libapr1 libapr1-dev libsvn-dev";或带有以下库的 cygwin(如 this issue 中所述)

gcc-g++ (v7.4.0-1)
libQt5Core-devel (v5.9.4-2)
libapr1 (v1.6.5-1)
libapr1-devel (v1.6.5-1)
make (v4.2.1-2)
subversion (v1.11.1-1)
subversion-devel (v1.11.1-1)