美文网首页Other
[git] 制作镜像仓库(含提交历史)

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

作者: 何幻 | 来源:发表于2021-08-04 11:16 被阅读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 仓库配置额外的权限

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

    (截图略)

    相关文章

      网友评论

        本文标题:[git] 制作镜像仓库(含提交历史)

        本文链接:https://www.haomeiwen.com/subject/xuxuvltx.html