如何转换为 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)
我正在尝试将一个非常旧的 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)