导入已有仓库

记录如何将现有的git reposotory导入到gitlab中.

前言

在使用 gitlab 之前, 我使用 gitolite 来保存自己私有的代码. 后来发现 gitlab 的功能远比 gitolite 要强大, 使用上也方便很多. 因此考虑放弃 gitolite, 而原有在 gitolite 中的代码就需要迁移过去, 同时希望能保留原有的 commit/tag/branch 等信息.

批量导入

发现 gitlab 对此有特别的支持, 而且支持多个仓库一起导入, 非常方便处理大批仓库的迁移.

参考官方文档: Import bare repositories into your GitLab instance

假设我们有三个项目,a.git/b.git/c.git在gitolite中,我们准备将他们导入gitlab,放在名为backup的group中。则导入操作步骤如下:

  1. 打包原有的bare reposotory

    注意一定要是bare reposotory

    可以直接到git仓库的原始存储路径下打包,如:

     cd /home/git/repositories/
     tar cvf code.tar a.git b.git c.git
    

    也可以通过带--bare参数的git clone命令来获取:

     git clone --bare ××/a.git
    
  2. 在gitlab中为将要导入的项目做准备

    在gitlab的管理界面上添加一个名为backup的group.

  3. 将打包后的文件传到目标机器上

  4. 准备导入的目录结构

     # import目录下存放所有要导入的仓库,放在哪里无所谓
     mkdir /home/sky/import/
     # 建立子目录,对应要导入的group名
     mkdir /home/sky/import/backup
    
     # 将要导入的git仓库复制到子目录下
     cp -R a.git b.git c.git /home/sky/import/backup
    
     # 将整个import目录的owner和group都修改为git
     sudo chown -R git:git /home/sky/import/
    
  5. 执行导入命令

     # 注意这里的路径只到import路径,不要写子路径,子路径是用来制定group的
     sudo gitlab-rake gitlab:import:repos['/home/sky/import/']
    

    命令执行输出类似如下:

     Processing /home/sky/import/backup/a.git
     * Using namespace: backup
     * Created a (backup/a-service)
    

成功之后就可以在gitlab的页面上看到新导入的git项目.

单个导入

先clone要迁移的仓库, clone的时候用--mirror参数来clone它的bare repository, 然后添加remote:

git clone --mirror [email protected]:root/ut-cidemo.git
cd ut-cidemo.git
git remote add gitlab [email protected]:lagency/ut-cidemo.git
git push -f --tags gitlab refs/heads/*:refs/heads/*

这个方式适合导入单个仓库。

导入非bare仓库

当git clone仓库没有使用--mirror参数,也可以通过类似的方式导入。

cd existing_repo
# 将原来的origin重命名
git remote rename origin old-origin
# 添加新的remote到我们要提交的仓库,请在导入前先建立好对应的group和空project
# 可以用http提交,但是要输入密码
# git remote add origin http://server.skyao.io:8800/backup/a.git
# 用ssh提交就可以不用输入密码,比较方便
git remote add origin [email protected]:backup/a.git

# push资料上去
git push -u origin --all
git push -u origin --tags