作为客户端的 Git

在开发中接触到的项目,可能已经使用了其他 VCS ,并且暂时没有迁移到 Git 的打算。可以在本地使用 Git 客户端用作平时版本控制,Git 原生支持对其他 VCS 系统自然对接,例如 Subversion 。

在 Git 中所有 Subversion 桥接命令的基础命令是 git svn。需要特别注意的是当你使用 git svn 时,就是在与 Subversion 打交道,一个与 Git 完全不同的系统。 尽管 可以 在本地新建分支与合并分支,但是你最好还是通过变基你的工作来保证你的历史尽可能是直线,并且避免做类似同时与 Git 远程服务器交互的事情。

迁移到 Git

如果你现在有一个正在使用其他 VCS 的代码库,但是你已经决定开始使用 Git,必须通过某种方式将你的项目迁移至 Git。

如果之前使用 Subversion ,则可以直接涌过 git svn clone 迁移仓库。

如果之前使用 Mercurial ,则需要使用一个叫作“hg-fast-export”的工具,需要从这里拷贝一份:

1
$ git clone https://github.com/frej/fast-export.git

转换的第一步就是要先得到想要转换的 Mercurial 仓库的完整克隆:

1
$ hg clone <remote repo URL> /tmp/hg-repo

下一步就是创建一个作者映射文件。 Mercurial 对放入到变更集作者字段的内容比 Git 更宽容一些,所以这是一个清理的好机会。 只需要用到 bash 终端下的一行命令:

1
2
$ cd /tmp/hg-repo
$ hg log | grep user: | sort | uniq | sed 's/user: *//' > ../authors

下一步是创建一个新的 Git 仓库,然后运行导出脚本:

1
2
3
$ git init /tmp/converted
$ cd /tmp/converted
$ /tmp/fast-export/hg-fast-export.sh -r /tmp/hg-repo -A /tmp/authors

-r 选项告诉 hg-fast-export 去哪里寻找我们想要转换的 Mercurial 仓库,-A 标记告诉它在哪找到作者映射文件(分支和标签的映射文件分别通过 -B-T 选项来指定)。 这个脚本会分析 Mercurial 变更集然后将它们转换成 Git“fast-import”功能需要的脚本。

所有 Mercurial 标签都已被转换成 Git 标签,Mercurial 分支与书签都被转换成 Git 分支。 现在已经准备好将仓库推送到新的服务器那边:

1
2
$ git remote add origin git@my-git-server:myrepository.git
$ git push origin --all

总结

本章参考价值较小,具体细节和实践示例可以看原文:Git 与其他系统 - 迁移到 Git