36.1 SubGit
SubGit 可用于一次性将 SVN 仓库导入到 Git 中。
$ subgit import --non-interactive --svn-url http://svn.my.co/repos/myproject myproject.git
36.2 使用 Atlassian 转换工具从 SVN 迁移到 Git
此工具需要 Java,因此请确保在计划执行转换的机器上安装了 Java 运行时环境(JRE)。 使用命令 java -jar svn-migration-scripts.jar verify 检查你的机器是否缺少完成转换所需的程序。具体来说,此命令会检查 Git、Subversion 和 git-svn 工具是否已安装。同时,它还会验证你是否在大小写敏感的文件系统上执行迁移。将迁移操作在大小写敏感的文件系统上进行,以避免损坏仓库。 接下来,你需要生成一个作者文件。Subversion 仅通过提交者的用户名来跟踪变更,而 Git 则使用两个信息来区分用户:真实姓名和电子邮件地址。以下命令将生成一个文本文件,将 Subversion 用户名映射到其 Git 对应项:
java -jar svn-migration-scripts.jar authors <svn-repo> authors.txt
其中 <svn-repo> 是你希望转换的 Subversion 仓库的 URL。运行此命令后,贡献者的身份信息将被映射到 authors.txt 文件中。电子邮件地址将以 <username>@mycompany.com 的形式出现。在作者文件中,你需要手动将每个人的默认姓名(默认情况下已变为他们的用户名)更改为他们的实际姓名。在继续之前,请确保检查所有电子邮件地址的正确性。 以下命令将克隆一个 SVN 仓库为 Git 仓库:
git svn clone --stdlayout --authors-file=authors.txt <svn-repo> <git-repo-name>
其中 <svn-repo> 是上述使用的相同仓库 URL,而 <git-repo-name> 是当前目录中用于克隆仓库的文件夹名称。在使用此命令之前,有几点需要考虑:
- 上述的
--stdlayout标志告诉 Git 你正在使用具有 trunk、branches 和 tags 文件夹的标准布局。对于非标准布局的 Subversion 仓库,你需要指定 trunk 文件夹、任何/所有分支文件夹以及 tags 文件夹的位置。这可以通过以下示例完成:
git svn clone --trunk=/trunk --branches=/branches --branches=/bugfixes --tags=/tags --authors-file=authors.txt <svn-repo> <git-repo-name>
- 根据仓库大小,此命令可能需要数小时才能完成。
- 为了减少大型仓库的转换时间,可以直接在托管 Subversion 仓库的服务器上运行转换,以消除网络开销。
git svn clone将 Subversion 分支(以及 trunk)作为远程分支导入,包括 Subversion 标签(以 tags/ 为前缀的远程分支)。要将这些转换为实际的分支和标签,请在 Linux 系统上按提供的顺序运行以下命令。运行后,git branch -a应显示正确的分支名称,git tag -l应显示仓库标签。
git for-each-ref refs/remotes/origin/tags | cut -d / -f 5- | grep -v @ | while read tagname; do git tag $tagname origin/tags/$tagname; git branch -r -d origin/tags/$tagname; done
git for-each-ref refs/remotes | cut -d / -f 4- | grep -v @ | while read branchname; do git branch "$branchname" "refs/remotes/origin/$branchname"; git branch -r -d "origin/$branchname"; done
现在,从 SVN 到 Git 的转换已经完成!只需将本地仓库推送到服务器,你就可以继续使用 Git 贡献,同时完全保留从 SVN 的版本历史。
36.3 从 Mercurial 迁移到 Git
可以使用以下方法将 Mercurial 仓库导入到 Git 中:
- 使用快速导出:
cd
git clone git://repo.or.cz/fast-export.git
git init git_repo
cd git_repo
~/fast-export/hg-fast-export.sh -r /path/to/old/mercurial_repo
git checkout HEAD
- 使用 Hg-Git:详细解答在此。
- 使用 GitHub 的导入器:按照 GitHub 上的详细说明操作。
36.4 从 Team Foundation Version Control (TFVC) 迁移到 Git
你可以通过使用名为 Git-TF 的开源工具将团队基础版本控制迁移到 Git。迁移过程会将现有的历史记录转移到 Git 中,将 TFVC 的检入转换为 Git 提交。 要使用 Git-TF 将解决方案迁移到 Git,请按照以下步骤操作:
- 下载 Git-TF 你可以从 Codeplex 下载(并安装)Git-TF:Git-TF @ Codeplex。
- 克隆你的 TFVC 解决方案 在 PowerShell(Windows)中输入以下命令:
git-tf clone http://my.tfs.server.address:port/tfs/mycollection '$/myproject/mybranch/mysolution' --deep
注意 --deep 参数,它告诉 Git-TF 复制你的检入历史记录。此时,你已在执行克隆命令的文件夹中拥有了一个本地 Git 仓库。 3. 清理 添加一个 .gitignore 文件。如果你使用的是 Visual Studio,编辑器可以为你完成此操作;否则,你可以手动从 GitHub/gitignore 下载一个完整的文件。 从解决方案中移除 TFVC 源代码控制绑定(删除所有 *.vssscc 文件)。你也可以通过删除解决方案文件中的 GlobalSection(TeamFoundationVersionControl)......EndGlobalSection 来修改解决方案文件。 4. 提交并推送 通过提交并推送你的本地仓库到远程仓库来完成转换。
git add .
git commit -a -m "Converted solution source control from TFVC to Git"
git remote add origin https://my.remote/project/repo.git
git push origin master
36.5 使用 svn2git 从 SVN 迁移到 Git
svn2git 是一个 Ruby 封装工具,围绕 Git 的原生 SVN 支持(通过 git-svn),帮助你将项目从 Subversion 迁移到 Git,保留历史记录(包括 trunk、标签和分支历史)。
示例
要迁移到具有标准布局的 SVN 仓库(即在仓库根级别具有 branches、tags 和 trunk):
$ svn2git http://svn.example.com/path/to/repo
要迁移到非标准布局的 SVN 仓库:
$ svn2git http://svn.example.com/path/to/repo --trunk trunk-dir --tags tags-dir --branches branches-dir
如果你不想迁移(或没有)分支、标签或 trunk,可以使用 --notrunk、--nobranches 和 --notags 选项。 例如:
$ svn2git http://svn.example.com/path/to/repo --trunk trunk-dir --notags --nobranches
将仅迁移 trunk 历史记录。
为了减少新仓库所需的空间,你可能希望排除在添加时本不应添加的任何目录或文件(例如构建目录或存档):
$ svn2git http://svn.example.com/path/to/repo --exclude build --exclude '.*\.zip$'
迁移后优化
如果你的新创建的 Git 仓库已经有数千次提交(或更多),在将仓库推送到远程之前,你可能希望减少所占用的空间。这可以通过以下命令完成:
$ git gc --aggressive
注意:上述命令在大型仓库(数万次提交和/或数百兆字节的历史记录)上可能需要数小时。