linux 双机热备 配置笔记

本文将以 linux nginx 高可用为目标,研究并记录双机热备的配置方法:

【主要步骤借鉴这篇文章】 链接
一、设置主机名方法:
1. 设置临时主机名,重启后会失效
# hostname new_name

2.查看hostname的设置,包含静态主机名,临时主机名
# hostnamectl

3.替换 /etc/hostname
hostnamectl set-hostname new_name

4.为了使用DNS解析能识别到新主机名,需要修改 /etc/hosts
把 localhost.localdomain 替换为 new_name

5.修改这个文件里的hostname:
/etc/sysconfig/network

6.要保持hosts文件的主机名和uname -n 显示的要一致
如果不一致,要修改:/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=hamaster

主: hamaster
从: haslave

网络环境:
vmware新加一张 VMnet 2 host-only 网卡,用来做心跳网卡
主机  物理网卡ip  192.168.76.160   心跳网卡ip  192.168.73.128
备机  物理网卡ip  192.168.76.128   心跳网卡ip  192.168.73.129
vip是 192.168.76.100

二、设置IP
1. 复制的虚拟机要在关机状态下,另外生成一个MAC地址
2. 可以用 ip a 代替 ifconfig 查看系统IP信息,ip a 显示的信息更为简洁
3. 新建网卡子接口,添加对外提供服务的IP:
新建文件 /etc/sysconfig/network-scripts/ifcfg-ens33:0,文件内容为:
DEVICE=ens33:0
IPADDR=192.168.76.100
PREFIX=24
ONPARENT=yes

重启网络服务后,ip a 可以看到类似如下内容,即为子接口添加成功

2: ens33: mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:50:56:3d:5e:d3 brd ff:ff:ff:ff:ff:ff
inet 192.168.76.128/24 brd 192.168.76.255 scope global noprefixroute dynamic ens33
valid_lft 1658sec preferred_lft 1658sec
inet 192.168.76.100/24 brd 192.168.76.255 scope global secondary noprefixroute ens33:0
valid_lft forever preferred_lft forever

三、master 和 slave 之间交换公钥添加免密互相
1. 生成密钥对:ssh-keygen -t rsa -P ”
2. 上传公钥: ssh-copy-id -i .ssh/*pub root@haslave

四、主从时间同步:
ssh haslave ‘date’;date

五、安装依赖:
yum install perl-TimeDate net-snmp-libs libnet PyXML
yum -y install pcre pcre-devel zlib zlib-devel

下载 Nginx 源码:
wget http://nginx.org/download/nginx-1.18.0.tar.gz

创建nginx用户:
useradd -s /sbin/nologin -M nginx (参数M表示不创建 home 目录)

编译安装nginx:
[root@hamaster nginx-1.18.0]# ./configure –prefix=/usr/local/nginx –user=nginx –group=nginx
[root@hamaster nginx-1.18.0]# make && make install

将 /usr/local/nginx/sbin 添加到 PATH 环境变量中,使得 nginx 命令可被搜索到
执行 nginx 后,应能在浏览器中正常访问到 nginx 欢迎页面

下载 heatbeat 源码:
访问:http://www.linux-ha.org/wiki/Downloads
wget http://hg.linux-ha.org/glue/archive/0a7add1d9996.tar.bz2
wget http://hg.linux-ha.org/heartbeat-STABLE_3_0/archive/958e11be8686.tar.bz2

mv 0a7add1d9996.tar.bz2 ClusterGlue-1.0.12.tar.bz2
mv *8686.tar.bz2 Heartbeat-3.0.6.tar.bz2

tar -jxvf ClusterGlue-1.0.12.tar.bz2 (其中j表示解压bz2包)
tar -jxvf Heartbeat-3.0.6.tar.bz2
到这里发现参考文章中下载的 heartbeat.tar.gz 里面的文件是 rpm 文件,作者直接针对这些rpm文件: yum -y install *
但我没有找到这些 rpm 文件的下载地址,直接源码编译可能会遇到比较多的依赖性问题,作为其它方式,我参考了 heartbeat 官网用户手册说的:http://www.linux-ha.org/doc/users-guide/_fedora_rhel_and_centos.html
[yum 安装 heartbeat 参考文档]
执行命令:yum install heartbeat cluster-glue
官网还提到安装这个组件: yum install resource-agents pacemaker (暂时先不安装)

这里遇到 yum 提示找不到 package 的问题:解决方法
cd /etc/yum.repos.d
wget http://mirrors.aliyun.com/repo/Centos-7.repo
mv CentOS-Base.repo CentOS-Base.repo.bak (备份旧仓库)
mv Centos-7.repo CentOS-Base.repo (起用新仓库)
执行yum源更新命令:
yum clean all
yum makecache
yum update

[yum安装epel源]
yum install epel-release (EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS和Scientific Linux. 比如,我们在安装heartbeat,keepalive包的时候,就需要这个源)
yum install heartbeat 就可以安装成功。

【安装heatbeat的进度卡在 yum install heartbeat 提示找到包】
使用 搜索发现:
https://stackoverflow.com/questions/59323091/heartbeat-package-not-found-centos 这个帖子有人说:Heartbeat is considered deprecate since RHEL7 / CentOS7,即CentOS7 不再有 Heartbeat 的安装源。

无奈,只能考虑用编译源代码的方式进行安装:
关于源码编译,知乎这篇文章看着不错:https://zhuanlan.zhihu.com/p/149269593
根据官方文档:http://www.linux-ha.org/doc/users-guide/_building_and_installing_heartbeat_from_source.html
安装组件是有依赖关系的,需要按如下顺序的:
cluster-glue
heartbeat

网上的教程大都说的是要安装这3个包,但其实第2个包的安装并没有在heartbeat的安装手册中有提及:
Cluster Glue ##可重复使用的群集组件##
Resource Agents ##集群实验资源代理##
Heartbeat ##心跳检测主程序包##

==============================================================
可以编译安装成功的操作步骤:
【这一行如果没有执行,make 会提示 not rule to all】
yum install -y bzip2 autoconf automake libtool glib2-devel libxml2-devel bzip2-devel libtool-ltdl-devel asciidoc libuuid-devel

1.安装Cluster Glue
# tar -jxvf 0a7add1d9996.tar.bz2
# cd Reusable-Cluster-Components-glue–0a7add1d9996/
# groupadd haclient
# useradd -g haclient hacluster
# ./autogen.sh
# ./configure –prefix=/usr/local/heartbeat/
# make && make install

2.安装Resource Agents
# tar xf v3.9.6.tar.gz
# cd resource-agents-3.9.6/
# ./autogen.sh
# export CFLAGS=”$CFLAGS -I/usr/local/heartbeat/include -L/usr/local/heartbeat/lib”
# ./configure –prefix=/usr/local/heartbeat/
ln -s /usr/local/heartbeat/lib/* /lib/ 将生成的动态库 添加快捷方式到/lib下
ln -s /usr/local/heartbeat/lib/* /lib64/ 在make过程中需要在lib下找到Cluster Glue的so文件
# make && make install

3. 安装heartbeat
# tar xf 958e11be8686.tar.bz2
# cd Heartbeat-3-0-958e11be8686
# ./bootstrap
# export CFLAGS=”$CFLAGS -I/usr/local/heartbeat/include -L/usr/local/heartbeat/lib”
# ./configure –prefix=/usr/local/heartbeat/
# vi /usr/local/heartbeat/include/heartbeat/glue_config.h
/*define HA_HBCONF_DIR “/usr/local/heartbeat/etc/ha.d/”*/ #把这一行用/**/注释掉 未注释的错误信息/usr/local/heartbeat/include/heartbeat/glue_config.h:105:0: error: “HA_HBCONF_DIR” redefined [-Werror]
# make && make install

# 建立软链接:
# ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec/* /usr/local/heartbeat/lib/heartbeat/plugins/RAExec/
# ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/* /usr/local/heartbeat/lib/heartbeat/plugins/

# 配置 heartbeat:
cp -R /usr/local/heartbeat/etc/ha.d /usr/local/heartbeat/etc/ha.d-bak-yyyymmdd
[root@haslave ha.d]# cp /root/download/Heartbeat-3-0-958e11be8686/doc/authkeys /usr/local/heartbeat/etc/ha.d/
[root@haslave ha.d]# cp /root/download/Heartbeat-3-0-958e11be8686/doc/ha.cf /usr/local/heartbeat/etc/ha.d/
[root@haslave ha.d]# cp /root/download/Heartbeat-3-0-958e11be8686/doc/haresources /usr/local/heartbeat/etc/ha.d/

chmod 600 authkeys

修改 authkeys:

uth 3
#1 crc
#2 sha1 HI!
3 md5 Hello!

修改 ha.cf:

debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport 694
ucast eth0 172.16.10.111 #此处需要修改 设置另一台机器的ip 网卡 0 或者 1 的ip
auto_failback on
node ha1 #此处默认为master机器的hostname 需要自己手动修改
node ha2 #此处默认为slave机器的hostname
ping 172.16.10.1 # 此处设置自己的网关
ping 172.16.10.1
respawn hacluster /usr/local/heartbeat/libexec/heartbeat/ipfail #此处我就写了一行 看别的资料有写两行、三行的 ,我在日志看到有报错就写了一行。
apiauth ipfail gid=haclient uid=hacluster
#ucast 后面的ip 分别为对方的ip

修改 haresources文件:
/usr/local/heartbeat/etc/ha.d/resource.d 存放要纳管到高可靠捉住范围的服务的启动脚本,比如: tomcat 服务, haresources 会读取这个目录下的服务进行高可靠维护
haresources文件内容:
ha1 IPaddr::172.16.10.99/24/eth0:0
#对应格式 :
master主机名 IPaddr ::vip/掩码/网卡0或者1:0 此处vip指对外提供服务的IP:192.168.76.100

假设 resource.d下有两个启动shell: tomcat redis,则haresources在主备机上的配置内容分别为:
主:hamaster IPaddr::192.168.76.100/24/ens33 tomcat redis
备: hamaster IPaddr::192.168.76.100/24/ens33 tomcat redis

# 较好:文章链接1
# 文章链接2
# 较好:文章链接3

2021-05-16 更新:
1. service heartbeat start失败,/var/log/ha-debug 报错:
May 16 16:47:16 haslave heartbeat: [90933]: ERROR: Illegal directive [ucast] in /usr/local/heartbeat/etc/ha.d/ha.cf
May 16 16:47:16 haslave heartbeat: [90933]: ERROR: Illegal directive [ping] in /usr/local/heartbeat/etc/ha.d/ha.cf
May 16 16:47:16 haslave heartbeat: [90933]: ERROR: Illegal directive [ping] in /usr/local/heartbeat/etc/ha.d/ha.cf
May 16 16:47:16 haslave heartbeat: [90933]: ERROR: Heartbeat not started: configuration error.
May 16 16:47:16 haslave heartbeat: [90933]: ERROR: Configuration error, heartbeat not started.

网上说的解决办法:
ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec/* /usr/local/heartbeat/lib/heartbeat/plugins/RAExec/
ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/* /usr/local/heartbeat/lib/heartbeat/plugins/
即:在目录 /usr/local/heartbeat/lib/heartbeat/plugins/ 下新建软链接分别指向这个目录下的所有文件 /usr/local/heartbeat/lib64/heartbeat/plugins/

然而在我的环境中,存在: /usr/local/heartbeat/lib/heartbeat/plugins/RAExec, 不存在 /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec
所以我的做法是在 /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec 下新建软链接,分别指向 /usr/local/heartbeat/lib/heartbeat/plugins/RAExec 下面的所有文件
操作命令为:
mkdir /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec
ln -svf /usr/local/heartbeat/lib/heartbeat/plugins/RAExec/* /usr/local/heartbeat/lib64/heartbeat/plugins/RAExec
ln -svf /usr/local/heartbeat/lib64/heartbeat/plugins/* /usr/local/heartbeat/lib/heartbeat/plugins
返回的信息: RAExec 无法创建软链接,属于预期中的结果,正常
‘/usr/local/heartbeat/lib/heartbeat/plugins/HBauth’ -> ‘/usr/local/heartbeat/lib64/heartbeat/plugins/HBauth’
‘/usr/local/heartbeat/lib/heartbeat/plugins/HBcomm’ -> ‘/usr/local/heartbeat/lib64/heartbeat/plugins/HBcomm’
‘/usr/local/heartbeat/lib/heartbeat/plugins/quorum’ -> ‘/usr/local/heartbeat/lib64/heartbeat/plugins/quorum’
ln: ‘/usr/local/heartbeat/lib/heartbeat/plugins/RAExec’: cannot overwrite directory
‘/usr/local/heartbeat/lib/heartbeat/plugins/tiebreaker’ -> ‘/usr/local/heartbeat/lib64/heartbeat/plugins/tiebreaker’

这时再次执行 service heartbeat start, 这时 /var/log/ha-debug.log 打印的日志看上去就是正常启动的日志:
May 16 18:06:00 haslave heartbeat: [96208]: info: Pacemaker support: false
May 16 18:06:00 haslave heartbeat: [96208]: WARN: Logging daemon is disabled –enabling logging daemon is recommended
May 16 18:06:00 haslave heartbeat: [96208]: info: **************************
May 16 18:06:00 haslave heartbeat: [96208]: info: Configuration validated. Starting heartbeat 3.0.6
May 16 18:06:00 haslave heartbeat: [96208]: info: heartbeat: version 3.0.6
May 16 18:06:00 haslave heartbeat: [96208]: WARN: No Previous generation – starting at 1621159561
May 16 18:06:00 haslave heartbeat: [96208]: info: Heartbeat generation: 1621159561
May 16 18:06:00 haslave heartbeat: [96208]: info: No uuid found for current node – generating a new uuid.
May 16 18:06:00 haslave heartbeat: [96208]: info: Creating FIFO /usr/local/heartbeat/var/lib/heartbeat/fifo.
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ucast: write socket priority set to IPTOS_LOWDELAY on ens33
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ucast: bound send socket to device: ens33
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ucast: set SO_REUSEPORT(w)
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ucast: set SO_REUSEADDR
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ucast: bound receive socket to device: ens33
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ucast: set SO_REUSEPORT
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ucast: started on port 694 interface ens33 to 192.168.73.128
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ping heartbeat started.
May 16 18:06:00 haslave heartbeat: [96208]: info: glib: ping heartbeat started.
May 16 18:06:00 haslave heartbeat: [96208]: info: Local status now set to: ‘up’
May 16 18:06:00 haslave heartbeat: [96208]: info: Link 192.168.73.1:192.168.73.1 up.
May 16 18:06:00 haslave heartbeat: [96208]: info: Status update for node 192.168.73.1: status ping

==============================================================

【参考来源】
介绍得比较好的配置案例:
链接

【2008年写的基于heartbeat-2.1.3.tar.gz源码编译的环境搭建过程】
包含用户及组的创建,drbd的配合
http://blog.itpub.net/100091/viewspace-1007515/

【Linux 下安装及配置heartbeat】
即 heartbeat 配置文件详解

不同文章对比:

文章一: 基于 drdb 和 heartbeat
使用 drbd 对 2台linux特定分区做数据同步,结合 heartbeat 实现资源的统一调度

文章二: 使用HeartBeat实现高可用HA的配置过程详解
使用 heartbeat 来做 HA 集群,并且把 nginx 服务作为 HA 对应的服务。

笔记: 统一更新wordpress的评论为垃圾评论

select comment_author, count(1) as cnt from dbx_comments where comment_approved=’0′ group by comment_author order by cnt;

select * from (select comment_author, count(1) as cnt from dbx_comments where comment_approved=’0′ group by comment_author) t where t.cnt>=5;

同一个人未处理的评价超过5次的,把他的未处理评论更新为 trash:
update dbx_comments set comment_approved=’trash’ where comment_approved=’0′ and comment_author in(
select comment_author from (select comment_author, count(1) as cnt from dbx_comments where comment_approved=’0′ group by comment_author) t where t.cnt>=5);

把未处理的评价中包含 http 的评论都更新为 trash:
select * from dbx_comments where comment_approved=’0′ and (comment_content like ‘%http%’ or comment_content like ‘%url%’);
update dbx_comments set comment_approved=’trash’ where comment_approved=’0′ and (comment_content like ‘%http%’ or comment_content like ‘%url%’);

同一IP多次评论的,标记为 ‘trash’:
update dbx_comments set comment_approved=’trash’ where comment_approved=’0′ and comment_author_IP in(
select comment_author_IP from (select comment_author_IP, count(1) as cnt from dbx_comments where comment_approved=’0′ group by comment_author_IP) t where t.cnt>=2);

评论长度超过 200个字符的,标记为 ‘trash’:
update dbx_comments set comment_approved=’trash’ where comment_approved=’0′ and length(comment_content)>200;

评论者邮箱长度超过 30个字符的,标记为 ‘trash’:
update dbx_comments set comment_approved=’trash’ where comment_approved=’0′ and length(comment_author_email)>30;

select * from dbx_comments where comment_approved=’0′ and length(comment_content)>200;

select count(1) from dbx_comments where comment_approved=0;

枚举值:
comment_approved:
0-未处理
1-Approved
spam
trash

Gitlab权限控制

实际开发过程中,有些分支其实是不希望项目组所有开发都有 merge, push的权限。代码必须经过更高级别的管理人员审核后再merge, push。
gitlab 自带的权限管理就能实现这一功能场景。

一、最佳实践:

这里有一篇详细说明了最佳实践的文章

操作原理:

1. 关于分支设置

参考 git flow 定义项目的分支。
release,develop,master都是固定的分支,有固定的功能。
多人同时开发一个需求,可能需要拉取一个feature分支后再根据该feature分支拉取个人开发分支,开发完成后合并feature再合并develop,release,master等。

2. code review 流程

总结下code review流程:
(1)创建好 测试分支,release分支,并配置测试分支,release分支,master分支的merge权限
(2)开发分支开发完成后push到远端,通过页面提交merge request,指定reviewer和审批人,一般指定reviewer即可。
(3)reviewer 通过代码review,没有问题,可以点击merge,完成合并操作。如果有问题,可以发起讨论,或者直接关闭merge请求。

code review 流程完成。

二、保护分支的设置:

用于避免分支被没有权限的开发者 merge, push

Gitlab用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner

Guest:可以创建issue、发表评论,不能读写版本库
Reporter:可以克隆代码,不能提交,QA、PM可以赋予这个权限
Developer:可以克隆代码、开发、提交、push,RD可以赋予这个权限
Master:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限
Owner:可以设置项目访问权限 – Visibility Level、删除项目、迁移项目、管理组成员,开发组leader可以赋予这个权限

设置分支保护:

1. 列表页面找到 Repository
2. 点击分支(branch)
3. 点击project setting
4. 点击Protected Branches 的Expand标签

Gitlab中的组和项目有三种访问权限:Private、Internal、Public

Private:只有组成员才能看到
Internal:只要登录的用户就能看到
Public:所有人都能看到

参考文档1, 参考文档2

github monitor使用笔记

查看是否还有任务在执行中:
select distinct(status) from monitor_task where id>1; — Status: 0-等待中, 1-运行中, 2-完成

Excel格式化语句:
=”insert into monitor_task (`keywords`, `pages`, `interval`, `status`, `name`, `mail`,`ignore_org`,`ignore_repo`, `match_method`) values (‘”&K3&”‘,5,720,0,'”&N3&”‘,'”&L3&”;”&M3&”‘,”,”,1);”

报表生成语句:
select a.task_id, b.name, count(1) from Leakage a left join monitor_task b on a.task_id = b.id group by a.task_id;

mysql> desc monitor_task;

导出数据到 xls 文件:
echo “select * from github.Leakage where task_id>1″ | mysql -uroot -p > ./export_Leakage.xls

mysql> show variables like ‘%secure%’;
+————————–+———————–+
| Variable_name | Value |
+————————–+———————–+
| require_secure_transport | OFF |
| secure_auth | ON |
| secure_file_priv | /var/lib/mysql-files/ | (mysql限制了导入与导出的目录权限,要在这个目录中进行导入导出操作)
+————————–+———————–+

目标路径: /var/lib/mysql/export_data/export_Leakage.csv
docker exec -it container_id /bin/bash

mysql -uroot -p

select b.name as 业务线, a.keyword as 关键字, a.file_name as 包含关键字的文件名, a.html_url, a.last_modified, a.repo_name, a.repo_url, a.user_name, a.user_url, a.add_time as 扫描时间
from github.Leakage a left join github.monitor_task b on a.task_id = b.id
where a.task_id > 1 into outfile ‘/var/lib/mysql-files/export_Leakage.csv’ fields terminated by ‘,’ optionally enclosed by ‘”‘ escaped by ‘”‘ lines terminated by ‘\n’;

cp /var/lib/mysql-files/export_Leakage.csv /var/lib/mysql/export_data/
导出后中文是乱码,用UE打开可识别乱码, 再使用 excel 新建->数据自文本导入(编码格式选: unicode utf-8)

====================================================
只导出表结构:
mysqldump -uroot -p github | gzip > /var/lib/mysql-files/github.sql.gz

cp /var/lib/mysql-files/github.sql.gz /var/lib/mysql/export_data/

目标文件存放在:
./docker/data/mysql/export_data/

====================================================
导入表数据:

vi ./docker/data/mysql/export_data/ins_temp.sql
cp /var/lib/mysql/export_data/ins_temp.sql /var/lib/mysql-files/

====================================================
找出keywords有更新的项目组:
select b.name, length(b.keywords) from `github`.`monitor_task` a, `github`.`monitor_task_temp` b where a.name=b.name and a.keywordsb.keywords;

更新 keywords:
update `github`.`monitor_task` a, `github`.`monitor_task_temp` b set a.keywords = b.keywords where a.name=b.name and a.keywordsb.keywords;

更新 email:
select a.name, a.mail, b.mail from `github`.`monitor_task` a, `github`.`monitor_task_temp` b where a.name=b.name and a.mailb.mail;
(以前mail字段末尾没有多余的分号,这次更新进入分号)
update `github`.`monitor_task` a, `github`.`monitor_task_temp` b set a.mail = b.mail where a.name=b.name and a.mailb.mail;
====================================================
单独调试 processors.py
docker ps 找到 webserver container_id
docker exec -it container_id /bin/bash
根据代码注释提示: 去掉processors.py源码中的个注释”#”
命令行执行:
PYTHONPATH=. python3 github_monitor/apps/monitor/processors.py

GitLab 带commit历史迁移至 Gerrit

最终验证可行的方案:

1. git clone Gerrit空仓库

2. git remote set-url gitlab_url (旧仓库)

3. git branch -r | grep -v ‘\->’ | while read remote; do git branch –track “${remote#origin/}” “$remote”; done

跟踪远程所有分支
关于 ${}特殊用法的介绍,参考链接
上述语句中,${remote#origin/} 的作用与 ${remote#*/} 相同

4. git pull –all –allow-unrelated-histories

指定允许拉取不相关的代码过来Merge, 有多个分支时,要把多个分支都拉下来,注意用户名: git config username
注释: git pull = git fetch + git merge

5. git remote set-url Gerrit_url

(指定新 Gerrit 代码库的地址)

6. git push -u origin –all
git push -u origin –tags

把代码推送给 Gerrit 仓库

觉得这张图对关系的描述比较清晰,放着参考用:

历史参考资料:

GitLab项目迁移到Gerrit

通过Git命令从GitLab将某分支拷贝到Gerrit

这篇文章写得比较有自己的观点:

gitlab迁移到gerrit

重点是说明了如下关键信息:

推送所有分支和标签到gerrit上:
git push –all ; git push –tags

注:这里不能用git push –mirror 是因为gerrit服务端新建的库有个refs/meta/config 包含有权限信息,不能删除(gerrit禁止删除了,如果不禁止,则push –mirror时其权限信息就丢失了)。

迁移所需权限:
Reference:
refs/*
Push Annotated Tag
Push Signed Tag
Forge Committer Identity
Create Reference
Read
Push