Other

[git] 制作镜像仓库(含提交历史)

2021-08-04  本文已影响0人  何幻

背景

有时候我们需要在开源代码的基础上做一些修改,
但这些特定的修改又不需要合并到开源代码中。
这时候将代码克隆到本地就是一个比较常见的做法了。

一个办法是,在本地建一个仓库,将代码克隆下来,然后提交到本地仓库,
这样并不能保留开源代码的历史提交记录。
另一个办法是,采用镜像克隆的方式来做,本文就记录一下做法。

镜像克隆

我们拿 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 仓库配置额外的权限

(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)上传成功

(截图略)

上一篇下一篇

猜你喜欢

热点阅读