发现我最初提出的方法效果很好。
采取的步骤
- 创建等效于 'gitrepos' 的 'svnrepos' 以有两个子目录来保存实际的 repo 和原始文件集:
mkdir /home/build/REPOS/svnrepos && mkdir /home/build/REPOS/svnrepos/repos && mkdir /home/build/REPOS/svnrepos/files
cd /home/build/REPOS/svnrepos/repos && svnadmin create project_name
- 获取原始源文件。这将解压为“project_name”:
cd /home/build/REPOS/svnrepos/files && wget http://site.net/project_name.tar.gz && tar -xzf project_name.tar.gz
svn import /home/build/REPOS/svnrepos/files/project_name file:///home/build/REPOS/svnrepos/repos/project_name -m "Initial import of project_name"
- 重命名现有的“GIT_Project”文件夹,因为我们将使用此名称作为临时 svn 工作文件夹:
cd /home/build/REPOS/gitrepos && mv GIT_Project GIT_Project_git
- 创建新的 'GIT_Project' 文件夹并将 svn repo 签入:
mkdir GIT_Project && svn co file:///home/build/REPOS/svnrepos/repos/project_name /home/build/REPOS/gitrepos/GIT_Project
- 递归删除新临时 svn 工作文件夹中不在“.svn”目录树下的每个文件。保持文件夹结构不变:
cd /home/build/REPOS/gitrepos/GIT_Project && find . -type f | grep -v '.svn' | xargs rm -f
- 递归删除原始 git 版本文件夹中的每个“.svn”文件夹:
cd /home/build/REPOS/gitrepos/GIT_Project_git && rm -rf
寻找 。-type d -name .svn`
- 从截断的临时 svn 工作文件夹创建一个 tar 文件:
cd /home/build/REPOS/gitrepos && tar -czf svn.tgz GIT_Project
rm -fr GIT_Project
mv GIT_Project_git GIT_Project
- 解压缩截断的临时 svn 工作文件夹 tar 文件,以将更新的“.svn”文件夹和内容添加到 git 版本文件夹:
tar -xzkf svn.tgz
- 获取 git 版本文件夹的 svn 状态。它将显示
带有“?”的已删除文件或文件夹 前缀和缺少带有“!”的文件或文件夹 字首。将列表保存到外部文件并使用查找和替换将它们分别更改为“svn add”和“svn delete”。记得跳过不应该添加到 svn 的文件和文件夹:
cd GIT_Project && svn status
svn add fileORfolder_1 && svn add fileORfolder_2 ... && svn add fileORfolder_n
svn delete fileORfolder_1 && svn delete fileORfolder_2 ... && svn delete fileORfolder_n
svn commit -m "Realign svn and git"