Git

9.4 迁移到 Git - Bazaar

Bazaar 是一个和 Git 非常类似的分布式版本控制系统(DVCS),因此将 Bazzar 仓库转换成 Git 仓库是非常简单易懂的。想要完成转换,你需要安装 bzr-fastimport 插件。

安装 bzr-fastimport 插件

安装 fastimport 插件的步骤在类 UNIX 操作系统和 Windows 上是不一样的。在类 UNIX 系统上,最简单的办法就是安装 bzr-fastimport 包,这种方法将会自动安装所有需要的依赖。

例如,使用 Debian 及其派生系统,你只需要进行以下操作:

$ sudo apt-get install bzr-fastimport

红帽企业版系统(RHEL),使用以下命令:

$ sudo yum install bzr-fastimport

Fedora 从 22 版本开始,采用了新的包管理器 dnf,使用以下命令:

$ sudo dnf install bzr-fastimport

如果直接安装包的方法不行,你可能需要使用安装插件的方法:

$ mkdir --parents ~/.bazaar/plugins     # 为插件创建必要的文件夹
$ cd ~/.bazaar/plugins
$ bzr branch lp:bzr-fastimport fastimport   # 引入 fastimport 插件
$ cd fastimport
$ sudo python setup.py install --record=files.txt   # 安装插件

为了确保插件工作,你同时也需要安装有 fastimport 这一 Python 模块。使用下面的命令可以检查这一模块安装与否,如果没有则安装这一模块:

$ python -c "import fastimport"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named fastimport
$ pip install fastimport

如果上面的命令安装失败,你可以直接到这个地址下载 https://pypi.python.org/pypi/fastimport/

在 Windows 上,bzr-fastimport 插件在 Git 使用脱机安装并保持默认安装选项不变(可选框全部选中)的情况下是自动安装的。在这种情况下,你什么都不用做。

接下来,导入 Bazaar 仓库的方法根据你的仓库是有一个分支还是有多个分支而不同。

单分支项目

cd 到包含你的 Bazaar 仓库的路径,然后初始化 Git 仓库:

$ cd /path/to/the/bzr/repository
$ git init

现在你可以使用以下命令轻松地导出你的 Bazaar 仓库并把它转化成 Git 仓库:

$ bzr fast-export --plain . | git fast-import

根据项目的大小,Git 仓库会在几秒钟到几分钟之间构建。

多分支项目

你同样也能够导入包含多个分支的 Bazaar 仓库。让我们假设你有两个分支,一个代表主分支(myProject.trunk),另一个是工作分支(myProject.work)。

$ ls
myProject.trunk myProject.work

创建一个 Git 仓库并 cd 进去:

$ git init git-repo
$ cd git-repo

master 分支拉入 Git:

$ bzr fast-export --export-marks=../marks.bzr ../myProject.trunk | \
git fast-import --export-marks=../marks.git

将工作分支拉入 Git

$ bzr fast-export --marks=../marks.bzr --git-branch=work ../myProject.work | \
git fast-import --import-marks=../marks.git --export-marks=../marks.git

现在 git branch 会同时显示 master 分支和 work 分支。检查日志以确保它们是完整的,并删除 marks.bzrmarks.git 文件。

同步暂存区

无论你有多少分支以及使用的导入方法如何,你的暂存区都不会与 HEAD 同步,并且在导入多个分支时,你的工作目录也不会同步。这种情况使用下面的命令可以轻松解决:

$ git reset --hard HEAD

忽略被 .bzrignore 文件指明忽略的文件

现在让我们看看要忽略的文件。第一件事情就是将 .bzrignore 重命名为 .gitignore。如果 .bzrignore 文件里面有一行或数行以“!!”或“RE:”开头的内容,你必须修改它,并且可能还要创建几个 .gitignore 文件,以便忽略与 Bazaar 忽略的文件完全相同的文件。

最后,你必须创建一个提交,其中包含此次迁移的修改。

$ git mv .bzrignore .gitignore
$ # modify .gitignore if needed
$ git commit -am 'Migration from Bazaar to Git'

推送你的仓库到服务器

终于到这一步了! 现在你可以推送仓库到它的“云端新家”了:

$ git remote add origin git@my-git-server:mygitrepository.git
$ git push origin --all
$ git push origin --tags

你的 Git 仓库准备就绪。

下一节:下一个将要看到导入的系统是 Perforce。 就像我们之前讨论过的,有两种方式让 Git 与 Perforce 互相通信:git-p4 与 Perforce Git Fusion。