背景
有时候我们需要在开源代码的基础上做一些修改,
但这些特定的修改又不需要合并到开源代码中。
这时候将代码克隆到本地就是一个比较常见的做法了。
一个办法是,在本地建一个仓库,将代码克隆下来,然后提交到本地仓库,
这样并不能保留开源代码的历史提交记录。
另一个办法是,采用镜像克隆的方式来做,本文就记录一下做法。
镜像克隆
我们拿 cnpmjs.org 举例
(1)在 github 上建立私有库
仓库地址为:https://github.com/thzt/cnpmjs.org
(2)从原地址克隆一份裸版本库
$ git clone --bare https://github.com/cnpm/cnpmjs.org.git
值得注意的有两点:
其一,这里加上了 --bare
参数
其二,跟普通克隆(./cnpmjs.org
)不同的是,裸克隆会默认克隆到 ./cnpmjs.org.git
文件夹中。
(3)以镜像推送的方式上传代码
$ git push --mirror --force https://github.com/thzt/cnpmjs.org.git
记得 push 的远程地址为 https://github.com/thzt/cnpmjs.org.git
日志如下,这个操作会把所有 branch 和 tag 也都推送过去。
Enumerating objects: 10410, done.
Counting objects: 100% (10410/10410), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3687/3687), done.
Writing objects: 100% (10410/10410), 2.81 MiB | 333.00 KiB/s, done.
Total 10410 (delta 6308), reused 10410 (delta 6308)
remote: Resolving deltas: 100% (6308/6308), done.
To https://github.com/thzt/cnpmjs.org.git
* [new branch] 1.x -> 1.x
...
* [new branch] sync-check-after-10mins -> sync-check-after-10mins
* [new tag] 0.1.0 -> 0.1.0
...
* [new tag] 3.0.0-rc.45 -> 3.0.0-rc.45
(4)结果如下
克隆到 gerrit
以上方式除了可以将代码镜像克隆到 gihub 之外,也可以克隆到 gerrit。
不过,gerrit 中还需要增加一些额外的配置。
(1)在 gerrit 中新建仓库
右上角点击 “CREATE NEW” 新建仓库(只有管理员才能看到这个按钮)
填写仓库名 cnpmjs.org,其他字段保持默认值不变
(2)给 gerrit 仓库配置额外的权限
- Forge Author Identity
- Push(Allow pushing with or without force)
(3)裸克隆后,以镜像方式上传代码到 gerrit
$ git clone --bare https://github.com/cnpm/cnpmjs.org.git
$ git push --mirror --force $GerritRepoPrefix/cnpmjs.org
其中 $GerritRepoPrefix
是 gerrit 地址前缀,每个公司的 gerrit 私有部署地址是不同的。
日志如下,
Enumerating objects: 31, done.
Counting objects: 100% (31/31), done.
Delta compression using up to 8 threads
Compressing objects: 100% (9/9), done.
Writing objects: 100% (18/18), 3.15 KiB | 3.15 MiB/s, done.
Total 18 (delta 12), reused 12 (delta 8)
remote: Resolving deltas: 100% (12/12)
remote: error: branch refs/meta/config:
remote: Cannot delete project configuration from 'refs/meta/config'
remote: User: ...
remote: Contact an administrator to fix the permissions
remote: Processing changes: refs: 2, done
remote: commit 819a499: warning: subject >50 characters; use shorter first paragraph
To .../cnpmjs.org
+ 759d9dc...99b81f5 master -> master (forced update)
! [remote rejected] refs/meta/config (cannot delete project configuration)
error: failed to push some refs to '.../cnpmjs.org'
发现 master 推送成功了,但是 refs/meta/config
没有推送成功。
这是没问题的,是因为 refs/meta/config
是 gerrit 特有的 ref,是不能删除的。
(因为是将原仓库直接覆盖过去,gerrit 仓库中已有的所有 refs/*
都要删掉再重建)
所以这里应该是 “期望中的正确行为”(It's expected result),还可以参考这里。
(4)上传成功
(截图略)
网友评论