美文网首页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] 制作镜像仓库(含提交历史)

    背景 有时候我们需要在开源代码的基础上做一些修改,但这些特定的修改又不需要合并到开源代码中。这时候将代码克隆到本地...

  • Git基本命令

    内容简介 获取Git仓库(init/clone) 记录每次更新到仓库(commit) 查看提交历史(log) 撤销...

  • Git仓库迁移

    迁移Git仓库 使用场景:需要迁移某个git仓库到另一个不同的仓库 需要保留所有分支和历史提交 操作步骤 clon...

  • git使用

    概念 Git 仓库有三个主要组成——工作目录,缓存区和提交历史。 1、git的工作区: 在当前仓库中,新增,更改,...

  • git reset 与git revert基础

    基本概念 git仓库可分为3个部分组成:工作目录、 缓存区、 提交历史 git reset 在提交层面上,rese...

  • Git常用命令笔记

    git命令使用 1 创建远程仓库(初始化--提交到本地仓库--提交到远程仓库) $ git init ...

  • git学习记录

    git init创建git仓库 git add添加文件到仓库 git commit -m "xxx"提交文件到仓库...

  • git 查看信息

    浏览本地仓库的所有写操作 1 .git reflog 查看所有commit消息 1 .git log 搜索提交历史...

  • 日常用的git提交代码的方法

    日常用的git提交代码的方法 一、初始化本地仓库,提交代码,提交到远程git仓库 1、初始化代码仓库 git in...

  • git学习指令记录

    git add 把文件添加到仓库 git commit -m "提交的日志" 将文件提交到仓库 git sta...

网友评论

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

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