From 1e007fa3f728aa9967acb5b9693466b0727ce473 Mon Sep 17 00:00:00 2001 From: rjb <263303411@qq.com> Date: Mon, 22 Dec 2025 17:12:39 +0800 Subject: [PATCH] first commit --- (红头)Gerrit服务器启停操作文档.txt | 405 ++++++++++++++ (红头)Git代码提交命令文档.txt | 606 ++++++++++++++++++++ (红头)gerrit问题解决.txt | 309 +++++++++++ (红头1)服务器启停说明.txt | 428 +++++++++++++++ CI流水线部署方案.md | 456 +++++++++++++++ Gerrit升级指南.md | 245 +++++++++ Gerrit安装使用指南.md | 855 +++++++++++++++++++++++++++++ Gerrit快速使用指南.md | 331 +++++++++++ HTTP认证问题解决方案.md | 113 ++++ README_执行说明.md | 81 +++ SSH公钥添加说明.md | 45 ++ SSH公钥认证问题排查.md | 100 ++++ SSH密钥配置指南.md | 96 ++++ SSH密钥配置步骤.txt | 33 ++ SSH推送完整指南.md | 110 ++++ SSH签名算法问题修复.md | 83 +++ SSH连接问题排查.md | 92 ++++ SSH配置成功-继续推送.md | 150 +++++ SSH配置详细步骤.md | 159 ++++++ Windows上传项目命令.txt | 38 ++ add_changeid.sh | 134 +++++ add_renjianbo_to_admin.sh | 90 +++ add_user_to_admin.sh | 83 +++ check_account.class | Bin 0 -> 3728 bytes check_account.java | 84 +++ check_admin.class | Bin 0 -> 2614 bytes check_admin.java | 57 ++ configure_permissions.sh | 77 +++ create_account.class | Bin 0 -> 3728 bytes create_account.java | 108 ++++ create_project.sh | 33 ++ create_systemd_service.sh | 99 ++++ fix_email.sh | 100 ++++ fix_unique_changeid.sh | 91 +++ install_drone_ci.sh | 241 ++++++++ install_gerrit.sh | 248 +++++++++ install_java17.sh | 106 ++++ install_jenkins.sh | 245 +++++++++ install_webhook_ci.sh | 484 ++++++++++++++++ quick_reinstall.sh | 16 + reinit_gerrit.sh | 192 +++++++ reinstall_gerrit.py | 88 +++ reinstall_gerrit.sh | 208 +++++++ test_cookie.html | 46 ++ upgrade_gerrit.sh | 260 +++++++++ 一键重新安装.sh | 3 + 上传本地项目到Gerrit指南.md | 272 +++++++++ 从码云推送到Gerrit指南.md | 257 +++++++++ 修复上传问题指南.md | 197 +++++++ 修复邮箱地址问题.md | 161 ++++++ 修复重复Change-Id.md | 188 +++++++ 创建项目指南.md | 97 ++++ 处理SSH主机密钥验证.md | 147 +++++ 如何进行+2评审指南.md | 193 +++++++ 安装CommitHook指南.md | 125 +++++ 安装commit-msg-hook.md | 174 ++++++ 安装前准备-Java17.md | 75 +++ 安装状态说明.md | 93 ++++ 完全重新安装Gerrit.sh | 199 +++++++ 开放端口29419-iptables.sh | 79 +++ 开放端口29419.sh | 82 +++ 开放端口29419说明.md | 189 +++++++ 彻底修复Change-Id.md | 188 +++++++ 快速修复Change-Id.sh | 69 +++ 快速修复命令.txt | 26 + 快速开放端口29419.sh | 67 +++ 快速添加团队成员.sh | 43 ++ 快速解决no_common_ancestry.txt | 28 + 快速解决推送问题.txt | 27 + 执行安装.md | 101 ++++ 执行步骤.txt | 56 ++ 推送成功-后续操作指南.md | 176 ++++++ 推送成功后续操作指南.md | 168 ++++++ 数据库检查结果.md | 90 +++ 最终修复Change-Id方案.md | 138 +++++ 最终解决方案.md | 95 ++++ 服务无法访问解决方案.md | 185 +++++++ 标准重新安装.sh | 155 ++++++ 检查并修复Change-Id.sh | 57 ++ 检查并启动服务.sh | 94 ++++ 检查并开放端口29419.md | 161 ++++++ 正确修复Change-Id.sh | 83 +++ 正确的Git克隆命令.md | 98 ++++ 浏览器Cookie问题解决方案.md | 155 ++++++ 添加Change-Id指南.md | 136 +++++ 添加团队成员账号指南.md | 179 ++++++ 添加管理员权限指南.md | 106 ++++ 登录问题排查指南.md | 100 ++++ 直接修复方案.md | 102 ++++ 确保管理员权限.sh | 37 ++ 立即修复Change-Id-完整步骤.md | 197 +++++++ 继续安装.sh | 119 ++++ 解决CREATE_NEW按钮问题.md | 114 ++++ 解决no_common_ancestry错误.md | 157 ++++++ 解决推送被拒绝问题.md | 185 +++++++ 解决推送认证问题.md | 105 ++++ 诊断和修复方案.md | 74 +++ 账户创建说明.md | 51 ++ 邮箱地址注册指南.md | 121 ++++ 配置+2权限详细步骤.md | 198 +++++++ 配置SSH密钥指南.md | 195 +++++++ 配置权限-Web界面步骤.md | 106 ++++ 重新初始化说明.md | 151 +++++ 重新安装说明.md | 149 +++++ 项目创建成功-zhini-im.md | 75 +++ 项目创建成功.md | 71 +++ 验证权限配置.md | 103 ++++ 107 files changed, 15447 insertions(+) create mode 100644 (红头)Gerrit服务器启停操作文档.txt create mode 100644 (红头)Git代码提交命令文档.txt create mode 100644 (红头)gerrit问题解决.txt create mode 100644 (红头1)服务器启停说明.txt create mode 100644 CI流水线部署方案.md create mode 100644 Gerrit升级指南.md create mode 100644 Gerrit安装使用指南.md create mode 100644 Gerrit快速使用指南.md create mode 100644 HTTP认证问题解决方案.md create mode 100644 README_执行说明.md create mode 100644 SSH公钥添加说明.md create mode 100644 SSH公钥认证问题排查.md create mode 100644 SSH密钥配置指南.md create mode 100644 SSH密钥配置步骤.txt create mode 100644 SSH推送完整指南.md create mode 100644 SSH签名算法问题修复.md create mode 100644 SSH连接问题排查.md create mode 100644 SSH配置成功-继续推送.md create mode 100644 SSH配置详细步骤.md create mode 100644 Windows上传项目命令.txt create mode 100644 add_changeid.sh create mode 100755 add_renjianbo_to_admin.sh create mode 100755 add_user_to_admin.sh create mode 100644 check_account.class create mode 100644 check_account.java create mode 100644 check_admin.class create mode 100644 check_admin.java create mode 100644 configure_permissions.sh create mode 100644 create_account.class create mode 100644 create_account.java create mode 100755 create_project.sh create mode 100755 create_systemd_service.sh create mode 100644 fix_email.sh create mode 100644 fix_unique_changeid.sh create mode 100755 install_drone_ci.sh create mode 100755 install_gerrit.sh create mode 100644 install_java17.sh create mode 100644 install_jenkins.sh create mode 100755 install_webhook_ci.sh create mode 100644 quick_reinstall.sh create mode 100644 reinit_gerrit.sh create mode 100644 reinstall_gerrit.py create mode 100755 reinstall_gerrit.sh create mode 100644 test_cookie.html create mode 100755 upgrade_gerrit.sh create mode 100644 一键重新安装.sh create mode 100644 上传本地项目到Gerrit指南.md create mode 100644 从码云推送到Gerrit指南.md create mode 100644 修复上传问题指南.md create mode 100644 修复邮箱地址问题.md create mode 100644 修复重复Change-Id.md create mode 100644 创建项目指南.md create mode 100644 处理SSH主机密钥验证.md create mode 100644 如何进行+2评审指南.md create mode 100644 安装CommitHook指南.md create mode 100644 安装commit-msg-hook.md create mode 100644 安装前准备-Java17.md create mode 100644 安装状态说明.md create mode 100644 完全重新安装Gerrit.sh create mode 100755 开放端口29419-iptables.sh create mode 100755 开放端口29419.sh create mode 100644 开放端口29419说明.md create mode 100644 彻底修复Change-Id.md create mode 100755 快速修复Change-Id.sh create mode 100644 快速修复命令.txt create mode 100755 快速开放端口29419.sh create mode 100755 快速添加团队成员.sh create mode 100644 快速解决no_common_ancestry.txt create mode 100644 快速解决推送问题.txt create mode 100644 执行安装.md create mode 100644 执行步骤.txt create mode 100644 推送成功-后续操作指南.md create mode 100644 推送成功后续操作指南.md create mode 100644 数据库检查结果.md create mode 100644 最终修复Change-Id方案.md create mode 100644 最终解决方案.md create mode 100644 服务无法访问解决方案.md create mode 100755 标准重新安装.sh create mode 100644 检查并修复Change-Id.sh create mode 100644 检查并启动服务.sh create mode 100644 检查并开放端口29419.md create mode 100644 正确修复Change-Id.sh create mode 100644 正确的Git克隆命令.md create mode 100644 浏览器Cookie问题解决方案.md create mode 100644 添加Change-Id指南.md create mode 100644 添加团队成员账号指南.md create mode 100644 添加管理员权限指南.md create mode 100644 登录问题排查指南.md create mode 100644 直接修复方案.md create mode 100755 确保管理员权限.sh create mode 100644 立即修复Change-Id-完整步骤.md create mode 100755 继续安装.sh create mode 100644 解决CREATE_NEW按钮问题.md create mode 100644 解决no_common_ancestry错误.md create mode 100644 解决推送被拒绝问题.md create mode 100644 解决推送认证问题.md create mode 100644 诊断和修复方案.md create mode 100644 账户创建说明.md create mode 100644 邮箱地址注册指南.md create mode 100644 配置+2权限详细步骤.md create mode 100644 配置SSH密钥指南.md create mode 100644 配置权限-Web界面步骤.md create mode 100644 重新初始化说明.md create mode 100644 重新安装说明.md create mode 100644 项目创建成功-zhini-im.md create mode 100644 项目创建成功.md create mode 100644 验证权限配置.md diff --git a/(红头)Gerrit服务器启停操作文档.txt b/(红头)Gerrit服务器启停操作文档.txt new file mode 100644 index 0000000..ea25a4e --- /dev/null +++ b/(红头)Gerrit服务器启停操作文档.txt @@ -0,0 +1,405 @@ +================================================================================ + Gerrit 服务器启停操作文档 +================================================================================ + +文档名称:Gerrit 服务器启停操作指南 +创建日期:2025-12-15 +适用版本:Gerrit 3.3.8 +服务器路径:/home/renjianbo/gerrit_install/review_site + +================================================================================ +一、基本操作命令 +================================================================================ + +【进入 Gerrit 目录】 + +cd /home/renjianbo/gerrit_install/review_site + +【启动服务】 + +bin/gerrit.sh start + +或者使用 Java 11(推荐): + +JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + +【停止服务】 + +bin/gerrit.sh stop + +【重启服务】 + +bin/gerrit.sh restart + +或者: + +bin/gerrit.sh stop +sleep 3 +JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + +【查看服务状态】 + +bin/gerrit.sh status + +【查看服务进程】 + +ps aux | grep gerrit + +或者: + +ps -ef | grep gerrit + +================================================================================ +二、详细操作说明 +================================================================================ + +【启动服务】 + +1. 基本启动: + cd /home/renjianbo/gerrit_install/review_site + bin/gerrit.sh start + +2. 使用 Java 11 启动(推荐,避免版本兼容问题): + cd /home/renjianbo/gerrit_install/review_site + JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + +3. 启动后等待几秒,然后检查状态: + sleep 5 + bin/gerrit.sh status + +【停止服务】 + +1. 正常停止: + cd /home/renjianbo/gerrit_install/review_site + bin/gerrit.sh stop + +2. 如果正常停止失败,强制停止: + # 查找进程 ID + ps aux | grep gerrit | grep -v grep + + # 杀死进程(替换 PID 为实际进程 ID) + kill -9 + + # 或者直接杀死所有 Gerrit 进程 + pkill -9 -f gerrit + +【重启服务】 + +1. 正常重启: + cd /home/renjianbo/gerrit_install/review_site + bin/gerrit.sh restart + +2. 完整重启(推荐,确保使用 Java 11): + cd /home/renjianbo/gerrit_install/review_site + bin/gerrit.sh stop + sleep 3 + JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + sleep 5 + bin/gerrit.sh status + +【查看服务状态】 + +1. 查看服务状态: + cd /home/renjianbo/gerrit_install/review_site + bin/gerrit.sh status + +2. 检查端口是否监听: + netstat -tlnp | grep 8080 # HTTP 端口 + netstat -tlnp | grep 29418 # SSH 端口 + + 或者使用 ss 命令: + ss -tlnp | grep 8080 + ss -tlnp | grep 29418 + +3. 检查进程: + ps aux | grep gerrit | grep -v grep + +4. 测试 HTTP 服务: + curl -s -o /dev/null -w "HTTP Status: %{http_code}\n" http://localhost:8080/ + +5. 测试 SSH 服务: + ssh -p 29418 renjianbo@localhost gerrit version + +================================================================================ +三、日志查看 +================================================================================ + +【查看实时日志】 + +1. HTTP 访问日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/httpd_log + +2. SSH 访问日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/sshd_log + +3. Gerrit 主日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/gerrit.log + +4. 错误日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/error_log + +【查看历史日志】 + +1. 查看最后 100 行 HTTP 日志: + cd /home/renjianbo/gerrit_install/review_site + tail -100 logs/httpd_log + +2. 查看最后 50 行错误日志: + cd /home/renjianbo/gerrit_install/review_site + tail -50 logs/error_log + +3. 搜索特定内容: + cd /home/renjianbo/gerrit_install/review_site + grep "error" logs/gerrit.log | tail -20 + grep "renjianbo" logs/httpd_log | tail -20 + +================================================================================ +四、常见问题处理 +================================================================================ + +【问题1】服务启动失败 + +检查项: +1. 检查 Java 版本: + java -version + # 应该显示 Java 11 或更高版本 + +2. 检查端口是否被占用: + netstat -tlnp | grep 8080 + netstat -tlnp | grep 29418 + + 如果端口被占用,可以: + - 停止占用端口的进程 + - 或修改 gerrit.config 中的端口配置 + +3. 查看错误日志: + cd /home/renjianbo/gerrit_install/review_site + tail -50 logs/error_log + +4. 检查磁盘空间: + df -h + +5. 检查内存: + free -h + +【问题2】服务无法停止 + +解决方法: +1. 查找进程: + ps aux | grep gerrit | grep -v grep + +2. 强制停止: + kill -9 + + 或者: + pkill -9 -f gerrit + +3. 验证已停止: + bin/gerrit.sh status + ps aux | grep gerrit | grep -v grep + +【问题3】服务启动后无法访问 + +检查项: +1. 检查服务是否运行: + bin/gerrit.sh status + +2. 检查端口是否监听: + netstat -tlnp | grep 8080 + +3. 检查防火墙: + sudo firewall-cmd --list-ports + # 确保 8080 和 29418 端口已开放 + +4. 检查配置文件: + cat etc/gerrit.config | grep listenUrl + cat etc/gerrit.config | grep canonicalWebUrl + +5. 测试本地访问: + curl http://localhost:8080/ + +【问题4】Java 版本问题 + +如果遇到 Java 版本错误: +1. 检查已安装的 Java 版本: + ls /usr/lib/jvm/ + +2. 使用 Java 11 启动: + JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + +3. 或者设置环境变量: + export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 + export PATH=$JAVA_HOME/bin:$PATH + bin/gerrit.sh start + +================================================================================ +五、完整操作脚本 +================================================================================ + +【启动脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start +sleep 5 +bin/gerrit.sh status + +【停止脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +sleep 3 +ps aux | grep gerrit | grep -v grep + +【重启脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +sleep 3 +JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start +sleep 5 +bin/gerrit.sh status +curl -s -o /dev/null -w "HTTP Status: %{http_code}\n" http://localhost:8080/ + +【状态检查脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +echo "=== Gerrit 服务状态 ===" +bin/gerrit.sh status +echo "" +echo "=== 端口监听状态 ===" +netstat -tlnp | grep -E "8080|29418" +echo "" +echo "=== 进程状态 ===" +ps aux | grep gerrit | grep -v grep +echo "" +echo "=== HTTP 服务测试 ===" +curl -s -o /dev/null -w "HTTP Status: %{http_code}\n" http://localhost:8080/ + +================================================================================ +六、系统服务配置(可选) +================================================================================ + +如果需要将 Gerrit 配置为系统服务(开机自启动),可以创建 systemd 服务文件: + +【创建服务文件】 + +sudo vi /etc/systemd/system/gerrit.service + +【服务文件内容】 + +[Unit] +Description=Gerrit Code Review +After=network.target + +[Service] +Type=forking +User=renjianbo +Group=renjianbo +WorkingDirectory=/home/renjianbo/gerrit_install/review_site +Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64" +ExecStart=/home/renjianbo/gerrit_install/review_site/bin/gerrit.sh start +ExecStop=/home/renjianbo/gerrit_install/review_site/bin/gerrit.sh stop +Restart=on-failure +RestartSec=10 + +[Install] +WantedBy=multi-user.target + +【使用系统服务】 + +1. 重新加载 systemd: + sudo systemctl daemon-reload + +2. 启动服务: + sudo systemctl start gerrit + +3. 停止服务: + sudo systemctl stop gerrit + +4. 重启服务: + sudo systemctl restart gerrit + +5. 查看状态: + sudo systemctl status gerrit + +6. 设置开机自启动: + sudo systemctl enable gerrit + +7. 取消开机自启动: + sudo systemctl disable gerrit + +================================================================================ +七、快速参考命令 +================================================================================ + +【常用命令速查】 + +# 启动 +cd /home/renjianbo/gerrit_install/review_site && JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + +# 停止 +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh stop + +# 重启 +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh stop && sleep 3 && JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + +# 状态 +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh status + +# 查看日志 +cd /home/renjianbo/gerrit_install/review_site && tail -f logs/httpd_log + +# 检查端口 +netstat -tlnp | grep -E "8080|29418" + +# 测试 HTTP +curl http://localhost:8080/ + +# 测试 SSH +ssh -p 29418 renjianbo@localhost gerrit version + +================================================================================ +八、重要提示 +================================================================================ + +1. 启动服务前,确保: + - Java 11 或更高版本已安装 + - 端口 8080 和 29418 未被占用 + - 有足够的磁盘空间和内存 + +2. 停止服务前,建议: + - 等待当前操作完成 + - 通知用户(如果有) + +3. 重启服务后,建议: + - 等待 5-10 秒让服务完全启动 + - 检查服务状态 + - 测试 HTTP 和 SSH 访问 + +4. 日志文件位置: + - HTTP 日志:logs/httpd_log + - SSH 日志:logs/sshd_log + - 主日志:logs/gerrit.log + - 错误日志:logs/error_log + +5. 配置文件位置: + - 主配置:etc/gerrit.config + - 安全配置:etc/secure.config + +6. 数据目录: + - Git 仓库:git/ + - 数据库:db/ + - 缓存:cache/ + +================================================================================ +文档结束 +================================================================================ + diff --git a/(红头)Git代码提交命令文档.txt b/(红头)Git代码提交命令文档.txt new file mode 100644 index 0000000..112a40b --- /dev/null +++ b/(红头)Git代码提交命令文档.txt @@ -0,0 +1,606 @@ +================================================================================ + Gerrit Git 代码提交命令文档 +================================================================================ + +文档名称:Gerrit Git 代码提交命令参考 +创建日期:2025-12-15 +适用版本:Gerrit 3.3.8 +服务器地址:http://101.43.95.130:8080 + +================================================================================ +一、初始配置 +================================================================================ + +【配置 Git 用户信息】 + +# 全局配置 +git config --global user.name "Your Name" +git config --global user.email "your_email@example.com" + +# 项目级别配置 +cd /path/to/project +git config user.name "Your Name" +git config user.email "your_email@example.com" + +【配置 Gerrit 服务器】 + +# 配置 SSH 远程仓库 +git remote add origin ssh://renjianbo@101.43.95.130:29418/project-name + +# 或配置 HTTP 远程仓库(不推荐) +git remote add origin http://renjianbo@101.43.95.130:8080/project-name + +【安装 commit-msg hook】 + +# 下载 commit-msg hook(自动添加 Change-Id) +cd /path/to/project +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +================================================================================ +二、克隆项目 +================================================================================ + +【通过 SSH 克隆(推荐)】 + +git clone ssh://renjianbo@101.43.95.130:29418/project-name +cd project-name + +【通过 HTTP 克隆】 + +git clone http://101.43.95.130:8080/project-name +cd project-name + +# 首次克隆时,如果提示输入用户名,输入:renjianbo +# 密码留空(开发模式不需要密码) + +================================================================================ +三、基本提交流程 +================================================================================ + +【步骤1:修改代码】 + +# 编辑文件 +vim file.txt +# 或使用其他编辑器 + +【步骤2:查看修改】 + +# 查看工作区状态 +git status + +# 查看具体修改内容 +git diff + +# 查看已暂存的修改 +git diff --cached + +【步骤3:暂存修改】 + +# 暂存单个文件 +git add file.txt + +# 暂存所有修改 +git add . + +# 暂存所有修改(包括删除的文件) +git add -A + +# 交互式暂存(选择性地暂存修改) +git add -i + +【步骤4:提交代码】 + +# 提交修改(commit-msg hook 会自动添加 Change-Id) +git commit -m "Your commit message" + +# 提交并添加详细描述 +git commit -m "Short summary" -m "Detailed description" + +# 提交时直接编辑提交信息 +git commit + +【步骤5:推送到 Gerrit 进行评审】 + +# 推送到评审队列(关键:推送到 refs/for/master) +git push origin HEAD:refs/for/master + +# 推送到其他分支的评审队列 +git push origin HEAD:refs/for/develop + +# 推送到指定分支的评审队列 +git push origin HEAD:refs/for/branch-name + +================================================================================ +四、修改已提交的代码 +================================================================================ + +【修改最后一次提交】 + +# 修改提交信息(不改变代码) +git commit --amend + +# 修改提交信息(使用编辑器) +git commit --amend -m "New commit message" + +# 添加文件到最后一次提交 +git add forgotten-file.txt +git commit --amend --no-edit + +# 修改提交信息但保持 Change-Id 不变 +git commit --amend --no-edit + +【修改之前的提交】 + +# 交互式 rebase(修改历史提交) +git rebase -i HEAD~3 # 修改最近 3 次提交 + +# 在交互式界面中,将要修改的提交标记为 "edit" +# 然后修改代码,使用: +git add . +git commit --amend --no-edit +git rebase --continue + +【重新推送修改后的提交】 + +# 修改提交后,重新推送到 Gerrit +git push origin HEAD:refs/for/master + +# 如果提示需要 force push,使用: +git push origin HEAD:refs/for/master --force + +================================================================================ +五、分支操作 +================================================================================ + +【创建新分支】 + +# 基于当前分支创建新分支 +git checkout -b feature/new-feature + +# 基于指定分支创建新分支 +git checkout -b feature/new-feature origin/master + +# 基于指定提交创建新分支 +git checkout -b feature/new-feature + +【切换分支】 + +# 切换到已存在的分支 +git checkout branch-name + +# 切换到 master 分支 +git checkout master + +【查看分支】 + +# 查看本地分支 +git branch + +# 查看所有分支(包括远程) +git branch -a + +# 查看远程分支 +git branch -r + +【删除分支】 + +# 删除本地分支 +git branch -d branch-name + +# 强制删除本地分支 +git branch -D branch-name + +【推送分支到 Gerrit】 + +# 推送新分支 +git push origin branch-name:refs/for/branch-name + +# 推送并设置上游分支 +git push -u origin branch-name:refs/for/branch-name + +================================================================================ +六、查看和比较 +================================================================================ + +【查看提交历史】 + +# 查看提交历史 +git log + +# 查看简洁的提交历史 +git log --oneline + +# 查看图形化的提交历史 +git log --graph --oneline --all + +# 查看最近 N 次提交 +git log -n 5 + +# 查看指定文件的提交历史 +git log file.txt + +# 查看提交的详细修改 +git log -p + +【查看差异】 + +# 查看工作区和暂存区的差异 +git diff + +# 查看暂存区和最后一次提交的差异 +git diff --cached + +# 查看工作区和最后一次提交的差异 +git diff HEAD + +# 查看两次提交之间的差异 +git diff commit1 commit2 + +# 查看两个分支之间的差异 +git diff branch1 branch2 + +【查看文件状态】 + +# 查看工作区状态 +git status + +# 查看简洁的状态 +git status -s + +# 查看详细的文件状态 +git status -v + +================================================================================ +七、撤销操作 +================================================================================ + +【撤销工作区修改】 + +# 撤销单个文件的修改 +git checkout -- file.txt + +# 撤销所有文件的修改(危险!) +git checkout -- . + +# 使用 restore 命令(Git 2.23+) +git restore file.txt +git restore . + +【撤销暂存区的修改】 + +# 取消暂存单个文件 +git reset HEAD file.txt + +# 取消暂存所有文件 +git reset HEAD + +# 使用 restore 命令(Git 2.23+) +git restore --staged file.txt +git restore --staged . + +【撤销提交】 + +# 撤销最后一次提交,保留修改在暂存区 +git reset --soft HEAD~1 + +# 撤销最后一次提交,保留修改在工作区 +git reset --mixed HEAD~1 +# 或 +git reset HEAD~1 + +# 撤销最后一次提交,完全删除修改(危险!) +git reset --hard HEAD~1 + +================================================================================ +八、Gerrit 特定操作 +================================================================================ + +【推送代码评审】 + +# 推送到 master 分支的评审队列 +git push origin HEAD:refs/for/master + +# 推送到 develop 分支的评审队列 +git push origin HEAD:refs/for/develop + +# 推送时添加主题(Topic) +git push origin HEAD:refs/for/master%topic=feature-name + +# 推送时添加评审者 +git push origin HEAD:refs/for/master%r=reviewer@example.com + +# 推送时添加多个评审者 +git push origin HEAD:refs/for/master%r=reviewer1@example.com,r=reviewer2@example.com + +# 推送时标记为 Work In Progress(WIP) +git push origin HEAD:refs/for/master%wip + +# 推送时标记为私有(只有评审者可见) +git push origin HEAD:refs/for/master%private + +【直接推送(跳过评审,不推荐)】 + +# 直接推送到 master 分支(绕过评审) +git push origin HEAD:refs/heads/master + +# 直接推送到其他分支 +git push origin HEAD:refs/heads/branch-name + +【查看 Gerrit 变更】 + +# 查看变更列表(需要安装 gerrit 工具) +ssh -p 29418 renjianbo@101.43.95.130 gerrit query status:open + +# 查看特定变更 +ssh -p 29418 renjianbo@101.43.95.130 gerrit query change:1 + +# 查看我的变更 +ssh -p 29418 renjianbo@101.43.95.130 gerrit query owner:renjianbo + +【下载变更到本地】 + +# 下载变更到本地(cherry-pick) +git fetch ssh://renjianbo@101.43.95.130:29418/project-name refs/changes/01/1/1 +git cherry-pick FETCH_HEAD + +# 或使用 checkout +git fetch ssh://renjianbo@101.43.95.130:29418/project-name refs/changes/01/1/1 +git checkout FETCH_HEAD + +================================================================================ +九、合并后的操作 +================================================================================ + +【更新本地仓库】 + +# 切换到 master 分支 +git checkout master + +# 拉取最新代码 +git pull origin master + +# 或使用 fetch + merge +git fetch origin +git merge origin/master + +【清理已合并的分支】 + +# 删除已合并的本地分支 +git branch -d feature-branch + +# 强制删除分支(即使未合并) +git branch -D feature-branch + +# 删除远程分支的引用 +git remote prune origin + +【同步远程分支】 + +# 获取所有远程分支信息 +git fetch origin + +# 查看远程分支 +git branch -r + +# 创建本地分支跟踪远程分支 +git checkout -b local-branch origin/remote-branch + +================================================================================ +十、常用工作流程 +================================================================================ + +【工作流程1:创建新功能】 + +# 1. 更新主分支 +git checkout master +git pull origin master + +# 2. 创建功能分支 +git checkout -b feature/new-feature + +# 3. 开发代码 +# ... 修改代码 ... + +# 4. 提交代码 +git add . +git commit -m "Add new feature" + +# 5. 推送到 Gerrit 评审 +git push origin HEAD:refs/for/master + +# 6. 在 Gerrit Web 界面进行评审 + +# 7. 合并后,更新本地仓库 +git checkout master +git pull origin master +git branch -d feature/new-feature + +【工作流程2:修复 Bug】 + +# 1. 从 master 创建修复分支 +git checkout master +git pull origin master +git checkout -b bugfix/fix-issue-123 + +# 2. 修复代码 +# ... 修复代码 ... + +# 3. 提交修复 +git add . +git commit -m "Fix issue #123" + +# 4. 推送到 Gerrit 评审 +git push origin HEAD:refs/for/master + +【工作流程3:修改已提交的代码】 + +# 1. 修改代码 +# ... 修改代码 ... + +# 2. 添加到最后一次提交 +git add . +git commit --amend --no-edit + +# 3. 重新推送(会自动更新原变更) +git push origin HEAD:refs/for/master + +【工作流程4:处理评审意见】 + +# 1. 查看评审意见(在 Gerrit Web 界面) + +# 2. 修改代码 +# ... 根据意见修改代码 ... + +# 3. 修改提交 +git add . +git commit --amend --no-edit + +# 4. 重新推送 +git push origin HEAD:refs/for/master + +================================================================================ +十一、高级操作 +================================================================================ + +【Stash 操作(暂存修改)】 + +# 暂存当前修改 +git stash + +# 暂存并添加描述 +git stash save "Work in progress" + +# 查看暂存列表 +git stash list + +# 恢复暂存(保留暂存记录) +git stash apply + +# 恢复暂存(删除暂存记录) +git stash pop + +# 删除暂存 +git stash drop + +# 清空所有暂存 +git stash clear + +【Rebase 操作】 + +# 将当前分支 rebase 到 master +git checkout feature-branch +git rebase master + +# 交互式 rebase(修改最近 3 次提交) +git rebase -i HEAD~3 + +# 中止 rebase +git rebase --abort + +# 继续 rebase +git rebase --continue + +【Cherry-pick 操作】 + +# 选择性地应用某个提交 +git cherry-pick + +# 选择性地应用多个提交 +git cherry-pick + +# 选择性地应用提交范围 +git cherry-pick .. + +================================================================================ +十二、配置 SSH(避免每次输入长命令) +================================================================================ + +【创建 SSH 配置文件】 + +# 创建配置文件 +mkdir -p ~/.ssh +cat > ~/.ssh/config << 'EOF' +Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa +EOF + +# 设置权限 +chmod 600 ~/.ssh/config + +【配置后可以直接使用】 + +# 配置后,可以直接使用简短的命令 +git push origin HEAD:refs/for/master + +# 不需要每次都输入: +# GIT_SSH_COMMAND="ssh -o PubkeyAcceptedKeyTypes=+ssh-rsa ..." git push ... + +================================================================================ +十三、常用命令速查表 +================================================================================ + +【日常开发】 + +git status # 查看状态 +git add . # 暂存所有修改 +git commit -m "message" # 提交代码 +git push origin HEAD:refs/for/master # 推送到 Gerrit + +【查看信息】 + +git log --oneline # 查看提交历史 +git diff # 查看修改 +git branch # 查看分支 + +【分支操作】 + +git checkout -b branch-name # 创建并切换分支 +git checkout branch-name # 切换分支 +git branch -d branch-name # 删除分支 + +【撤销操作】 + +git checkout -- file.txt # 撤销文件修改 +git reset HEAD file.txt # 取消暂存 +git commit --amend # 修改最后一次提交 + +【Gerrit 特定】 + +git push origin HEAD:refs/for/master # 推送评审 +git push origin HEAD:refs/for/master%wip # 推送为 WIP +git commit --amend --no-edit # 修改提交(保持 Change-Id) + +================================================================================ +十四、重要提示 +================================================================================ + +1. 推送到 Gerrit 必须使用 refs/for/ 前缀,例如: + git push origin HEAD:refs/for/master + + 不要直接推送到 refs/heads/master(会绕过评审) + +2. 每次提交都会自动包含 Change-Id(如果安装了 commit-msg hook) + +3. 修改提交后重新推送,会自动更新原变更,不会创建新变更 + +4. 推送成功后,Gerrit 会返回变更 URL,例如: + remote: http://101.43.95.130:8080/c/project/+/1 [NEW] + +5. 在 Gerrit Web 界面进行代码评审,不要直接合并到主分支 + +6. 合并后,记得更新本地仓库: + git checkout master + git pull origin master + +7. 如果遇到问题,查看 Gerrit 日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/httpd_log + +================================================================================ +文档结束 +================================================================================ + diff --git a/(红头)gerrit问题解决.txt b/(红头)gerrit问题解决.txt new file mode 100644 index 0000000..8b63167 --- /dev/null +++ b/(红头)gerrit问题解决.txt @@ -0,0 +1,309 @@ +================================================================================ + Gerrit 问题解决方案文档 +================================================================================ + +文档名称:Gerrit 登录和推送问题解决方案 +创建日期:2025-12-15 +适用版本:Gerrit 3.3.8 +服务器地址:http://101.43.95.130:8080 + +================================================================================ +一、登录问题解决方案 +================================================================================ + +问题现象: +---------- +- 点击 Account ID 登录后,界面仍然显示 "ANONYMOUS"(匿名用户) +- 服务器端登录成功(日志显示账户ID),但浏览器界面显示匿名 + +问题根源: +---------- +这是浏览器的 Cookie 安全策略导致的。现代浏览器(Chrome/Edge/Firefox)对 +Cookie 有严格的安全限制,特别是 SameSite 属性。 + +解决方案: +---------- + +【方案一】修改 Chrome 浏览器的 SameSite 标志(推荐) + +1. 在 Chrome 地址栏输入:chrome://flags/ +2. 在搜索框输入:SameSite +3. 找到以下选项并修改: + - "SameSite by default cookies" → 设置为 Disabled + - "Cookies without SameSite must be secure" → 设置为 Disabled +4. 点击右下角的"重新启动"按钮 +5. 清除浏览器 Cookie(Ctrl+Shift+Delete,选择"所有时间",清除 Cookie) +6. 重新访问:http://101.43.95.130:8080 +7. 点击 Account ID 登录 + +【方案二】修改 Firefox 浏览器的配置 + +1. 在 Firefox 地址栏输入:about:config +2. 点击"接受风险并继续" +3. 在搜索框输入:network.cookie.sameSite.noneRequiresSecure +4. 双击该选项,将值改为 false +5. 重启 Firefox +6. 清除浏览器 Cookie +7. 重新访问:http://101.43.95.130:8080 +8. 点击 Account ID 登录 + +【方案三】服务器端配置(已完成) + +服务器端已配置: +- cookieSecure = false(允许 HTTP 使用 Cookie) +- cookieSameSite = LAX(允许跨站 Cookie) +- canonicalWebUrl = http://101.43.95.130:8080/(正确的访问地址) + +================================================================================ +二、代码推送问题解决方案 +================================================================================ + +问题现象: +---------- +- HTTP 推送失败:remote: Unauthorized +- SSH 推送失败:Permission denied (publickey) 或 no mutual signature algorithm + +问题根源: +---------- +1. HTTP 认证:DEVELOPMENT_BECOME_ANY_ACCOUNT 模式对 HTTP Basic 认证支持有限 +2. SSH 认证:OpenSSH 10.0 默认禁用了某些旧的签名算法(如 RSA-SHA1), + 而 Gerrit 3.3.8 使用的 Apache SSHD 可能不支持新的签名算法 + +解决方案: +---------- + +【步骤一】配置 SSH 密钥 + +1. 生成 SSH 密钥(如果还没有): + ssh-keygen -t rsa -b 4096 -C "your_email@example.com" + +2. 查看公钥内容: + cat ~/.ssh/id_rsa.pub + # Windows Git Bash 使用: + type ~/.ssh/id_rsa.pub + +3. 将公钥添加到 Gerrit: + - 访问:http://101.43.95.130:8080/#/settings/ssh-keys + - 在 "New SSH key" 输入框中粘贴完整公钥 + - 点击 "Add" 保存 + +【步骤二】创建 SSH 配置文件(解决签名算法问题) + +在本地电脑上创建 SSH 配置文件: + +1. 创建配置文件: + mkdir -p ~/.ssh + cat > ~/.ssh/config << 'EOF' + Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa + EOF + +2. 设置正确的权限: + chmod 600 ~/.ssh/config + +3. 验证配置: + cat ~/.ssh/config + +【步骤三】测试 SSH 连接 + +ssh -p 29418 renjianbo@101.43.95.130 gerrit version + +如果成功,会显示:gerrit version 3.3.8 + +【步骤四】配置 Git 使用 SSH + +1. 删除 HTTP 远程仓库: + git remote remove origin + +2. 添加 SSH 远程仓库: + git remote add origin ssh://renjianbo@101.43.95.130:29418/test-project + +3. 验证远程仓库配置: + git remote -v + +【步骤五】注册邮箱地址 + +1. 访问:http://101.43.95.130:8080/#/settings/email-addresses +2. 在 "New Email Address" 输入框中输入您的邮箱地址 +3. 点击 "Add" 按钮 +4. 如果需要验证,按提示完成验证 + +【步骤六】安装 commit-msg hook(添加 Change-Id) + +1. 下载 commit-msg hook: + cd /d/ttt/test-project + mkdir -p .git/hooks + curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + chmod +x .git/hooks/commit-msg + +2. 修改最后一次提交(添加 Change-Id): + git commit --amend --no-edit + +【步骤七】推送代码 + +git push origin HEAD:refs/for/master + +推送成功后,Gerrit 会返回变更 URL,例如: +remote: http://101.43.95.130:8080/c/test-project/+/1 [NEW] + +================================================================================ +三、防火墙配置(如果 SSH 连接超时) +================================================================================ + +如果 SSH 连接超时(Connection timed out),需要配置防火墙: + +【云服务器】 + +1. 登录云控制台(阿里云、腾讯云等) +2. 找到安全组配置 +3. 添加入站规则: + - 协议:TCP + - 端口:29418 + - 源:0.0.0.0/0(或您的 IP) +4. 保存规则 + +【本地服务器】 + +sudo firewall-cmd --permanent --add-port=29418/tcp +sudo firewall-cmd --reload +sudo firewall-cmd --list-ports | grep 29418 + +================================================================================ +四、完整操作流程示例 +================================================================================ + +【首次设置】 + +1. 配置 SSH 密钥和配置文件(见上述步骤一、二) + +2. 克隆项目: + git clone ssh://renjianbo@101.43.95.130:29418/test-project + cd test-project + +3. 安装 commit-msg hook: + mkdir -p .git/hooks + curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + chmod +x .git/hooks/commit-msg + +4. 配置 Git 用户信息: + git config user.name "Your Name" + git config user.email "your_email@example.com" + +【日常开发流程】 + +1. 修改代码 +2. 提交代码: + git add . + git commit -m "Your commit message" +3. 推送代码评审: + git push origin HEAD:refs/for/master +4. 在 Gerrit Web 界面进行评审 +5. 如果有修改意见,修改后重新推送: + git commit --amend + git push origin HEAD:refs/for/master +6. 合并后,更新本地仓库: + git checkout master + git pull origin master + +================================================================================ +五、常见问题排查 +================================================================================ + +【问题1】SSH 连接超时 + +检查项: +- 防火墙是否开放 29418 端口 +- 云服务器安全组是否配置正确 +- Gerrit SSH 服务是否运行:bin/gerrit.sh status + +【问题2】SSH 认证失败(Permission denied) + +检查项: +- 公钥是否已添加到 Gerrit +- SSH 配置文件是否正确 +- 用户名是否正确(Settings → Profile) + +【问题3】缺少 Change-Id + +解决: +- 安装 commit-msg hook(见步骤六) +- 使用 git commit --amend --no-edit 修改提交 + +【问题4】邮箱地址未注册 + +解决: +- 访问 Settings → Email Addresses +- 添加您的邮箱地址 + +【问题5】HTTP 推送失败 + +解决: +- 使用 SSH 方式推送(推荐) +- 或配置 gitBasicAuth = true(服务器端已配置) + +================================================================================ +六、服务器端配置摘要 +================================================================================ + +当前服务器配置(/home/renjianbo/gerrit_install/review_site/etc/gerrit.config): + +[gerrit] + basePath = git + canonicalWebUrl = http://101.43.95.130:8080/ + serverId = fab2bec9-a17c-434d-9a25-76a7f2675339 + +[database] + type = h2 + database = db/ReviewDB + +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT + gitBasicAuth = true + +[sshd] + listenAddress = *:29418 + +[httpd] + listenUrl = http://*:8080/ + cookieSecure = false + cookieSameSite = LAX + cookiePath = / + +[cache] + directory = cache + +[index] + type = LUCENE + +[receive] + enableSignedPush = false + +================================================================================ +七、重要提示 +================================================================================ + +1. SSH 方式比 HTTP 更可靠,强烈推荐使用 SSH 推送代码 + +2. 安装 commit-msg hook 后,以后的所有提交都会自动包含 Change-Id + +3. 创建 SSH 配置文件后,以后可以直接使用 git push,不需要每次都 + 输入长命令 + +4. 如果遇到问题,查看服务器日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/httpd_log + tail -f logs/sshd_log + +5. 常用链接: + - Gerrit 主页:http://101.43.95.130:8080 + - 所有变更:http://101.43.95.130:8080/#/q/status:open + - 我的变更:http://101.43.95.130:8080/#/q/owner:renjianbo + - SSH Keys:http://101.43.95.130:8080/#/settings/ssh-keys + - Email 地址:http://101.43.95.130:8080/#/settings/email-addresses + +================================================================================ +文档结束 +================================================================================ + diff --git a/(红头1)服务器启停说明.txt b/(红头1)服务器启停说明.txt new file mode 100644 index 0000000..dd98ed0 --- /dev/null +++ b/(红头1)服务器启停说明.txt @@ -0,0 +1,428 @@ +================================================================================ + 服务器启停操作说明 +================================================================================ + +文档名称:服务器启停操作说明 +创建日期:2025-01-XX +服务器类型:Gerrit Code Review +服务器路径:/home/renjianbo/gerrit_install/review_site +Java 版本:Java 17 + +================================================================================ +一、快速操作命令 +================================================================================ + +【启动服务器】 +cd /home/renjianbo/gerrit_install/review_site +JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start + +【停止服务器】 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop + +【重启服务器】 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +sleep 3 +JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start + +【查看服务状态】 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh status + +【查看进程】 +ps aux | grep gerrit | grep -v grep + +================================================================================ +二、详细操作步骤 +================================================================================ + +【启动服务器】 + +1. 进入服务器目录: + cd /home/renjianbo/gerrit_install/review_site + +2. 启动服务(使用 Java 17): + JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start + +3. 等待服务启动(建议等待 5-10 秒): + sleep 5 + +4. 检查服务状态: + bin/gerrit.sh status + +5. 验证服务是否正常运行: + - 检查端口监听:netstat -tlnp | grep 8080 + - 测试 HTTP 访问:curl http://localhost:8080/ + - 访问 Web 界面:http://101.43.95.130:8080 + +【停止服务器】 + +1. 进入服务器目录: + cd /home/renjianbo/gerrit_install/review_site + +2. 停止服务: + bin/gerrit.sh stop + +3. 等待服务停止(建议等待 3-5 秒): + sleep 3 + +4. 验证服务已停止: + bin/gerrit.sh status + ps aux | grep gerrit | grep -v grep + +5. 如果服务未正常停止,强制停止: + # 查找进程 ID + ps aux | grep gerrit | grep -v grep + + # 强制停止(替换 PID 为实际进程 ID) + kill -9 + + # 或者直接停止所有 Gerrit 进程 + pkill -9 -f gerrit + +【重启服务器】 + +1. 进入服务器目录: + cd /home/renjianbo/gerrit_install/review_site + +2. 停止服务: + bin/gerrit.sh stop + +3. 等待服务完全停止: + sleep 3 + +4. 启动服务(使用 Java 17): + JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start + +5. 等待服务启动: + sleep 5 + +6. 检查服务状态: + bin/gerrit.sh status + +7. 验证服务正常运行: + curl -s -o /dev/null -w "HTTP Status: %{http_code}\n" http://localhost:8080/ + +================================================================================ +三、服务状态检查 +================================================================================ + +【检查服务状态】 + +1. 使用 Gerrit 脚本检查: + cd /home/renjianbo/gerrit_install/review_site + bin/gerrit.sh status + +2. 检查进程: + ps aux | grep gerrit | grep -v grep + +3. 检查端口监听: + # HTTP 端口(默认 8080) + netstat -tlnp | grep 8080 + # 或使用 ss 命令 + ss -tlnp | grep 8080 + + # SSH 端口(默认 29418) + netstat -tlnp | grep 29418 + # 或使用 ss 命令 + ss -tlnp | grep 29418 + +4. 测试 HTTP 服务: + curl http://localhost:8080/ + # 或检查 HTTP 状态码 + curl -s -o /dev/null -w "HTTP Status: %{http_code}\n" http://localhost:8080/ + +5. 测试 SSH 服务: + ssh -p 29418 renjianbo@localhost gerrit version + +6. 检查 Web 界面访问: + 浏览器访问:http://101.43.95.130:8080 + +================================================================================ +四、日志查看 +================================================================================ + +【查看实时日志】 + +1. HTTP 访问日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/httpd_log + +2. SSH 访问日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/sshd_log + +3. Gerrit 主日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/gerrit.log + +4. 错误日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/error_log + +【查看历史日志】 + +1. 查看最后 N 行日志: + tail -100 logs/gerrit.log # 查看最后 100 行 + tail -50 logs/error_log # 查看最后 50 行错误日志 + +2. 搜索日志内容: + grep "error" logs/gerrit.log | tail -20 + grep "renjianbo" logs/httpd_log | tail -20 + +================================================================================ +五、常见问题处理 +================================================================================ + +【问题1】服务启动失败 + +检查步骤: +1. 检查 Java 版本和路径: + /usr/local/java/jdk-17.0.12+7/bin/java -version + echo $JAVA_HOME + +2. 检查端口是否被占用: + netstat -tlnp | grep 8080 + netstat -tlnp | grep 29418 + + 如果端口被占用: + - 查找占用进程:lsof -i :8080 + - 停止占用进程或修改配置文件中的端口 + +3. 查看错误日志: + cd /home/renjianbo/gerrit_install/review_site + tail -50 logs/error_log + +4. 检查磁盘空间: + df -h + +5. 检查内存: + free -h + +【问题2】服务无法停止 + +解决方法: +1. 查找进程: + ps aux | grep gerrit | grep -v grep + +2. 强制停止: + kill -9 + + 或: + pkill -9 -f gerrit + +3. 验证已停止: + bin/gerrit.sh status + ps aux | grep gerrit | grep -v grep + +【问题3】服务启动后无法访问 + +检查步骤: +1. 检查服务状态: + bin/gerrit.sh status + +2. 检查端口监听: + netstat -tlnp | grep 8080 + +3. 检查防火墙: + sudo firewall-cmd --list-ports + # 确保 8080 和 29418 端口已开放 + + # 如果需要开放端口: + sudo firewall-cmd --permanent --add-port=8080/tcp + sudo firewall-cmd --permanent --add-port=29418/tcp + sudo firewall-cmd --reload + +4. 检查配置文件: + cat etc/gerrit.config | grep listenUrl + cat etc/gerrit.config | grep canonicalWebUrl + +5. 测试本地访问: + curl http://localhost:8080/ + +【问题4】Java 版本问题 + +如果遇到 Java 版本错误: +1. 检查 Java 安装路径: + ls -la /usr/local/java/ + +2. 使用指定 Java 版本启动: + JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start + +3. 或者设置环境变量: + export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 + export PATH=$JAVA_HOME/bin:$PATH + bin/gerrit.sh start + +================================================================================ +六、一键操作脚本 +================================================================================ + +【启动脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start +sleep 5 +bin/gerrit.sh status + +【停止脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +sleep 3 +ps aux | grep gerrit | grep -v grep + +【重启脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +sleep 3 +JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start +sleep 5 +bin/gerrit.sh status +curl -s -o /dev/null -w "HTTP Status: %{http_code}\n" http://localhost:8080/ + +【状态检查脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +echo "=== 服务状态 ===" +bin/gerrit.sh status +echo "" +echo "=== 端口监听状态 ===" +netstat -tlnp | grep -E "8080|29418" +echo "" +echo "=== 进程状态 ===" +ps aux | grep gerrit | grep -v grep +echo "" +echo "=== HTTP 服务测试 ===" +curl -s -o /dev/null -w "HTTP Status: %{http_code}\n" http://localhost:8080/ + +================================================================================ +七、系统服务配置(可选) +================================================================================ + +如果需要将服务器配置为系统服务(开机自启动),可以使用 systemd: + +【创建服务文件】 + +sudo vi /etc/systemd/system/gerrit.service + +【服务文件内容】 + +[Unit] +Description=Gerrit Code Review +After=network.target + +[Service] +Type=forking +User=renjianbo +Group=renjianbo +WorkingDirectory=/home/renjianbo/gerrit_install/review_site +Environment="JAVA_HOME=/usr/local/java/jdk-17.0.12+7" +ExecStart=/home/renjianbo/gerrit_install/review_site/bin/gerrit.sh start +ExecStop=/home/renjianbo/gerrit_install/review_site/bin/gerrit.sh stop +Restart=on-failure +RestartSec=10 + +[Install] +WantedBy=multi-user.target + +【使用系统服务】 + +1. 重新加载 systemd: + sudo systemctl daemon-reload + +2. 启动服务: + sudo systemctl start gerrit + +3. 停止服务: + sudo systemctl stop gerrit + +4. 重启服务: + sudo systemctl restart gerrit + +5. 查看状态: + sudo systemctl status gerrit + +6. 设置开机自启动: + sudo systemctl enable gerrit + +7. 取消开机自启动: + sudo systemctl disable gerrit + +================================================================================ +八、快速参考命令 +================================================================================ + +# 启动服务器 +cd /home/renjianbo/gerrit_install/review_site && JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start + +# 停止服务器 +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh stop + +# 重启服务器 +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh stop && sleep 3 && JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start + +# 查看状态 +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh status + +# 查看日志 +cd /home/renjianbo/gerrit_install/review_site && tail -f logs/gerrit.log + +# 检查端口 +netstat -tlnp | grep -E "8080|29418" + +# 测试 HTTP +curl http://localhost:8080/ + +# 测试 SSH +ssh -p 29418 renjianbo@localhost gerrit version + +================================================================================ +九、重要提示 +================================================================================ + +1. 启动服务前,确保: + - Java 17 已正确安装(路径:/usr/local/java/jdk-17.0.12+7) + - 端口 8080(HTTP)和 29418(SSH)未被占用 + - 有足够的磁盘空间和内存 + - 服务器目录存在:/home/renjianbo/gerrit_install/review_site + +2. 停止服务前,建议: + - 等待当前操作完成 + - 通知相关用户(如果有) + +3. 重启服务后,建议: + - 等待 5-10 秒让服务完全启动 + - 检查服务状态 + - 测试 HTTP 和 SSH 访问 + - 验证 Web 界面可正常访问 + +4. 日志文件位置: + - HTTP 日志:logs/httpd_log + - SSH 日志:logs/sshd_log + - 主日志:logs/gerrit.log + - 错误日志:logs/error_log + +5. 配置文件位置: + - 主配置:etc/gerrit.config + - 安全配置:etc/secure.config + +6. 数据目录: + - Git 仓库:git/ + - 数据库:db/ + - 缓存:cache/ + +7. 服务器访问地址: + - Web 界面:http://101.43.95.130:8080 + - SSH 端口:29418 + +================================================================================ +文档结束 +================================================================================ + diff --git a/CI流水线部署方案.md b/CI流水线部署方案.md new file mode 100644 index 0000000..6ecfd91 --- /dev/null +++ b/CI流水线部署方案.md @@ -0,0 +1,456 @@ +# CI/CD 流水线部署方案 + +## 概述 + +当前项目已部署 Gerrit 代码审查系统(运行在 `http://101.43.95.130:8080`),本文档提供几种 CI/CD 流水线部署方案,可根据需求选择。 + +--- + +## 方案对比 + +| 方案 | 优点 | 缺点 | 适用场景 | +|------|------|------|----------| +| **Jenkins** | 功能强大、插件丰富、与 Gerrit 集成好 | 资源占用较大 | 企业级、复杂流水线 | +| **Drone CI** | 轻量级、现代化、Docker 原生 | 功能相对简单 | 中小型项目、容器化环境 | +| **GitLab Runner** | 独立运行、配置简单 | 需要单独配置 | 熟悉 GitLab CI 语法 | +| **Webhook + 脚本** | 最轻量、完全自定义 | 需要自己开发 | 简单自动化需求 | + +--- + +## 方案一:Jenkins(推荐) + +### 特点 +- ✅ 与 Gerrit 深度集成,支持事件触发 +- ✅ 丰富的插件生态 +- ✅ 成熟的流水线配置(Pipeline as Code) +- ✅ 支持分布式构建 + +### 安装步骤 + +#### 1. 快速安装(使用脚本) + +```bash +# 运行 Jenkins 安装脚本 +bash install_jenkins.sh +``` + +#### 2. 手动安装 + +```bash +# 1. 安装 Jenkins(CentOS/RHEL) +sudo wget -O /etc/yum.repos.d/jenkins.repo \ + https://pkg.jenkins.io/redhat-stable/jenkins.repo +sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key +sudo yum install -y jenkins + +# 2. 启动 Jenkins +sudo systemctl start jenkins +sudo systemctl enable jenkins + +# 3. 查看初始密码 +sudo cat /var/lib/jenkins/secrets/initialAdminPassword + +# 4. 访问 Jenkins +# http://101.43.95.130:8080(如果端口冲突,Jenkins 默认使用 8080,需要修改) +``` + +### Gerrit 集成配置 + +#### 1. 安装 Gerrit Trigger 插件 +- Jenkins 管理界面 → 插件管理 → 搜索 "Gerrit Trigger" → 安装 + +#### 2. 配置 Gerrit 连接 +- Jenkins 管理界面 → 系统配置 → Gerrit Trigger +- 添加 Gerrit Server: + - **Name**: `Gerrit-Server` + - **Frontend URL**: `http://101.43.95.130:8080` + - **SSH Port**: `29418` + - **Username**: `admin`(或您的 Gerrit 用户名) + - **SSH Keyfile**: `/home/renjianbo/.ssh/id_rsa`(Gerrit SSH 密钥路径) + +#### 3. 创建流水线任务 +- 新建任务 → 选择 "流水线" 类型 +- 在 Pipeline 脚本中配置: + +```groovy +pipeline { + agent any + + triggers { + gerrit( + serverName: 'Gerrit-Server', + events: [ + changeMerged(), + patchsetCreated() + ], + project: 'plain:.*', + branch: 'plain:.*' + ) + } + + stages { + stage('构建') { + steps { + echo '开始构建...' + sh 'mvn clean package' // 或您的构建命令 + } + } + + stage('测试') { + steps { + echo '运行测试...' + sh 'mvn test' + } + } + + stage('部署') { + steps { + echo '部署应用...' + // 您的部署脚本 + } + } + } + + post { + success { + echo '流水线执行成功' + } + failure { + echo '流水线执行失败' + } + } +} +``` + +--- + +## 方案二:Drone CI(轻量级) + +### 特点 +- ✅ 轻量级,资源占用小 +- ✅ 基于 Docker,易于扩展 +- ✅ 配置简单,YAML 格式 +- ✅ 支持 Gerrit Webhook + +### 安装步骤 + +#### 1. 安装 Docker(如果未安装) + +```bash +# CentOS/RHEL +sudo yum install -y docker +sudo systemctl start docker +sudo systemctl enable docker +``` + +#### 2. 安装 Drone Server + +```bash +# 创建 Drone 配置目录 +sudo mkdir -p /opt/drone +cd /opt/drone + +# 运行 Drone Server(使用 Docker) +docker run \ + --volume=/opt/drone:/data \ + --env=DRONE_GERRIT_SERVER=http://101.43.95.130:8080 \ + --env=DRONE_GERRIT_USERNAME=admin \ + --env=DRONE_RPC_SECRET=$(openssl rand -hex 16) \ + --env=DRONE_SERVER_HOST=101.43.95.130:3000 \ + --env=DRONE_SERVER_PROTO=http \ + --publish=3000:80 \ + --publish=443:443 \ + --restart=always \ + --detach=true \ + --name=drone \ + drone/drone:latest +``` + +#### 3. 安装 Drone Runner + +```bash +# 运行 Drone Runner +docker run -d \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -e DRONE_RPC_PROTO=http \ + -e DRONE_RPC_HOST=101.43.95.130:3000 \ + -e DRONE_RPC_SECRET=<从上面获取的密钥> \ + -e DRONE_RUNNER_CAPACITY=2 \ + -e DRONE_RUNNER_NAME=runner-1 \ + --restart always \ + --name runner \ + drone/drone-runner-docker:latest +``` + +### 配置 Gerrit Webhook + +在 Gerrit 项目中创建 `.drone.yml` 文件: + +```yaml +kind: pipeline +type: docker +name: default + +steps: +- name: build + image: maven:3.8-openjdk-17 + commands: + - mvn clean package + +- name: test + image: maven:3.8-openjdk-17 + commands: + - mvn test + +- name: deploy + image: alpine + commands: + - echo "部署应用..." +``` + +在 Gerrit 项目设置中配置 Webhook: +- URL: `http://101.43.95.130:3000/hook` +- 触发事件: `change-merged`, `patchset-created` + +--- + +## 方案三:GitLab Runner(独立运行) + +### 特点 +- ✅ 独立运行,不需要 GitLab +- ✅ 使用 GitLab CI 语法 +- ✅ 支持多种执行器(Docker、Shell 等) + +### 安装步骤 + +```bash +# 1. 下载 GitLab Runner +curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash +sudo yum install -y gitlab-runner + +# 2. 注册 Runner(需要 GitLab 实例,或使用本地配置) +sudo gitlab-runner register \ + --non-interactive \ + --url "http://localhost" \ + --registration-token "your-token" \ + --executor "shell" \ + --description "Gerrit Runner" + +# 3. 启动 Runner +sudo systemctl start gitlab-runner +sudo systemctl enable gitlab-runner +``` + +### 使用方式 + +在项目根目录创建 `.gitlab-ci.yml`: + +```yaml +stages: + - build + - test + - deploy + +build: + stage: build + script: + - echo "构建项目..." + - mvn clean package + +test: + stage: test + script: + - echo "运行测试..." + - mvn test + +deploy: + stage: deploy + script: + - echo "部署应用..." +``` + +通过 Gerrit Webhook 触发 GitLab Runner 执行。 + +--- + +## 方案四:Webhook + 自定义脚本(最简单) + +### 特点 +- ✅ 最轻量,无需额外服务 +- ✅ 完全自定义 +- ✅ 资源占用最小 + +### 实现步骤 + +#### 1. 创建 Webhook 接收脚本 + +```bash +# 创建目录 +mkdir -p /opt/ci-scripts +cd /opt/ci-scripts + +# 创建简单的 HTTP 服务器接收 Webhook +cat > webhook_receiver.py << 'EOF' +#!/usr/bin/env python3 +from http.server import HTTPServer, BaseHTTPRequestHandler +import json +import subprocess +import os + +class WebhookHandler(BaseHTTPRequestHandler): + def do_POST(self): + content_length = int(self.headers['Content-Length']) + post_data = self.rfile.read(content_length) + + try: + event = json.loads(post_data.decode('utf-8')) + # 处理 Gerrit 事件 + if event.get('type') == 'patchset-created': + project = event.get('change', {}).get('project') + branch = event.get('change', {}).get('branch') + + # 执行构建脚本 + script_path = f'/opt/ci-scripts/build.sh' + if os.path.exists(script_path): + subprocess.Popen(['bash', script_path, project, branch]) + + self.send_response(200) + self.end_headers() + except Exception as e: + print(f"Error: {e}") + self.send_response(500) + self.end_headers() + +if __name__ == '__main__': + server = HTTPServer(('0.0.0.0', 9000), WebhookHandler) + print("Webhook receiver started on port 9000") + server.serve_forever() +EOF + +chmod +x webhook_receiver.py +``` + +#### 2. 创建构建脚本 + +```bash +cat > /opt/ci-scripts/build.sh << 'EOF' +#!/bin/bash +PROJECT=$1 +BRANCH=$2 + +echo "构建项目: $PROJECT, 分支: $BRANCH" + +# 克隆或更新代码 +cd /tmp +if [ -d "$PROJECT" ]; then + cd $PROJECT + git pull +else + git clone ssh://admin@101.43.95.130:29418/$PROJECT + cd $PROJECT +fi + +# 执行构建 +# 根据项目类型执行不同的构建命令 +if [ -f "pom.xml" ]; then + mvn clean package +elif [ -f "package.json" ]; then + npm install && npm run build +fi + +echo "构建完成" +EOF + +chmod +x /opt/ci-scripts/build.sh +``` + +#### 3. 启动 Webhook 服务 + +```bash +# 使用 systemd 管理 +sudo tee /etc/systemd/system/webhook-ci.service > /dev/null << EOSERVICE +[Unit] +Description=CI Webhook Receiver +After=network.target + +[Service] +Type=simple +User=renjianbo +WorkingDirectory=/opt/ci-scripts +ExecStart=/usr/bin/python3 /opt/ci-scripts/webhook_receiver.py +Restart=always + +[Install] +WantedBy=multi-user.target +EOSERVICE + +sudo systemctl daemon-reload +sudo systemctl start webhook-ci +sudo systemctl enable webhook-ci +``` + +#### 4. 配置 Gerrit Webhook + +在 Gerrit 项目设置中添加 Webhook: +- URL: `http://101.43.95.130:9000` +- 事件: `patchset-created`, `change-merged` + +--- + +## 推荐方案选择 + +### 🎯 个人小团队推荐(首选) + +**推荐:方案四 - Webhook + 自定义脚本** +- ✅ **最轻量**:资源占用最小,几乎零开销 +- ✅ **最简单**:无需安装复杂服务,直接运行脚本 +- ✅ **完全可控**:所有逻辑自己掌控,易于调试 +- ✅ **快速部署**:5分钟即可完成部署 +- ⚠️ **适合场景**:个人开发者、小团队、简单构建需求 + +**备选:方案二 - Drone CI** +- ✅ **现代化**:轻量级 CI/CD 工具 +- ✅ **Docker 原生**:适合容器化项目 +- ✅ **配置简单**:YAML 格式配置 +- ⚠️ **需要 Docker**:服务器需要安装 Docker + +### 场景 1:企业级、复杂流水线 +**推荐:Jenkins** +- 需要多环境部署 +- 需要复杂的构建流程 +- 需要详细的构建报告和通知 + +### 场景 2:中小型项目、容器化 +**推荐:Drone CI** +- 项目规模中等 +- 使用 Docker 容器 +- 需要快速部署 + +### 场景 3:简单自动化 +**推荐:Webhook + 脚本** +- 只需要简单的构建和部署 +- 资源有限 +- 完全自定义需求 + +--- + +## 端口规划 + +| 服务 | 端口 | 说明 | +|------|------|------| +| Gerrit | 8080 | 已部署 | +| Jenkins | 8081 | 避免与 Gerrit 冲突 | +| Drone CI | 3000 | Web 界面 | +| Webhook Receiver | 9000 | 自定义脚本 | + +--- + +## 下一步 + +1. 选择适合的方案 +2. 运行对应的安装脚本 +3. 配置 Gerrit 集成 +4. 创建第一个流水线任务 + +如需帮助,请参考各方案的详细安装脚本。 + diff --git a/Gerrit升级指南.md b/Gerrit升级指南.md new file mode 100644 index 0000000..49ad091 --- /dev/null +++ b/Gerrit升级指南.md @@ -0,0 +1,245 @@ +# Gerrit 升级指南 + +## 概述 + +本指南说明如何将 Gerrit 升级到最新版本(3.13.1),并使用 JDK 17 运行。 + +## 当前状态 + +- ✅ JDK 17 已安装: `/usr/local/java/jdk-17.0.12+7` +- ✅ 当前 Gerrit 版本: 3.3.8 或 3.9.0 +- 🎯 目标版本: 3.13.1(支持 JDK 17) + +## 升级步骤 + +### 方法一:使用升级脚本(推荐) + +```bash +cd /home/renjianbo/gerrit +./upgrade_gerrit.sh +``` + +升级脚本会自动: +1. ✅ 验证 JDK 17 安装 +2. ✅ 停止现有 Gerrit 服务 +3. ✅ 备份所有数据(Git 仓库、数据库、配置、插件) +4. ✅ 下载 Gerrit 3.13.1 +5. ✅ 升级 Gerrit(保留现有数据) +6. ✅ 配置 Gerrit 使用 JDK 17 +7. ✅ 启动服务 + +### 方法二:手动升级 + +#### 1. 停止 Gerrit 服务 + +```bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +``` + +#### 2. 备份数据 + +```bash +cd /home/renjianbo/gerrit_install +BACKUP_DIR="backup_$(date +%Y%m%d_%H%M%S)" +mkdir -p $BACKUP_DIR + +# 备份 Git 仓库 +cp -r review_site/git $BACKUP_DIR/ 2>/dev/null || true + +# 备份数据库 +cp -r review_site/db $BACKUP_DIR/ 2>/dev/null || true + +# 备份配置 +cp -r review_site/etc $BACKUP_DIR/ 2>/dev/null || true + +# 备份插件 +cp -r review_site/plugins $BACKUP_DIR/ 2>/dev/null || true +``` + +#### 3. 下载新版本 + +```bash +cd /home/renjianbo/gerrit_install +wget https://gerrit-releases.storage.googleapis.com/gerrit-3.13.1.war +``` + +#### 4. 设置 JDK 17 + +```bash +export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 +export PATH=$JAVA_HOME/bin:$PATH + +# 验证 +java -version +``` + +#### 5. 升级 Gerrit + +```bash +cd /home/renjianbo/gerrit_install +java -jar gerrit-3.13.1.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes +``` + +#### 6. 配置使用 JDK 17 启动 + +编辑 `review_site/bin/gerrit.sh`,在文件开头添加: + +```bash +export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 +export PATH=$JAVA_HOME/bin:$PATH +``` + +#### 7. 启动服务 + +```bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh start +``` + +#### 8. 验证升级 + +```bash +# 检查服务状态 +bin/gerrit.sh status + +# 查看日志 +tail -f logs/error_log + +# 访问 Web 界面 +# http://101.43.95.130:8080 +``` + +## 版本兼容性 + +| Gerrit 版本 | 最低 JDK 要求 | 推荐 JDK | +|------------|--------------|---------| +| 3.3.x | JDK 11 | JDK 11 | +| 3.9.x | JDK 17 | JDK 17 | +| 3.13.x | JDK 17 | JDK 17 | + +## 升级后验证 + +### 1. 检查版本 + +访问 Gerrit Web 界面,在页面底部查看版本号,应该显示 `3.13.1`。 + +### 2. 检查 Java 版本 + +```bash +cd /home/renjianbo/gerrit_install/review_site +ps aux | grep gerrit | grep java +``` + +应该看到进程使用 JDK 17。 + +### 3. 测试功能 + +- ✅ 登录 Web 界面 +- ✅ 查看项目列表 +- ✅ 创建/查看变更 +- ✅ SSH 连接测试 + +## 回滚(如果需要) + +如果升级后出现问题,可以回滚到之前的版本: + +```bash +# 1. 停止服务 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop + +# 2. 恢复备份 +cd /home/renjianbo/gerrit_install +BACKUP_DIR="backup_YYYYMMDD_HHMMSS" # 替换为实际的备份目录名 + +# 恢复 Git 仓库 +rm -rf review_site/git +cp -r $BACKUP_DIR/git review_site/ + +# 恢复数据库 +rm -rf review_site/db +cp -r $BACKUP_DIR/db review_site/ + +# 恢复配置 +rm -rf review_site/etc +cp -r $BACKUP_DIR/etc review_site/ + +# 恢复插件 +rm -rf review_site/plugins +cp -r $BACKUP_DIR/plugins review_site/ 2>/dev/null || true + +# 3. 使用旧版本 war 文件重新初始化 +# (使用之前下载的 gerrit-3.3.8.war 或 gerrit-3.9.0.war) + +# 4. 启动服务 +cd review_site +bin/gerrit.sh start +``` + +## 常见问题 + +### Q: 升级后服务无法启动? + +**A:** 检查日志文件: +```bash +tail -f /home/renjianbo/gerrit_install/review_site/logs/error_log +``` + +常见原因: +- JDK 版本不匹配 +- 端口被占用 +- 配置文件错误 + +### Q: 升级后数据丢失? + +**A:** 检查备份目录: +```bash +ls -la /home/renjianbo/gerrit_install/backup_* +``` + +可以从备份目录恢复数据。 + +### Q: 如何确认使用的是 JDK 17? + +**A:** 运行以下命令: +```bash +cd /home/renjianbo/gerrit_install/review_site +ps aux | grep gerrit | grep -o '/[^ ]*java[^ ]*' | head -1 | xargs -I {} {} -version +``` + +### Q: 升级需要多长时间? + +**A:** 通常需要 2-5 分钟,取决于: +- 网络速度(下载新版本) +- 数据量大小(备份和升级) +- 服务器性能 + +## 注意事项 + +1. ⚠️ **备份重要**:升级前务必备份所有数据 +2. ⚠️ **停机时间**:升级过程中服务会停止,建议在维护窗口进行 +3. ⚠️ **测试环境**:建议先在测试环境验证升级流程 +4. ⚠️ **插件兼容性**:某些插件可能需要更新以支持新版本 +5. ⚠️ **配置检查**:升级后检查配置文件,确保所有设置正确 + +## 相关文件 + +- 升级脚本: `/home/renjianbo/gerrit/upgrade_gerrit.sh` +- 安装脚本: `/home/renjianbo/gerrit/install_gerrit.sh` +- 重新安装脚本: `/home/renjianbo/gerrit/reinstall_gerrit.sh` +- Gerrit 目录: `/home/renjianbo/gerrit_install/` + +## 技术支持 + +如果遇到问题,可以: +1. 查看日志文件 +2. 检查备份数据 +3. 参考 Gerrit 官方文档: https://www.gerritcodereview.com/ + diff --git a/Gerrit安装使用指南.md b/Gerrit安装使用指南.md new file mode 100644 index 0000000..fe48665 --- /dev/null +++ b/Gerrit安装使用指南.md @@ -0,0 +1,855 @@ +# Gerrit 个人使用完整安装与使用指南 + +## 📋 目录 +- [环境准备](#环境准备) +- [手动安装步骤](#手动安装步骤) +- [一键自动化安装脚本](#一键自动化安装脚本) +- [使用指南](#使用指南) +- [常用技巧](#常用技巧) + +--- + +## 环境准备 + +### 适合的系统 +- **Ubuntu** 18.04+ / 20.04 / 22.04 +- **Debian** 10+ / 11+ +- **CentOS** 7+ / Rocky Linux 8+ + +### 云主机建议配置 +- **CPU**: 1-2核 +- **内存**: 2GB +- **磁盘**: 20GB+ (根据项目数量调整) +- **网络**: 公网IP(如需远程访问) + +### 必备软件 +- **Git**: 版本控制工具 +- **JDK**: Java 11 或 Java 17(推荐 Java 17) +- **wget**: 下载工具 + +--- + +## 手动安装步骤 + +### 步骤 1: 系统更新 + +```bash +# Ubuntu/Debian 系统 +sudo apt update && sudo apt upgrade -y + +# CentOS/Rocky Linux 系统 +sudo yum update -y +# 或者 (CentOS 8+) +sudo dnf update -y +``` + +### 步骤 2: 安装依赖软件 + +#### Ubuntu/Debian 系统 + +```bash +# 安装 Git 和 wget +sudo apt install -y git wget + +# 安装 OpenJDK 17 +sudo apt install -y openjdk-17-jdk + +# 验证安装 +java -version +git --version +``` + +#### CentOS/Rocky Linux 系统 + +```bash +# 安装 Git 和 wget +sudo yum install -y git wget +# 或者 (CentOS 8+) +sudo dnf install -y git wget + +# 安装 OpenJDK 17 +sudo yum install -y java-17-openjdk java-17-openjdk-devel +# 或者 (CentOS 8+) +sudo dnf install -y java-17-openjdk java-17-openjdk-devel + +# 验证安装 +java -version +git --version +``` + +### 步骤 3: 创建工作目录 + +```bash +# 创建 Gerrit 工作目录 +sudo mkdir -p /opt/gerrit +sudo chown $USER:$USER /opt/gerrit +cd /opt/gerrit +``` + +### 步骤 4: 下载 Gerrit.war 文件 + +```bash +# 下载最新稳定版本(以 3.9.0 为例,可根据需要修改版本号) +GERRIT_VERSION=3.9.0 +wget https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war + +# 或者下载特定版本 +# wget https://gerrit-releases.storage.googleapis.com/gerrit-3.8.0.war +``` + +### 步骤 5: 初始化 Gerrit(使用内置 H2 数据库) + +```bash +# 初始化 Gerrit,使用 H2 数据库(适合个人使用) +java -jar gerrit-${GERRIT_VERSION}.war init -d review_site + +# 初始化过程中会提示以下配置,建议选择: +# - 数据库类型: [2] H2 (默认,适合个人使用) +# - 认证方式: [1] DEVELOPMENT_BECOME_ANY_ACCOUNT (开发模式,方便测试) +# 或者 [2] HTTP (生产环境推荐) +# - Git 仓库位置: 直接回车使用默认值 +# - 索引类型: [1] LUCENE (默认) +# - 监听地址: 直接回车使用默认 (0.0.0.0) +# - 监听端口: 直接回车使用默认 (29418) 或输入自定义端口 +# - 是否作为守护进程运行: [Y] 是 +# - 是否安装 Bouncy Castle: [Y] 是 +``` + +**注意**: 如果希望非交互式初始化,可以使用以下命令: + +```bash +java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes +``` + +### 步骤 6: 启动 Gerrit 服务 + +```bash +# 进入 Gerrit 站点目录 +cd /opt/gerrit/review_site + +# 启动 Gerrit +bin/gerrit.sh start + +# 查看状态 +bin/gerrit.sh status + +# 查看日志 +tail -f logs/gerrit.log +``` + +### 步骤 7: 访问 Gerrit +101.43.95.130 +http://101.43.95.130:8080 +打开浏览器访问: +- **Web 界面**: `http://你的服务器IP:8080` 或 `http://localhost:8080` +- **SSH 端口**: `29418` (默认) + +--- + +## 一键自动化安装脚本 + +以下脚本会自动判断系统类型、安装依赖、下载 Gerrit、初始化并启动服务。 + +### 创建安装脚本 + +```bash +cat > install_gerrit.sh << 'EOF' +#!/bin/bash + +# Gerrit 一键安装脚本 +# 支持 Ubuntu/Debian 和 CentOS/Rocky Linux + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_VERSION="${GERRIT_VERSION:-3.9.0}" +GERRIT_HOME="/opt/gerrit" +GERRIT_USER="${USER}" +GERRIT_PORT="${GERRIT_PORT:-8080}" +GERRIT_SSH_PORT="${GERRIT_SSH_PORT:-29418}" + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Gerrit 自动化安装脚本${NC}" +echo -e "${GREEN}版本: ${GERRIT_VERSION}${NC}" +echo -e "${GREEN}========================================${NC}" + +# 检测系统类型 +detect_os() { + if [ -f /etc/os-release ]; then + . /etc/os-release + OS=$ID + OS_VERSION=$VERSION_ID + elif [ -f /etc/redhat-release ]; then + OS="rhel" + OS_VERSION=$(cat /etc/redhat-release | sed 's/.*release \([0-9]\+\).*/\1/') + else + echo -e "${RED}无法检测操作系统类型${NC}" + exit 1 + fi + echo -e "${YELLOW}检测到系统: ${OS} ${OS_VERSION}${NC}" +} + +# 安装依赖 +install_dependencies() { + echo -e "${GREEN}开始安装依赖...${NC}" + + if [[ "$OS" == "ubuntu" ]] || [[ "$OS" == "debian" ]]; then + sudo apt update + sudo apt install -y git wget openjdk-17-jdk + elif [[ "$OS" == "centos" ]] || [[ "$OS" == "rhel" ]] || [[ "$OS" == "rocky" ]]; then + if command -v dnf &> /dev/null; then + sudo dnf install -y git wget java-17-openjdk java-17-openjdk-devel + else + sudo yum install -y git wget java-17-openjdk java-17-openjdk-devel + fi + else + echo -e "${RED}不支持的操作系统: ${OS}${NC}" + exit 1 + fi + + # 验证 Java 安装 + if ! java -version 2>&1 | grep -q "version"; then + echo -e "${RED}Java 安装失败${NC}" + exit 1 + fi + + echo -e "${GREEN}依赖安装完成${NC}" +} + +# 创建工作目录 +create_directories() { + echo -e "${GREEN}创建工作目录...${NC}" + sudo mkdir -p ${GERRIT_HOME} + sudo chown ${GERRIT_USER}:${GERRIT_USER} ${GERRIT_HOME} + cd ${GERRIT_HOME} +} + +# 下载 Gerrit +download_gerrit() { + echo -e "${GREEN}下载 Gerrit ${GERRIT_VERSION}...${NC}" + cd ${GERRIT_HOME} + + if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then + wget https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war + else + echo -e "${YELLOW}Gerrit war 文件已存在,跳过下载${NC}" + fi +} + +# 初始化 Gerrit +init_gerrit() { + echo -e "${GREEN}初始化 Gerrit...${NC}" + cd ${GERRIT_HOME} + + if [ -d "review_site" ]; then + echo -e "${YELLOW}Gerrit 已初始化,跳过初始化步骤${NC}" + return + fi + + # 非交互式初始化 + java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + -D gerrit.canonicalWebUrl=http://$(hostname -I | awk '{print $1}'):${GERRIT_PORT}/ \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes || true + + # 配置认证方式为开发模式(方便个人使用) + cat > review_site/etc/gerrit.config << EOCONFIG +[gerrit] + basePath = git + canonicalWebUrl = http://$(hostname -I | awk '{print $1}'):${GERRIT_PORT}/ + serverId = $(uuidgen 2>/dev/null || echo $(date +%s)) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOCONFIG + + echo -e "${GREEN}Gerrit 初始化完成${NC}" +} + +# 启动 Gerrit +start_gerrit() { + echo -e "${GREEN}启动 Gerrit 服务...${NC}" + cd ${GERRIT_HOME}/review_site + + # 启动服务 + bin/gerrit.sh start + + # 等待服务启动 + sleep 5 + + # 检查状态 + if bin/gerrit.sh status | grep -q "Running"; then + echo -e "${GREEN}Gerrit 服务启动成功!${NC}" + else + echo -e "${RED}Gerrit 服务启动失败,请检查日志${NC}" + echo -e "${YELLOW}查看日志: tail -f ${GERRIT_HOME}/review_site/logs/gerrit.log${NC}" + exit 1 + fi +} + +# 创建 systemd 服务(可选) +create_systemd_service() { + echo -e "${GREEN}创建 systemd 服务...${NC}" + + sudo tee /etc/systemd/system/gerrit.service > /dev/null << EOSERVICE +[Unit] +Description=Gerrit Code Review +After=network.target + +[Service] +Type=forking +User=${GERRIT_USER} +Group=${GERRIT_USER} +ExecStart=${GERRIT_HOME}/review_site/bin/gerrit.sh start +ExecStop=${GERRIT_HOME}/review_site/bin/gerrit.sh stop +ExecReload=${GERRIT_HOME}/review_site/bin/gerrit.sh restart +Restart=on-failure +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOSERVICE + + sudo systemctl daemon-reload + sudo systemctl enable gerrit + + echo -e "${GREEN}systemd 服务创建完成${NC}" + echo -e "${YELLOW}使用以下命令管理服务:${NC}" + echo -e " 启动: sudo systemctl start gerrit" + echo -e " 停止: sudo systemctl stop gerrit" + echo -e " 重启: sudo systemctl restart gerrit" + echo -e " 状态: sudo systemctl status gerrit" +} + +# 输出访问信息 +print_info() { + SERVER_IP=$(hostname -I | awk '{print $1}') + + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN}安装完成!${NC}" + echo -e "${GREEN}========================================${NC}" + echo -e "${YELLOW}访问地址:${NC}" + echo -e " Web 界面: http://${SERVER_IP}:${GERRIT_PORT}" + echo -e " SSH 端口: ${GERRIT_SSH_PORT}" + echo -e "" + echo -e "${YELLOW}常用命令:${NC}" + echo -e " 启动服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh start" + echo -e " 停止服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh stop" + echo -e " 重启服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh restart" + echo -e " 查看状态: ${GERRIT_HOME}/review_site/bin/gerrit.sh status" + echo -e " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/gerrit.log" + echo -e "" + echo -e "${YELLOW}配置文件位置:${NC}" + echo -e " ${GERRIT_HOME}/review_site/etc/gerrit.config" + echo -e "" + echo -e "${YELLOW}首次访问:${NC}" + echo -e " 1. 打开浏览器访问 http://${SERVER_IP}:${GERRIT_PORT}" + echo -e " 2. 使用任意用户名登录(开发模式)" + echo -e " 3. 第一个登录的用户将自动成为管理员" + echo -e "${GREEN}========================================${NC}" +} + +# 主函数 +main() { + detect_os + install_dependencies + create_directories + download_gerrit + init_gerrit + start_gerrit + + # 询问是否创建 systemd 服务 + read -p "是否创建 systemd 服务以便开机自启? (y/n): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + create_systemd_service + fi + + print_info +} + +# 执行主函数 +main +EOF + +chmod +x install_gerrit.sh +``` + +### 运行安装脚本 + +```bash +# 直接运行(使用默认配置) +./install_gerrit.sh + +# 或者指定版本和端口 +GERRIT_VERSION=3.8.0 GERRIT_PORT=8080 ./install_gerrit.sh +``` + +--- + +## 使用指南 + +### 1. 首页访问与管理员账户创建 + +#### 访问 Gerrit + +1. 打开浏览器,访问 `http://你的服务器IP:8080` +2. 首次访问会看到 Gerrit 欢迎页面 + +#### 创建管理员账户 + +**方式一:开发模式(推荐个人使用)** + +如果使用 `DEVELOPMENT_BECOME_ANY_ACCOUNT` 认证方式: + +1. 点击右上角 "Sign In" +2. 输入任意用户名(例如:`admin`) +3. 点击 "Sign In" +4. **第一个登录的用户自动成为管理员** + +**方式二:HTTP 认证** + +1. 首次访问会提示创建账户 +2. 输入用户名和邮箱 +3. 设置密码 +4. 第一个账户自动成为管理员 + +#### 验证管理员权限 + +登录后,点击右上角用户名 → "Settings" → 左侧菜单应显示 "Administration" 选项。 + +### 2. 创建项目仓库 + +#### 在 Web 界面创建项目 + +1. 登录 Gerrit +2. 点击顶部菜单 "Projects" → "Create Project" +3. 填写项目信息: + - **Project Name**: `my-project`(例如) + - **Parent**: `All-Projects`(默认) + - **Description**: 项目描述(可选) + - **Submit Type**: `Merge If Necessary`(推荐) + - **Create initial empty commit**: 勾选(推荐) +4. 点击 "Create Project" + +#### 通过命令行创建项目 + +```bash +# 使用 SSH 连接 Gerrit +ssh -p 29418 admin@你的服务器IP gerrit create-project my-project + +# 或者使用 HTTP API(需要配置) +curl -X PUT \ + --user admin:密码 \ + http://你的服务器IP:8080/a/projects/my-project +``` + +### 3. 在本地 Git 配置与克隆仓库 + +#### 配置 Git 用户信息 + +```bash +# 设置全局用户信息 +git config --global user.name "Your Name" +git config --global user.email "your.email@example.com" + +# 配置 Gerrit 服务器 +git config --global review.你的服务器IP:29418.username admin +``` + +#### 克隆仓库 + +```bash +# 方式一:通过 SSH(推荐) +git clone ssh://admin@你的服务器IP:29418/my-project + +# 方式二:通过 HTTP +git clone http://你的服务器IP:8080/my-project +``` + +#### 配置 Git 远程仓库 + +如果已经有一个本地 Git 仓库,可以添加 Gerrit 作为远程仓库: + +```bash +cd your-existing-repo +git remote add gerrit ssh://admin@你的服务器IP:29418/my-project +# 或者 +git remote add gerrit http://你的服务器IP:8080/my-project +``` + +### 4. 开发提交流程 + +#### 标准提交流程(代码评审) + +```bash +# 1. 进入项目目录 +cd my-project + +# 2. 创建或切换到开发分支 +git checkout -b feature/new-feature + +# 3. 进行代码修改 +echo "# My Project" > README.md +git add README.md + +# 4. 提交更改 +git commit -m "Add README file" + +# 5. 推送到 Gerrit 进行评审 +# 关键:推送到 refs/for/master 分支(不是直接推送到 master) +git push origin HEAD:refs/for/master + +# 如果配置了 review 用户名,可以使用: +git push gerrit HEAD:refs/for/master +``` + +**重要说明**: +- `refs/for/master` 表示推送到 `master` 分支的评审队列 +- 推送后会生成一个 Change(变更),需要经过评审才能合并 +- 推送成功后,Gerrit 会返回 Change 的 URL + +#### 推送示例输出 + +``` +remote: Resolving deltas: 100% (1/1) +remote: Processing changes: refs: 1, new: 1 +remote: +remote: SUCCESS +remote: +remote: http://你的服务器IP:8080/c/my-project/+/1 [NEW] +remote: +To ssh://你的服务器IP:29418/my-project + * [new branch] HEAD -> refs/for/master +``` + +### 5. 在网页界面进行代码评审并合并 + +#### 查看变更 + +1. 推送成功后,复制 Gerrit 返回的 URL +2. 在浏览器中打开该 URL,或登录 Gerrit 后点击 "Changes" 查看 + +#### 代码评审流程 + +1. **查看变更详情** + - 点击 Change 进入详情页 + - 查看文件差异(Diff) + - 查看提交信息 + +2. **添加评论** + - 在代码行上点击,添加行内评论 + - 在页面底部添加整体评论 + +3. **评审投票** + - **Code-Review**: + - `+2` = 批准合并 + - `+1` = 看起来不错,但需要其他人批准 + - `-1` = 需要修改 + - `-2` = 拒绝 + - **Verified**: + - `+1` = 验证通过 + - `-1` = 验证失败 + +4. **提交者修改代码**(如果需要) + +```bash +# 修改代码后,追加提交(会自动关联到同一个 Change) +git add . +git commit --amend # 修改最后一次提交 +git push origin HEAD:refs/for/master +``` + +5. **合并变更** + +当满足以下条件时,变更可以自动合并: +- Code-Review: +2 +- Verified: +1(如果启用了 Verified 标签) + +或者管理员可以手动点击 "Submit" 按钮合并。 + +#### 合并后的操作 + +```bash +# 更新本地仓库 +cd my-project +git checkout master +git pull origin master + +# 删除已合并的特性分支 +git branch -d feature/new-feature +``` + +### 6. 常用技巧 + +#### 跳过评审直接推送(个人使用) + +如果只是个人使用,可以配置直接推送: + +```bash +# 方法一:推送到 refs/heads/master(绕过评审) +git push origin HEAD:refs/heads/master + +# 方法二:配置项目权限,允许直接推送 +# 在 Gerrit Web 界面: +# Projects → my-project → Access → Edit +# 添加权限: +# Reference: refs/heads/* +# Push: 允许你的用户组 +``` + +#### 修改端口 + +编辑配置文件: + +```bash +sudo nano /opt/gerrit/review_site/etc/gerrit.config +``` + +修改以下部分: + +```ini +[httpd] + listenUrl = http://*:9090/ # 修改为 9090 端口 + +[sshd] + listenAddress = *:29419 # 修改 SSH 端口为 29419 +``` + +重启服务: + +```bash +/opt/gerrit/review_site/bin/gerrit.sh restart +``` + +#### 备份数据 + +```bash +# 1. 停止 Gerrit 服务 +/opt/gerrit/review_site/bin/gerrit.sh stop + +# 2. 备份整个站点目录 +tar -czf gerrit-backup-$(date +%Y%m%d).tar.gz /opt/gerrit/review_site + +# 3. 或者只备份重要数据 +# 备份 Git 仓库 +tar -czf gerrit-git-$(date +%Y%m%d).tar.gz /opt/gerrit/review_site/git + +# 备份数据库(H2) +cp -r /opt/gerrit/review_site/db /backup/gerrit-db-$(date +%Y%m%d) + +# 备份配置 +cp -r /opt/gerrit/review_site/etc /backup/gerrit-etc-$(date +%Y%m%d) + +# 4. 启动服务 +/opt/gerrit/review_site/bin/gerrit.sh start +``` + +#### 恢复数据 + +```bash +# 1. 停止服务 +/opt/gerrit/review_site/bin/gerrit.sh stop + +# 2. 恢复备份 +tar -xzf gerrit-backup-20240101.tar.gz -C / + +# 3. 启动服务 +/opt/gerrit/review_site/bin/gerrit.sh start +``` + +#### 查看日志 + +```bash +# 实时查看日志 +tail -f /opt/gerrit/review_site/logs/gerrit.log + +# 查看错误日志 +tail -f /opt/gerrit/review_site/logs/error_log + +# 查看 SSH 日志 +tail -f /opt/gerrit/review_site/logs/sshd_log +``` + +#### 修改管理员账户 + +```bash +# 通过 SSH 命令添加管理员 +ssh -p 29418 admin@你的服务器IP gerrit set-members --add admin Administrators + +# 查看管理员组 +ssh -p 29418 admin@你的服务器IP gerrit gsql -c "SELECT account_id, full_name FROM accounts WHERE account_id IN (SELECT account_id FROM account_group_members WHERE group_id IN (SELECT group_id FROM account_groups WHERE name='Administrators'));" +``` + +#### 配置邮件通知(可选) + +编辑配置文件: + +```bash +sudo nano /opt/gerrit/review_site/etc/gerrit.config +``` + +添加邮件配置: + +```ini +[sendemail] + smtpServer = smtp.example.com + smtpServerPort = 587 + smtpEncryption = tls + smtpUser = your-email@example.com + smtpPass = your-password + from = Gerrit Code Review +``` + +#### 性能优化 + +对于个人使用,可以调整以下配置: + +```bash +sudo nano /opt/gerrit/review_site/etc/gerrit.config +``` + +```ini +[cache] + directory = cache + +[core] + packedGitOpenFiles = 128 + packedGitLimit = 100m + packedGitWindowSize = 8k +``` + +--- + +## 常用命令速查 + +### 服务管理 + +```bash +# 启动 +/opt/gerrit/review_site/bin/gerrit.sh start + +# 停止 +/opt/gerrit/review_site/bin/gerrit.sh stop + +# 重启 +/opt/gerrit/review_site/bin/gerrit.sh restart + +# 状态 +/opt/gerrit/review_site/bin/gerrit.sh status + +# 查看日志 +tail -f /opt/gerrit/review_site/logs/gerrit.log +``` + +### Git 操作 + +```bash +# 推送代码评审 +git push origin HEAD:refs/for/master + +# 直接推送(跳过评审) +git push origin HEAD:refs/heads/master + +# 修改提交后重新推送 +git commit --amend +git push origin HEAD:refs/for/master + +# 查看远程分支 +git ls-remote origin +``` + +### Gerrit 命令行工具 + +```bash +# 创建项目 +ssh -p 29418 admin@服务器 gerrit create-project my-project + +# 查看项目列表 +ssh -p 29418 admin@服务器 gerrit ls-projects + +# 查看用户信息 +ssh -p 29418 admin@服务器 gerrit query --format=JSON --current-patch-set change:1 +``` + +--- + +## 故障排查 + +### 问题 1: 无法访问 Web 界面 + +**检查项**: +1. 服务是否运行:`/opt/gerrit/review_site/bin/gerrit.sh status` +2. 端口是否被占用:`netstat -tlnp | grep 8080` +3. 防火墙是否开放端口: + ```bash + # Ubuntu/Debian + sudo ufw allow 8080/tcp + + # CentOS + sudo firewall-cmd --permanent --add-port=8080/tcp + sudo firewall-cmd --reload + ``` +4. 查看错误日志:`tail -f /opt/gerrit/review_site/logs/gerrit.log` + +### 问题 2: SSH 连接失败 + +**检查项**: +1. SSH 服务是否运行:检查 Gerrit 日志 +2. 端口是否正确:默认 29418 +3. 用户权限:确保用户已注册 + +### 问题 3: 推送失败 + +**常见错误**: +- `Permission denied`: 检查项目权限配置 +- `Branch refs/for/master not found`: 确保推送到 `refs/for/master` 而不是 `master` +- `Authentication failed`: 检查 SSH 密钥或 HTTP 认证配置 + +--- + +## 总结 + +恭喜!你已经完成了 Gerrit 的安装和基本配置。现在你可以: + +1. ✅ 通过 Web 界面管理代码评审 +2. ✅ 使用 Git 推送代码进行评审 +3. ✅ 在网页上进行代码审查和合并 +4. ✅ 管理项目仓库和用户权限 + +**下一步建议**: +- 配置邮件通知(如果需要) +- 设置项目权限规则 +- 安装常用插件(如:download-commands, replication) +- 配置定期备份 + +祝你使用愉快!如有问题,请查看 Gerrit 官方文档:https://www.gerritcodereview.com/ + diff --git a/Gerrit快速使用指南.md b/Gerrit快速使用指南.md new file mode 100644 index 0000000..c27ff95 --- /dev/null +++ b/Gerrit快速使用指南.md @@ -0,0 +1,331 @@ +# Gerrit 快速使用指南 + +## 🎉 恭喜!Gerrit 已成功安装并运行 + +您的 Gerrit 访问地址:**http://101.43.95.130:8080** + +--- + +## 第一步:创建管理员账户 + +### 1. 登录 Gerrit + +1. 打开浏览器,访问:`http://101.43.95.130:8080` +2. 点击右上角的 **"Sign In"** 按钮 +3. 在登录页面,输入任意用户名(例如:`admin`) +4. 点击 **"Sign In"** + +**重要**:由于配置了开发模式(`DEVELOPMENT_BECOME_ANY_ACCOUNT`),您可以使用任意用户名登录,无需密码。 + +### 2. 验证管理员权限 + +登录后,点击右上角用户名 → **"Settings"** → 左侧菜单应该显示 **"Administration"** 选项,说明您已经是管理员了。 + +--- + +## 第二步:创建第一个项目 + +### 方法一:通过 Web 界面创建(推荐) + +1. 登录后,点击顶部菜单 **"Projects"** → **"Create Project"** +2. 填写项目信息: + - **Project Name**: `my-project`(例如) + - **Parent**: `All-Projects`(默认) + - **Description**: 项目描述(可选) + - **Submit Type**: `Merge If Necessary`(推荐) + - **Create initial empty commit**: ✅ 勾选(推荐) +3. 点击 **"Create Project"** + +### 方法二:通过命令行创建 + +```bash +# 使用 SSH 连接 Gerrit +ssh -p 29418 admin@101.43.95.130 gerrit create-project my-project +``` + +--- + +## 第三步:配置本地 Git + +### 1. 配置 Git 用户信息 + +```bash +# 设置全局用户信息 +git config --global user.name "Your Name" +git config --global user.email "your.email@example.com" + +# 配置 Gerrit 服务器(替换 admin 为您的用户名) +git config --global review.101.43.95.130:29418.username admin +``` + +### 2. 克隆项目 + +```bash +# 方式一:通过 SSH(推荐) +git clone ssh://admin@101.43.95.130:29418/my-project + +# 方式二:通过 HTTP +git clone http://101.43.95.130:8080/my-project +``` + +如果使用 HTTP,首次克隆时可能需要输入用户名(密码留空,开发模式不需要密码)。 + +--- + +## 第四步:开发提交流程 + +### 1. 创建开发分支并修改代码 + +```bash +# 进入项目目录 +cd my-project + +# 创建特性分支 +git checkout -b feature/new-feature + +# 进行代码修改 +echo "# My Project" > README.md +git add README.md + +# 提交更改 +git commit -m "Add README file" +``` + +### 2. 推送到 Gerrit 进行评审 + +**关键**:推送到 `refs/for/master` 分支(不是直接推送到 `master`) + +```bash +# 推送到评审队列 +git push origin HEAD:refs/for/master +``` + +**推送成功后的输出示例**: +``` +remote: Resolving deltas: 100% (1/1) +remote: Processing changes: refs: 1, new: 1 +remote: +remote: SUCCESS +remote: +remote: http://101.43.95.130:8080/c/my-project/+/1 [NEW] +remote: +To ssh://admin@101.43.95.130:29418/my-project + * [new branch] HEAD -> refs/for/master +``` + +### 3. 查看变更 + +复制 Gerrit 返回的 URL(例如:`http://101.43.95.130:8080/c/my-project/+/1`),在浏览器中打开查看变更详情。 + +--- + +## 第五步:代码评审与合并 + +### 1. 在 Web 界面进行评审 + +1. **查看变更详情** + - 点击 Change 进入详情页 + - 查看文件差异(Diff) + - 查看提交信息 + +2. **添加评论** + - 在代码行上点击,添加行内评论 + - 在页面底部添加整体评论 + +3. **评审投票** + - **Code-Review**: + - `+2` = 批准合并 + - `+1` = 看起来不错,但需要其他人批准 + - `-1` = 需要修改 + - `-2` = 拒绝 + - **Verified**: + - `+1` = 验证通过 + - `-1` = 验证失败 + +4. **合并变更** + - 当满足以下条件时,变更可以自动合并: + - Code-Review: +2 + - Verified: +1(如果启用了 Verified 标签) + - 或者管理员可以手动点击 **"Submit"** 按钮合并 + +### 2. 修改代码后重新推送 + +如果需要根据评审意见修改代码: + +```bash +# 修改代码后,追加提交(会自动关联到同一个 Change) +git add . +git commit --amend # 修改最后一次提交 +git push origin HEAD:refs/for/master +``` + +### 3. 合并后的操作 + +```bash +# 更新本地仓库 +cd my-project +git checkout master +git pull origin master + +# 删除已合并的特性分支 +git branch -d feature/new-feature +``` + +--- + +## 常用操作 + +### 跳过评审直接推送(个人使用) + +如果只是个人使用,可以配置直接推送: + +```bash +# 方法一:推送到 refs/heads/master(绕过评审) +git push origin HEAD:refs/heads/master + +# 方法二:配置项目权限,允许直接推送 +# 在 Gerrit Web 界面: +# Projects → my-project → Access → Edit +# 添加权限: +# Reference: refs/heads/* +# Push: 允许您的用户组 +``` + +### 查看所有项目 + +```bash +# 通过 SSH +ssh -p 29418 admin@101.43.95.130 gerrit ls-projects + +# 在 Web 界面 +访问:http://101.43.95.130:8080/#/admin/projects/ +``` + +### 查看变更列表 + +```bash +# 通过 SSH +ssh -p 29418 admin@101.43.95.130 gerrit query --format=JSON change:1 + +# 在 Web 界面 +访问:http://101.43.95.130:8080/#/q/status:open +``` + +--- + +## 服务管理命令 + +```bash +# 进入 Gerrit 目录 +cd ~/gerrit_install/review_site + +# 启动服务 +JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + +# 停止服务 +bin/gerrit.sh stop + +# 重启服务 +bin/gerrit.sh restart + +# 查看状态 +bin/gerrit.sh status + +# 查看日志 +tail -f logs/gerrit.log +tail -f logs/error_log +``` + +--- + +## 常见问题 + +### 1. 无法访问 Web 界面 + +**检查项**: +- 服务是否运行:`cd ~/gerrit_install/review_site && bin/gerrit.sh status` +- 端口是否被占用:`netstat -tlnp | grep 8080` +- 防火墙是否开放端口: + ```bash + sudo firewall-cmd --permanent --add-port=8080/tcp + sudo firewall-cmd --reload + ``` + +### 2. SSH 连接失败 + +**检查项**: +- SSH 服务是否运行:检查 Gerrit 日志 +- 端口是否正确:默认 29418 +- 用户权限:确保用户已注册 + +### 3. 推送失败 + +**常见错误**: +- `Permission denied`: 检查项目权限配置 +- `Branch refs/for/master not found`: 确保推送到 `refs/for/master` 而不是 `master` +- `Authentication failed`: 检查 SSH 密钥或 HTTP 认证配置 + +### 4. 忘记管理员账户 + +在开发模式下,第一个登录的用户自动成为管理员。如果需要添加其他管理员: + +```bash +ssh -p 29418 admin@101.43.95.130 gerrit set-members --add username Administrators +``` + +--- + +## 下一步建议 + +1. ✅ **创建项目**:创建您的第一个项目仓库 +2. ✅ **配置 Git**:在本地配置 Git 用户信息 +3. ✅ **推送代码**:尝试推送代码进行评审 +4. 📧 **配置邮件通知**(可选):如果需要邮件通知功能 +5. 🔒 **设置项目权限**:根据需求配置项目访问权限 +6. 📦 **安装插件**:根据需要安装常用插件 + +--- + +## 快速参考 + +### Git 命令速查 + +```bash +# 推送代码评审 +git push origin HEAD:refs/for/master + +# 直接推送(跳过评审) +git push origin HEAD:refs/heads/master + +# 修改提交后重新推送 +git commit --amend +git push origin HEAD:refs/for/master + +# 查看远程分支 +git ls-remote origin +``` + +### Gerrit 命令行工具 + +```bash +# 创建项目 +ssh -p 29418 admin@101.43.95.130 gerrit create-project project-name + +# 查看项目列表 +ssh -p 29418 admin@101.43.95.130 gerrit ls-projects + +# 查看变更 +ssh -p 29418 admin@101.43.95.130 gerrit query --format=JSON change:1 +``` + +--- + +## 需要帮助? + +- 📖 查看完整安装指南:`Gerrit安装使用指南.md` +- 🌐 访问 Gerrit 官方文档:https://www.gerritcodereview.com/ +- 📝 查看配置文件:`~/gerrit_install/review_site/etc/gerrit.config` + +祝您使用愉快!🎉 + + diff --git a/HTTP认证问题解决方案.md b/HTTP认证问题解决方案.md new file mode 100644 index 0000000..718523f --- /dev/null +++ b/HTTP认证问题解决方案.md @@ -0,0 +1,113 @@ +# HTTP 认证问题解决方案 + +## 问题现象 + +``` +remote: Unauthorized +fatal: Authentication failed for 'http://101.43.95.130:8080/test-project/' +``` + +## 问题原因 + +在 `DEVELOPMENT_BECOME_ANY_ACCOUNT` 模式下,HTTP 认证可能需要特殊处理。 + +## 解决方案 + +### 方案一:配置 Git 凭证存储(推荐) + +在您的本地电脑上执行: + +```bash +cd /d/ttt/test-project + +# 配置 Git 凭证存储 +git config credential.helper store + +# 配置用户名 +git config credential.http://101.43.95.130:8080.username renjianbo + +# 或者全局配置 +git config --global credential.helper store +git config --global credential.http://101.43.95.130:8080.username renjianbo + +# 重新推送 +git push origin HEAD:refs/for/master +``` + +当提示输入密码时,直接按回车(留空)。 + +### 方案二:在 URL 中使用空密码 + +```bash +cd /d/ttt/test-project + +# 修改远程 URL,包含用户名和空密码 +git remote set-url origin http://renjianbo:@101.43.95.130:8080/test-project + +# 推送 +git push origin HEAD:refs/for/master +``` + +### 方案三:使用 Git Credential Manager + +如果使用 Windows Git Credential Manager: + +```bash +cd /d/ttt/test-project + +# 清除已保存的凭证 +git credential reject </dev/null || true + +# 添加凭证(格式:protocol://username:password@host:port) +echo "http://renjianbo:@101.43.95.130:8080" >> ~/.git-credentials + +# 配置 Git 使用凭证文件 +git config --global credential.helper store + +# 推送 +cd /d/ttt/test-project +git push origin HEAD:refs/for/master +``` + +## 快速修复(最简单) + +执行以下命令: + +```bash +cd /d/ttt/test-project + +# 方法 1:配置凭证存储和用户名 +git config credential.helper store +git config credential.http://101.43.95.130:8080.username renjianbo + +# 方法 2:修改 URL 包含空密码 +git remote set-url origin http://renjianbo:@101.43.95.130:8080/test-project + +# 推送 +git push origin HEAD:refs/for/master +``` + +## 如果还是不行 + +可能需要检查服务器端的 HTTP 认证配置。请告诉我具体的错误信息,我会继续排查。 + diff --git a/README_执行说明.md b/README_执行说明.md new file mode 100644 index 0000000..bf1c9eb --- /dev/null +++ b/README_执行说明.md @@ -0,0 +1,81 @@ +# Gerrit 重新安装 - 执行说明 + +## 🚀 快速执行(推荐) + +由于终端环境限制,请手动执行以下命令: + +```bash +cd /home/renjianbo/gerrit +chmod +x 一键重新安装.sh +./一键重新安装.sh +``` + +或者直接执行一行命令: + +```bash +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh stop 2>/dev/null; pkill -9 -f gerrit.war 2>/dev/null; cd /home/renjianbo/gerrit_install && rm -rf review_site && export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 && export PATH=$JAVA_HOME/bin:$PATH && java -jar gerrit-3.9.0.war init -d review_site --batch --no-auto-start -D gerrit.canonicalWebUrl=http://101.43.95.130:8080/ --install-plugin=download-commands --install-plugin=replication --install-plugin=reviewnotes && cd review_site && cp bin/gerrit.sh bin/gerrit.sh.bak && sed -i "2i export JAVA_HOME=/usr/local/java/jdk-17.0.12+7\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh && bin/gerrit.sh start && sleep 5 && echo "✅ 完成!访问 http://101.43.95.130:8080" +``` + +## 📋 已创建的脚本 + +1. **一键重新安装.sh** - 单行命令脚本(最简单) +2. **完全重新安装Gerrit.sh** - 完整脚本(带详细输出) +3. **quick_reinstall.sh** - 快速脚本 +4. **reinstall_gerrit.py** - Python 脚本 + +## ✅ 安装完成后 + +1. **清除浏览器 Cookie 和缓存**(重要!) + - 按 `Ctrl+Shift+Delete` + - 清除所有 Cookie 和缓存 + +2. **访问 Gerrit** + - 打开浏览器 + - 访问:`http://101.43.95.130:8080` + +3. **创建管理员账号** + - 点击 "Sign In" + - 输入新用户名(例如:`admin`) + - **第一个登录的用户将自动成为管理员** + +4. **验证** + - 访问 Settings 页面,应该能看到 "Administration" 选项 + - 访问 Repositories 页面,应该能看到 "CREATE NEW" 按钮 + +## 🔍 如果执行失败 + +查看错误信息,或分步执行: + +```bash +# 步骤 1: 停止服务 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +pkill -9 -f gerrit.war + +# 步骤 2: 删除旧安装 +cd /home/renjianbo/gerrit_install +rm -rf review_site + +# 步骤 3: 重新初始化 +export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 +export PATH=$JAVA_HOME/bin:$PATH +java -jar gerrit-3.9.0.war init -d review_site --batch --no-auto-start -D gerrit.canonicalWebUrl=http://101.43.95.130:8080/ --install-plugin=download-commands --install-plugin=replication --install-plugin=reviewnotes + +# 步骤 4: 配置启动脚本 +cd review_site +cp bin/gerrit.sh bin/gerrit.sh.bak +sed -i "2i export JAVA_HOME=/usr/local/java/jdk-17.0.12+7\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh + +# 步骤 5: 启动服务 +bin/gerrit.sh start +sleep 5 +bin/gerrit.sh status +``` + +## 📞 需要帮助? + +如果遇到问题,请提供: +1. 执行的命令 +2. 错误信息 +3. `bin/gerrit.sh status` 的输出 + diff --git a/SSH公钥添加说明.md b/SSH公钥添加说明.md new file mode 100644 index 0000000..a8c6960 --- /dev/null +++ b/SSH公钥添加说明.md @@ -0,0 +1,45 @@ +# SSH 公钥添加说明 + +## 您的 SSH 公钥 + +请复制以下完整内容(从 `ssh-rsa` 开始到邮箱结束): + +``` +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDfjHZN+QcoRiE6yzSTi15/6iwa7sHQ6D0hlnnGFmzBiEhix+oPhpLM18SM6qKiTSC3KEIsAtjRMndWFOO/PnSsDtLWnBDxg8HWn1YhjDCz5VaCmMEA/Com8FGQPtSliI+6F+v1OOeaviL7V0iJcvZVPuIUrruNTfsZWOHrFhBrEeNwtrxwXcB3N5Hzw1/2c3AZ//5vPUf63FU0GNnNO8K2dTIJqfe80kprJtWXHGaj2OsV1T065LL24GYe65Hfngo8jf9HL1O1+ZUfNWrgJXKnr6U4cPOwpmuxcVa85OlXpxYOxcXWU20fu/ZgxzcvFYnONfnj2pI10j5ix1M2Vf1Ken5GP0WEHJUYUQ4bILbf1jKZRWqLgh0/nyAPikpcaYboqy3R4ZZjl+dC1JCXCzkmT69AiPzrvBWjlz2ygUwr45xoq7YJqLLjtFYJXf2KTgWczpJyDtWb4gXPJV1GAgaSHOrsswa3vlIQT3aOr0hmK7rKNXEcoySm1QV4GHcalfAybKvz9O9eXWxOlAY1JSzLA6fy8ziB3n+8wyIe44Pomro79m5w4R+C0XbrJ4owEzfnAAe1AcaIgQ4ik78idug0ZFQZ4s1YNYS/oQfDS8ZP5TanAC611ouO3XG1SUn6SkkKzG8ThQDr+igXFnShUrgYXKjLxifAj4wfl/wmg2NhXQ== your_email@example.com +``` + +## 添加步骤 + +1. **打开浏览器**,访问:`http://101.43.95.130:8080/#/settings/ssh-keys` + +2. **在 "New SSH key" 输入框中**,粘贴上面的完整公钥 + +3. **点击 "Add"** 按钮保存 + +4. **公钥添加成功后**,会显示在列表中,状态为 "Valid" + +## 防火墙问题 + +SSH 连接超时通常是防火墙问题。我已经尝试在服务器端开放 29418 端口。 + +如果还是无法连接,可能需要: +- 检查云服务器的安全组规则(如果是云服务器) +- 检查服务器的 iptables 规则 +- 或者暂时使用 HTTP 方式推送代码 + +## 临时使用 HTTP 推送 + +如果 SSH 暂时无法修复,可以继续使用 HTTP: + +```bash +cd /d/ttt/test-project + +# 确保远程 URL 包含用户名 +git remote set-url origin http://renjianbo@101.43.95.130:8080/test-project + +# 推送代码 +git push origin HEAD:refs/for/master +``` + +当提示输入密码时,直接按回车(留空)即可。 + diff --git a/SSH公钥认证问题排查.md b/SSH公钥认证问题排查.md new file mode 100644 index 0000000..30d5787 --- /dev/null +++ b/SSH公钥认证问题排查.md @@ -0,0 +1,100 @@ +# SSH 公钥认证问题排查 + +## 问题现象 + +``` +renjianbo@101.43.95.130: Permission denied (publickey). +fatal: Could not read from remote repository. +``` + +## 好消息 + +✅ **SSH 连接已建立**(不再是连接超时),说明防火墙已修复! + +❌ **公钥认证失败**,需要检查公钥配置。 + +## 可能的原因 + +1. **公钥没有正确添加到 Gerrit** +2. **公钥格式问题** +3. **用户名不匹配** +4. **SSH 密钥路径问题** + +## 解决方案 + +### 步骤 1:确认公钥已添加到 Gerrit + +1. **打开浏览器**,访问:`http://101.43.95.130:8080/#/settings/ssh-keys` +2. **检查**您的公钥是否在列表中,状态为 "Valid" +3. **如果没有**,请添加您的完整公钥: + ``` + ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDfjHZN+QcoRiE6yzSTi15/6iwa7sHQ6D0hlnnGFmzBiEhix+oPhpLM18SM6qKiTSC3KEIsAtjRMndWFOO/PnSsDtLWnBDxg8HWn1YhjDCz5VaCmMEA/Com8FGQPtSliI+6F+v1OOeaviL7V0iJcvZVPuIUrruNTfsZWOHrFhBrEeNwtrxwXcB3N5Hzw1/2c3AZ//5vPUf63FU0GNnNO8K2dTIJqfe80kprJtWXHGaj2OsV1T065LL24GYe65Hfngo8jf9HL1O1+ZUfNWrgJXKnr6U4cPOwpmuxcVa85OlXpxYOxcXWU20fu/ZgxzcvFYnONfnj2pI10j5ix1M2Vf1Ken5GP0WEHJUYUQ4bILbf1jKZRWqLgh0/nyAPikpcaYboqy3R4ZZjl+dC1JCXCzkmT69AiPzrvBWjlz2ygUwr45xoq7YJqLLjtFYJXf2KTgWczpJyDtWb4gXPJV1GAgaSHOrsswa3vlIQT3aOr0hmK7rKNXEcoySm1QV4GHcalfAybKvz9O9eXWxOlAY1JSzLA6fy8ziB3n+8wyIe44Pomro79m5w4R+C0XbrJ4owEzfnAAe1AcaIgQ4ik78idug0ZFQZ4s1YNYS/oQfDS8ZP5TanAC611ouO3XG1SUn6SkkKzG8ThQDr+igXFnShUrgYXKjLxifAj4wfl/wmg2NhXQ== your_email@example.com + ``` + +### 步骤 2:检查 SSH 密钥路径 + +在您的本地电脑上执行: + +```bash +# 检查 SSH 密钥是否存在 +ls -la ~/.ssh/id_rsa* + +# 如果密钥文件不存在,重新生成 +ssh-keygen -t rsa -b 4096 -C "your_email@example.com" +``` + +### 步骤 3:使用 SSH 代理(如果密钥有密码) + +如果您的 SSH 密钥设置了密码,需要启动 SSH 代理: + +```bash +# 启动 SSH 代理 +eval $(ssh-agent -s) + +# 添加密钥 +ssh-add ~/.ssh/id_rsa +``` + +### 步骤 4:使用详细模式测试连接 + +```bash +# 使用详细模式查看具体错误 +ssh -v -p 29418 renjianbo@101.43.95.130 gerrit version +``` + +查看输出中的错误信息,特别是: +- 是否尝试使用正确的密钥文件 +- 服务器是否接受密钥 + +### 步骤 5:检查用户名 + +确保 Gerrit 中的用户名是 `renjianbo`。可以访问: +`http://101.43.95.130:8080/#/settings/profile` + +查看您的 Username。 + +### 步骤 6:尝试使用 Account ID + +如果用户名有问题,可以尝试使用 Account ID: + +```bash +# 查看您的 Account ID(在 Settings → Profile 页面) +# 假设是 1000001,使用: +ssh -p 29418 1000001@101.43.95.130 gerrit version +``` + +## 快速检查清单 + +- [ ] 公钥已添加到 Gerrit(`http://101.43.95.130:8080/#/settings/ssh-keys`) +- [ ] 公钥状态显示为 "Valid" +- [ ] SSH 密钥文件存在(`~/.ssh/id_rsa`) +- [ ] 用户名正确(`renjianbo`) +- [ ] 防火墙已开放 29418 端口(✅ 已完成) + +## 如果还是不行 + +请提供: +1. `ssh -v -p 29418 renjianbo@101.43.95.130 gerrit version` 的完整输出 +2. Gerrit SSH Keys 页面的截图 +3. 您的 Gerrit Username(Settings → Profile) + diff --git a/SSH密钥配置指南.md b/SSH密钥配置指南.md new file mode 100644 index 0000000..e2a1a60 --- /dev/null +++ b/SSH密钥配置指南.md @@ -0,0 +1,96 @@ +# SSH 密钥配置指南 + +## ✅ SSH 密钥已生成 + +您的 SSH 密钥已保存在: +- 私钥:`/c/Users/Administrator/.ssh/id_rsa` +- 公钥:`/c/Users/Administrator/.ssh/id_rsa.pub` + +## 下一步:将公钥添加到 Gerrit + +### 步骤 1:查看公钥内容 + +在 Git Bash 中执行: + +```bash +cat ~/.ssh/id_rsa.pub +``` + +或者: + +```bash +type ~/.ssh/id_rsa.pub +``` + +### 步骤 2:复制公钥 + +复制输出的完整内容(从 `ssh-rsa` 开始到邮箱结束的整行),例如: +``` +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD... your_email@example.com +``` + +### 步骤 3:添加到 Gerrit + +1. **打开浏览器**,访问:`http://101.43.95.130:8080/#/settings/ssh-keys` +2. **粘贴公钥**到 "SSH Public Keys" 页面的输入框 +3. **点击 "Add"** 按钮保存 + +### 步骤 4:测试 SSH 连接 + +在 Git Bash 中执行: + +```bash +ssh -p 29418 renjianbo@101.43.95.130 gerrit version +``` + +如果连接成功,会显示 Gerrit 版本信息。 + +### 步骤 5:使用 SSH 推送代码 + +```bash +cd /d/ttt/test-project + +# 删除当前的 HTTP 远程仓库 +git remote remove origin + +# 添加 SSH 远程仓库 +git remote add origin ssh://renjianbo@101.43.95.130:29418/test-project + +# 查看远程仓库配置 +git remote -v + +# 推送代码 +git push origin HEAD:refs/for/master +``` + +## 如果 SSH 连接失败 + +### 检查防火墙 + +确保服务器的 29418 端口已开放。 + +### 检查 SSH 服务 + +在服务器上检查 Gerrit SSH 服务是否运行: + +```bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh status +``` + +### 查看 SSH 日志 + +```bash +cd /home/renjianbo/gerrit_install/review_site +tail -f logs/sshd_log +``` + +## 完成后的操作 + +SSH 配置完成后,您就可以: +- ✅ 使用 SSH 克隆项目 +- ✅ 使用 SSH 推送代码 +- ✅ 使用 SSH 执行 Gerrit 命令 + +SSH 方式比 HTTP 更可靠,推荐使用! + diff --git a/SSH密钥配置步骤.txt b/SSH密钥配置步骤.txt new file mode 100644 index 0000000..34f8e1f --- /dev/null +++ b/SSH密钥配置步骤.txt @@ -0,0 +1,33 @@ +# SSH 密钥配置步骤 - 快速参考 + +## 在 Git Bash 中执行: + +# 1. 生成 SSH 密钥 +ssh-keygen -t ed25519 -C "admin@example.com" +# 按回车使用默认路径,可以设置密码或留空 + +# 2. 查看公钥(复制全部内容) +cat ~/.ssh/id_ed25519.pub + +# 3. 将公钥添加到 Gerrit: +# - 访问: http://101.43.95.130:8080/#/settings/ssh-keys +# - 点击 "Add Key" +# - 粘贴公钥内容 +# - 保存 + +# 4. 删除旧的 known_hosts 条目 +ssh-keygen -R [101.43.95.130]:29418 + +# 5. 测试 SSH 连接 +ssh -p 29418 admin@101.43.95.130 +# 输入 yes 接受新密钥 +# 输入 exit 退出 + +# 6. 配置 Git 使用 SSH +cd /d/zhini/zhini_im +git remote remove gerrit +git remote add gerrit ssh://admin@101.43.95.130:29418/zhini_im + +# 7. 推送代码 +git push gerrit HEAD:refs/heads/master + diff --git a/SSH推送完整指南.md b/SSH推送完整指南.md new file mode 100644 index 0000000..2b2df31 --- /dev/null +++ b/SSH推送完整指南.md @@ -0,0 +1,110 @@ +# SSH 推送完整指南 + +## ✅ 您的 SSH 公钥 + +您的 SSH 公钥格式正确: +``` +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDfjHZN+QcoRiE6yzSTi15/6iwa7sHQ6D0hlnnGFmzBiEhix+oPhpLM18SM6qKiTSC3KEIsAtjRMndWFOO/PnSsDtLWnBDxg8HWn1YhjDCz5VaCmMEA/Com8FGQPtSliI+6F+v1OOeaviL7V0iJcvZVPuIUrruNTfsZWOHrFhBrEeNwtrxwXcB3N5Hzw1/2c3AZ//5vPUf63FU0GNnNO8K2dTIJqfe80kprJtWXHGaj2OsV1T065LL24GYe65Hfngo8jf9HL1O1+ZUfNWrgJXKnr6U4cPOwpmuxcVa85OlXpxYOxcXWU20fu/ZgxzcvFYnONfnj2pI10j5ix1M2Vf1Ken5GP0WEHJUYUQ4bILbf1jKZRWqLgh0/nyAPikpcaYboqy3R4ZZjl+dC1JCXCzkmT69AiPzrvBWjlz2ygUwr45xoq7YJqLLjtFYJXf2KTgWczpJyDtWb4gXPJV1GAgaSHOrsswa3vlIQT3aOr0hmK7rKNXEcoySm1QV4GHcalfAybKvz9O9eXWxOlAY1JSzLA6fy8ziB3n+8wyIe44Pomro79m5w4R+C0XbrJ4owEzfnAAe1AcaIgQ4ik78idug0ZFQZ4s1YNYS/oQfDS8ZP5TanAC611ouO3XG1SUn6SkkKzG8ThQDr+igXFnShUrgYXKjLxifAj4wfl/wmg2NhXQ== your_email@example.com +``` + +## 步骤 1:确保公钥已添加到 Gerrit + +1. **打开浏览器**,访问:`http://101.43.95.130:8080/#/settings/ssh-keys` +2. **检查**您的公钥是否已经在列表中 +3. **如果没有**,请添加: + - 在 "New SSH key" 输入框中粘贴上面的完整公钥 + - 点击 "Add" 保存 + +## 步骤 2:修复防火墙(服务器端) + +SSH 连接超时通常是防火墙问题。如果您有服务器管理员权限,执行: + +```bash +# 在服务器上执行 +sudo firewall-cmd --permanent --add-port=29418/tcp +sudo firewall-cmd --reload + +# 验证 +sudo firewall-cmd --list-ports | grep 29418 +``` + +**如果是云服务器**,还需要在云控制台的安全组中开放 29418 端口。 + +## 步骤 3:测试 SSH 连接 + +在您的本地电脑上执行: + +```bash +# 测试 SSH 连接 +ssh -p 29418 renjianbo@101.43.95.130 gerrit version +``` + +如果连接成功,会显示 Gerrit 版本信息。 + +## 步骤 4:使用 SSH 推送代码 + +```bash +cd /d/ttt/test-project + +# 删除当前的 HTTP 远程仓库 +git remote remove origin + +# 添加 SSH 远程仓库 +git remote add origin ssh://renjianbo@101.43.95.130:29418/test-project + +# 查看远程仓库配置(确认) +git remote -v + +# 推送代码 +git push origin HEAD:refs/for/master +``` + +## 如果 SSH 连接还是超时 + +### 检查云服务器安全组 + +如果是云服务器(如阿里云、腾讯云等),需要在云控制台配置: + +1. **登录云控制台** +2. **找到安全组配置** +3. **添加入站规则**: + - 协议:TCP + - 端口:29418 + - 源:0.0.0.0/0(或您的 IP) +4. **保存规则** + +### 临时使用 HTTP(如果 SSH 无法修复) + +如果 SSH 暂时无法修复,可以尝试 HTTP(我已经添加了 `gitBasicAuth = true`): + +```bash +cd /d/ttt/test-project + +# 清除凭证 +git credential reject <> ~/.ssh/config << 'EOF' +Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa +EOF + +# 测试连接 +ssh -p 29418 renjianbo@101.43.95.130 gerrit version + +# 如果成功,推送代码 +cd /d/ttt/test-project +git push origin HEAD:refs/for/master +``` + +## 如果还是不行 + +如果方案一不行,尝试方案三(生成 ed25519 密钥),通常兼容性更好。 + diff --git a/SSH连接问题排查.md b/SSH连接问题排查.md new file mode 100644 index 0000000..e0f20bd --- /dev/null +++ b/SSH连接问题排查.md @@ -0,0 +1,92 @@ +# SSH 连接问题排查 + +## 问题现象 + +``` +ssh: connect to host 101.43.95.130 port 29418: Connection timed out +``` + +## 可能的原因 + +1. **防火墙阻止了 29418 端口** +2. **Gerrit SSH 服务未正常启动** +3. **网络路由问题** + +## 解决方案 + +### 步骤 1:先添加 SSH 公钥到 Gerrit + +即使 SSH 连接暂时有问题,也可以先添加公钥: + +1. **在浏览器中**,访问:`http://101.43.95.130:8080/#/settings/ssh-keys` +2. **在 "New SSH key" 输入框中**,粘贴您的公钥: + ``` + ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDfjHZN+QcoRiE6yzSTi15/6iwa7sHQ6D0hlnnGFmzBiEhix+oPhpLM18SM6qKiTSC3KEIsAtjRMndWFOO/PnSsDtLWnBDxg8HWn1YhjDCz5VaCmMEA/Com8FGQPtSliI+6F+v1OOeaviL7V0iJcvZVPuIUrruNTfsZWOHrFhBrEeNwtrxwXcB3N5Hzw1/2c3AZ//5vPUf63FU0GNnNO8K2dTIJqfe80kprJtWXHGaj2OsV1T065LL24GYe65Hfngo8jf9HL1O1+ZUfNWrgJXKnr6U4cPOwpmuxcVa85OlXpxYOxcXWU20fu/ZgxzcvFYnONfnj2pI10j5ix1M2Vf1Ken5GP0WEHJUYUQ4bILbf1jKZRWqLgh0/nyAPikpcaYboqy3R4ZZjl+dC1JCXCzkmT69AiPzrvBWjlz2ygUwr45xoq7YJqLLjtFYJXf2KTgWczpJyDtWb4gXPJV1GAgaSHOrsswa3vlIQT3aOr0hmK7rKNXEcoySm1QV4GHcalfAybKvz9O9eXWxOlAY1JSzLA6fy8ziB3n+8wyIe44Pomro79m5w4R+C0XbrJ4owEzfnAAe1AcaIgQ4ik78idug0ZFQZ4s1YNYS/oQfDS8ZP5TanAC611ouO3XG1SUn6SkkKzG8ThQDr+igXFnShUrgYXKjLxifAj4wfl/wmg2NhXQ== your_email@example.com + ``` +3. **点击 "Add"** 按钮保存 + +### 步骤 2:检查服务器端 SSH 服务 + +在服务器上检查: + +```bash +# 检查 Gerrit SSH 服务状态 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh status + +# 检查端口是否监听 +netstat -tlnp | grep 29418 +# 或 +ss -tlnp | grep 29418 +``` + +### 步骤 3:检查防火墙 + +如果是云服务器,需要确保防火墙开放了 29418 端口: + +```bash +# CentOS 7 +sudo firewall-cmd --permanent --add-port=29418/tcp +sudo firewall-cmd --reload + +# 或者检查防火墙状态 +sudo firewall-cmd --list-ports +``` + +### 步骤 4:临时使用 HTTP 推送(如果 SSH 无法修复) + +如果 SSH 连接问题暂时无法解决,可以继续使用 HTTP 方式: + +```bash +cd /d/ttt/test-project + +# 确保远程 URL 包含用户名 +git remote set-url origin http://renjianbo@101.43.95.130:8080/test-project + +# 推送代码 +git push origin HEAD:refs/for/master +``` + +## 当前建议 + +1. **先添加 SSH 公钥**到 Gerrit(即使连接有问题,公钥可以先保存) +2. **检查服务器防火墙**是否开放了 29418 端口 +3. **如果 SSH 暂时无法修复**,继续使用 HTTP 方式推送代码 + +## 需要服务器端操作 + +如果您有服务器访问权限,请执行: + +```bash +# 检查防火墙 +sudo firewall-cmd --list-ports + +# 如果 29418 不在列表中,添加它 +sudo firewall-cmd --permanent --add-port=29418/tcp +sudo firewall-cmd --reload + +# 检查 Gerrit SSH 服务 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh status +``` + diff --git a/SSH配置成功-继续推送.md b/SSH配置成功-继续推送.md new file mode 100644 index 0000000..efc7e46 --- /dev/null +++ b/SSH配置成功-继续推送.md @@ -0,0 +1,150 @@ +# SSH 配置成功 - 继续推送代码 + +## ✅ SSH 连接已成功 + +您已经成功连接到 Gerrit,现在可以配置 Git 并推送代码了。 + +## 下一步操作 + +### 在 Git Bash 中执行: + +```bash +# 1. 确保在项目目录 +cd /d/zhini/zhini_im + +# 2. 删除旧的远程仓库(如果存在) +git remote remove gerrit 2>/dev/null || true + +# 3. 添加 SSH 远程仓库 +git remote add gerrit ssh://admin@101.43.95.130:29418/zhini_im + +# 4. 验证远程仓库配置 +git remote -v + +# 5. 查看当前分支 +git branch + +# 6. 提交所有更改(如果有未提交的) +git add . +git commit -m "Update code before push to Gerrit" + +# 7. 推送代码到 Gerrit +# 方式 A:直接推送到主分支(首次上传) +git push gerrit master:refs/heads/master + +# 或方式 B:推送到评审队列(推荐用于后续更新) +git push gerrit master:refs/for/master +``` + +## 推送方式说明 + +### 直接推送(首次上传) + +```bash +git push gerrit master:refs/heads/master +``` +- ✅ 直接更新主分支 +- ✅ 适用于首次上传 +- ❌ 跳过代码评审流程 + +### 推送到评审队列(推荐) + +```bash +git push gerrit master:refs/for/master +``` +- ✅ 进入代码评审流程 +- ✅ 需要评审后才能合并 +- ✅ 符合 Gerrit 工作流程 +- 推荐用于:日常开发、团队协作 + +## 如果当前分支不是 master + +如果您的当前分支是 `rjb_dev` 或其他分支: + +```bash +# 查看当前分支 +git branch + +# 推送当前分支到 master +git push gerrit rjb_dev:refs/heads/master + +# 或推送到评审队列 +git push gerrit rjb_dev:refs/for/master +``` + +## 验证推送 + +推送成功后: + +1. **访问项目页面**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im + ``` + +2. **查看变更**: + ``` + http://101.43.95.130:8080/#/q/project:zhini_im + ``` + +3. **浏览代码**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im,general + ``` + +## 常见问题 + +### Q: 推送时提示 "remote rejected"? + +**A:** 可能的原因: +1. 项目不存在 → 先在 Gerrit 创建项目 +2. 没有推送权限 → 检查项目权限配置 +3. 分支保护 → 使用 `refs/for/master` 推送到评审队列 + +### Q: 如何查看远程仓库? + +```bash +git remote -v +``` + +应该显示: +``` +gerrit ssh://admin@101.43.95.130:29418/zhini_im (fetch) +gerrit ssh://admin@101.43.95.130:29418/zhini_im (push) +``` + +### Q: 如何测试 SSH 连接? + +```bash +# 测试连接并查看 Gerrit 版本 +ssh -p 29418 admin@101.43.95.130 gerrit version + +# 应该显示:gerrit version 3.9.0 +``` + +## 后续操作 + +### 日常开发流程 + +```bash +# 1. 修改代码 +# 2. 提交更改 +git add . +git commit -m "描述您的更改" + +# 3. 推送到评审队列 +git push gerrit master:refs/for/master + +# 4. 在 Gerrit Web 界面进行评审 +# 5. 评审通过后,代码会自动合并 +``` + +### 克隆项目(其他团队成员) + +```bash +# 使用 SSH +git clone ssh://admin@101.43.95.130:29418/zhini_im + +# 或使用 HTTP +git clone http://101.43.95.130:8080/zhini_im +``` + diff --git a/SSH配置详细步骤.md b/SSH配置详细步骤.md new file mode 100644 index 0000000..a563ec4 --- /dev/null +++ b/SSH配置详细步骤.md @@ -0,0 +1,159 @@ +# SSH 配置详细步骤 + +## 问题 + +SSH 签名算法不匹配,需要启用兼容的算法。 + +## 解决方案:创建 SSH 配置文件 + +### 步骤 1:检查配置文件是否存在 + +在 Git Bash 中执行: + +```bash +# 检查配置文件是否存在 +ls -la ~/.ssh/config + +# 如果文件不存在,会显示 "No such file or directory" +``` + +### 步骤 2:创建配置文件 + +```bash +# 创建配置文件 +touch ~/.ssh/config + +# 设置正确的权限(重要!) +chmod 600 ~/.ssh/config +``` + +### 步骤 3:编辑配置文件 + +使用文本编辑器打开配置文件: + +```bash +# 使用 notepad(Windows) +notepad ~/.ssh/config + +# 或使用 nano(Git Bash) +nano ~/.ssh/config + +# 或使用 vim(Git Bash) +vim ~/.ssh/config +``` + +### 步骤 4:添加配置内容 + +在文件中添加以下内容(如果文件已有内容,追加到文件末尾): + +``` +Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa +``` + +**重要**: +- `Host` 后面是服务器 IP 或域名 +- `Port` 后面是 SSH 端口(29418) +- 每行前面有 4 个空格或 1 个 Tab(保持缩进) + +### 步骤 5:保存文件 + +- 如果使用 notepad:`Ctrl+S` 保存,然后关闭 +- 如果使用 nano:`Ctrl+O` 保存,`Enter` 确认,`Ctrl+X` 退出 +- 如果使用 vim:按 `i` 进入插入模式,编辑后按 `Esc`,然后输入 `:wq` 保存退出 + +### 步骤 6:验证配置 + +```bash +# 查看配置文件内容 +cat ~/.ssh/config +``` + +应该显示: +``` +Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa +``` + +### 步骤 7:测试连接 + +```bash +# 测试 SSH 连接 +ssh -p 29418 renjianbo@101.43.95.130 gerrit version +``` + +如果成功,会显示 Gerrit 版本信息,例如: +``` +gerrit version 3.3.8 +``` + +### 步骤 8:推送代码 + +```bash +cd /d/ttt/test-project +git push origin HEAD:refs/for/master +``` + +## 如果还是不行 + +### 方法 A:使用命令行参数(临时) + +```bash +# 测试连接 +ssh -o PubkeyAcceptedKeyTypes=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa -p 29418 renjianbo@101.43.95.130 gerrit version + +# 推送代码 +GIT_SSH_COMMAND="ssh -o PubkeyAcceptedKeyTypes=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa" git push origin HEAD:refs/for/master +``` + +### 方法 B:检查公钥是否正确添加 + +1. 访问:`http://101.43.95.130:8080/#/settings/ssh-keys` +2. 确认您的公钥在列表中 +3. 确认公钥状态为 "Valid" + +### 方法 C:重新生成 ed25519 密钥 + +如果 RSA 密钥一直有问题,可以生成 ed25519 密钥: + +```bash +# 生成新的 ed25519 密钥 +ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519 + +# 查看新公钥 +cat ~/.ssh/id_ed25519.pub +``` + +然后将新公钥添加到 Gerrit。 + +## 常见问题 + +### Q: 配置文件权限错误 + +```bash +# 修复权限 +chmod 600 ~/.ssh/config +chmod 700 ~/.ssh +``` + +### Q: 配置文件格式错误 + +确保: +- 每行前面有正确的缩进(4 个空格或 1 个 Tab) +- 没有多余的空格或特殊字符 +- 文件使用 UTF-8 编码 + +### Q: 配置不生效 + +```bash +# 清除 SSH 已知主机(如果需要) +ssh-keygen -R [101.43.95.130]:29418 + +# 重新测试 +ssh -v -p 29418 renjianbo@101.43.95.130 gerrit version +``` + diff --git a/Windows上传项目命令.txt b/Windows上传项目命令.txt new file mode 100644 index 0000000..3fb5543 --- /dev/null +++ b/Windows上传项目命令.txt @@ -0,0 +1,38 @@ +# Windows 上传项目到 Gerrit - 快速命令 + +## 前提 +- 项目路径: D:\zhini\zhini_im +- Gerrit 地址: http://101.43.95.130:8080 +- 项目名称: zhini_im + +## 在 Git Bash 中执行以下命令: + +# 1. 进入项目目录 +cd /d/zhini/zhini_im + +# 2. 检查是否已有 Git 仓库 +ls -la | grep .git + +# 3. 如果没有,初始化 Git 仓库 +git init +git add . +git commit -m "Initial commit" + +# 4. 配置 Git 用户信息(如果还没配置) +git config user.name "admin" +git config user.email "admin@example.com" + +# 5. 添加 Gerrit 远程仓库 +git remote add gerrit http://101.43.95.130:8080/zhini_im + +# 6. 推送代码到 Gerrit(首次上传) +git push gerrit HEAD:refs/heads/master + +# 或者推送到评审队列(推荐用于后续更新) +git push gerrit HEAD:refs/for/master + +## 注意事项: +1. 如果提示需要用户名密码,用户名填 "admin",密码留空 +2. 如果项目已存在,可能需要先拉取:git pull gerrit master --allow-unrelated-histories +3. 推送成功后,在 Gerrit Web 界面查看项目 + diff --git a/add_changeid.sh b/add_changeid.sh new file mode 100644 index 0000000..692edeb --- /dev/null +++ b/add_changeid.sh @@ -0,0 +1,134 @@ +#!/bin/bash + +# 为所有 Git 提交添加 Change-Id 的脚本 + +echo "==========================================" +echo "为所有提交添加 Change-Id" +echo "==========================================" +echo "" + +# 检查是否在 Git 仓库中 +if [ ! -d .git ]; then + echo "❌ 错误:当前目录不是 Git 仓库" + exit 1 +fi + +# 步骤 1:安装 commit-msg hook +echo "步骤 1: 安装 commit-msg hook..." +echo "" + +GIT_DIR=$(git rev-parse --git-dir) +HOOK_PATH="$GIT_DIR/hooks/commit-msg" + +# 尝试使用 scp 下载 +echo "尝试使用 SCP 下载 hook..." +scp -p -P 29418 renjianbo@101.43.95.130:hooks/commit-msg "$HOOK_PATH" 2>/dev/null + +# 如果 scp 失败,使用 curl +if [ ! -f "$HOOK_PATH" ] || [ ! -x "$HOOK_PATH" ]; then + echo "SCP 失败,尝试使用 curl..." + mkdir -p "$GIT_DIR/hooks" + curl -o "$HOOK_PATH" http://101.43.95.130:8080/tools/hooks/commit-msg 2>/dev/null + chmod +x "$HOOK_PATH" +fi + +if [ -f "$HOOK_PATH" ] && [ -x "$HOOK_PATH" ]; then + echo "✅ commit-msg hook 安装成功" +else + echo "❌ commit-msg hook 安装失败" + echo "请手动下载:" + echo " curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg" + echo " chmod +x .git/hooks/commit-msg" + exit 1 +fi + +echo "" + +# 步骤 2:检查有多少提交缺少 Change-Id +echo "步骤 2: 检查缺少 Change-Id 的提交..." +echo "" + +MISSING_COUNT=0 +git log --format='%H' | while read commit; do + if ! git log -1 --format='%B' "$commit" | grep -q "^Change-Id:"; then + MISSING_COUNT=$((MISSING_COUNT + 1)) + fi +done + +# 由于管道,MISSING_COUNT 在子 shell 中,需要重新计算 +MISSING_COUNT=$(git log --format='%H' | while read commit; do + if ! git log -1 --format='%B' "$commit" | grep -q "^Change-Id:"; then + echo "1" + fi +done | wc -l) + +if [ "$MISSING_COUNT" -eq 0 ]; then + echo "✅ 所有提交都已包含 Change-Id" + exit 0 +fi + +echo "找到 $MISSING_COUNT 个缺少 Change-Id 的提交" +echo "" + +# 步骤 3:创建备份 +BACKUP_BRANCH="backup-$(date +%Y%m%d-%H%M%S)" +echo "步骤 3: 创建备份分支: $BACKUP_BRANCH" +git branch "$BACKUP_BRANCH" +echo "✅ 备份完成" +echo "" + +# 步骤 4:为所有提交添加 Change-Id +echo "步骤 4: 为所有提交添加 Change-Id..." +echo "这可能需要一些时间,请耐心等待..." +echo "" + +# 使用 git filter-branch 为所有提交添加 Change-Id +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + cat + + # 如果提交信息中没有 Change-Id,添加一个 + if ! grep -q "^Change-Id:"; then + # 生成 Change-Id(基于提交的 SHA1) + # 使用 git hash-object 生成一个唯一的 ID + COMMIT_INFO=$(git cat-file commit HEAD) + CHANGE_ID_BASE=$(echo -n "$COMMIT_INFO" | git hash-object --stdin) + CHANGE_ID="I${CHANGE_ID_BASE:0:40}" + echo "" + echo "Change-Id: $CHANGE_ID" + fi +' --tag-name-filter cat -- --branches --tags + +if [ $? -eq 0 ]; then + echo "" + echo "✅ Change-Id 添加完成!" + echo "" + + # 验证 + echo "验证结果:" + REMAINING=$(git log --format='%H' | while read commit; do + if ! git log -1 --format='%B' "$commit" | grep -q "^Change-Id:"; then + echo "1" + fi + done | wc -l) + + if [ "$REMAINING" -eq 0 ]; then + echo "✅ 所有提交都已包含 Change-Id" + else + echo "⚠️ 仍有 $REMAINING 个提交缺少 Change-Id" + fi + + echo "" + echo "下一步:" + echo " git push gerrit HEAD:refs/for/master" + echo "" + echo "如果需要恢复,可以使用:" + echo " git reset --hard $BACKUP_BRANCH" +else + echo "" + echo "❌ 添加 Change-Id 失败" + echo "可以恢复备份:git reset --hard $BACKUP_BRANCH" + exit 1 +fi + + diff --git a/add_renjianbo_to_admin.sh b/add_renjianbo_to_admin.sh new file mode 100755 index 0000000..e8439df --- /dev/null +++ b/add_renjianbo_to_admin.sh @@ -0,0 +1,90 @@ +#!/bin/bash + +# 将 renjianbo 用户添加到 Administrators 组的脚本 +# 适用于 Gerrit 3.9.0 + +GERRIT_DIR="/home/renjianbo/gerrit_install/review_site" +JAVA_HOME="/usr/local/java/jdk-17.0.12+7" +USERNAME="renjianbo" + +echo "==========================================" +echo "将用户 $USERNAME 添加到 Administrators 组" +echo "==========================================" +echo "" + +cd "$GERRIT_DIR" || exit 1 + +export JAVA_HOME +export PATH=$JAVA_HOME/bin:$PATH + +# 查找 H2 数据库 JAR 文件 +H2_JAR=$(find . -name "h2*.jar" | head -1) + +if [ -z "$H2_JAR" ]; then + echo "❌ 未找到 H2 数据库 JAR 文件" + exit 1 +fi + +echo "使用 H2 JAR: $H2_JAR" +echo "" + +# 查找用户的 account_id +echo "查找用户账户..." +ACCOUNT_ID=$(java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:./db/ReviewDB" -user sa -password "" -sql "SELECT account_id FROM accounts WHERE user_name = '$USERNAME' OR full_name LIKE '%$USERNAME%' LIMIT 1;" 2>&1 | grep -E "^[0-9]+" | head -1) + +if [ -z "$ACCOUNT_ID" ]; then + echo "⚠️ 未找到用户 $USERNAME,尝试查找第一个账户..." + ACCOUNT_ID=$(java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:./db/ReviewDB" -user sa -password "" -sql "SELECT account_id FROM accounts ORDER BY account_id LIMIT 1;" 2>&1 | grep -E "^[0-9]+" | head -1) +fi + +if [ -z "$ACCOUNT_ID" ]; then + echo "❌ 无法找到任何账户" + exit 1 +fi + +echo "找到账户 ID: $ACCOUNT_ID" +echo "" + +# 查找 Administrators 组的 group_id +echo "查找 Administrators 组..." +GROUP_ID=$(java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:./db/ReviewDB" -user sa -password "" -sql "SELECT group_id FROM account_groups WHERE name = 'Administrators' LIMIT 1;" 2>&1 | grep -E "^[0-9]+" | head -1) + +if [ -z "$GROUP_ID" ]; then + echo "❌ 未找到 Administrators 组" + exit 1 +fi + +echo "找到 Administrators 组 ID: $GROUP_ID" +echo "" + +# 检查用户是否已经是管理员 +echo "检查用户是否已经是管理员..." +IS_ADMIN=$(java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:./db/ReviewDB" -user sa -password "" -sql "SELECT COUNT(*) FROM account_group_members WHERE account_id = $ACCOUNT_ID AND group_id = $GROUP_ID;" 2>&1 | grep -E "^[0-9]+" | head -1) + +if [ "$IS_ADMIN" = "1" ]; then + echo "✅ 用户已经是管理员,无需添加" + exit 0 +fi + +# 添加用户到管理员组 +echo "添加用户到 Administrators 组..." +java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:./db/ReviewDB" -user sa -password "" -sql "INSERT INTO account_group_members (account_id, group_id) VALUES ($ACCOUNT_ID, $GROUP_ID);" 2>&1 | grep -v "^[>|]" | grep -v "jdbc:h2" || true + +# 验证 +echo "" +echo "验证添加结果..." +NEW_IS_ADMIN=$(java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:./db/ReviewDB" -user sa -password "" -sql "SELECT COUNT(*) FROM account_group_members WHERE account_id = $ACCOUNT_ID AND group_id = $GROUP_ID;" 2>&1 | grep -E "^[0-9]+" | head -1) + +if [ "$NEW_IS_ADMIN" = "1" ]; then + echo "" + echo "✅ 成功!用户 $USERNAME (Account ID: $ACCOUNT_ID) 已添加到 Administrators 组" + echo "" + echo "下一步:" + echo "1. 退出并重新登录 Gerrit" + echo "2. 刷新浏览器页面" + echo "3. 应该能看到 'CREATE NEW' 按钮了" +else + echo "" + echo "❌ 添加失败,请检查错误信息" +fi + diff --git a/add_user_to_admin.sh b/add_user_to_admin.sh new file mode 100755 index 0000000..f0c9cb0 --- /dev/null +++ b/add_user_to_admin.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +# 将用户添加到 Administrators 组的脚本 + +GERRIT_DIR="/home/renjianbo/gerrit_install/review_site" +JAVA_HOME="/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64" +USERNAME="renjianbo" + +echo "==========================================" +echo "将用户 $USERNAME 添加到 Administrators 组" +echo "==========================================" +echo "" + +cd "$GERRIT_DIR" || exit 1 + +# 方法 1: 尝试通过 SSH(如果可用) +echo "方法 1: 尝试通过 SSH 添加..." +ssh -p 29418 renjianbo@localhost gerrit set-members --add "$USERNAME" Administrators 2>/dev/null + +if [ $? -eq 0 ]; then + echo "✅ 通过 SSH 添加成功" + exit 0 +fi + +echo "SSH 方法失败,尝试其他方法..." +echo "" + +# 方法 2: 通过数据库直接添加 +echo "方法 2: 通过数据库添加..." + +# 查找用户的 account_id +ACCOUNT_ID=$(cd "$GERRIT_DIR" && JAVA_HOME="$JAVA_HOME" java -cp db/h2*.jar org.h2.tools.Shell -url jdbc:h2:./db/ReviewDB -user sa -password "" -sql "SELECT account_id FROM accounts WHERE preferred_email LIKE '%263303411%' OR full_name LIKE '%renjianbo%' LIMIT 1;" 2>/dev/null | grep -E "^[0-9]+" | head -1) + +if [ -z "$ACCOUNT_ID" ]; then + echo "⚠️ 无法找到用户账户,尝试通过用户名查找..." + # 尝试其他方式 + ACCOUNT_ID=$(cd "$GERRIT_DIR" && JAVA_HOME="$JAVA_HOME" java -cp db/h2*.jar org.h2.tools.Shell -url jdbc:h2:./db/ReviewDB -user sa -password "" -sql "SELECT account_id FROM accounts LIMIT 1;" 2>/dev/null | grep -E "^[0-9]+" | head -1) +fi + +if [ -n "$ACCOUNT_ID" ]; then + echo "找到账户 ID: $ACCOUNT_ID" + + # 查找 Administrators 组的 group_id + GROUP_ID=$(cd "$GERRIT_DIR" && JAVA_HOME="$JAVA_HOME" java -cp db/h2*.jar org.h2.tools.Shell -url jdbc:h2:./db/ReviewDB -user sa -password "" -sql "SELECT group_id FROM account_groups WHERE name = 'Administrators';" 2>/dev/null | grep -E "^[0-9]+" | head -1) + + if [ -z "$GROUP_ID" ]; then + echo "⚠️ 无法找到 Administrators 组" + echo "请通过 Web 界面手动添加:" + echo " 访问: http://101.43.95.130:8080/#/admin/groups/Administrators,members" + exit 1 + fi + + echo "找到 Administrators 组 ID: $GROUP_ID" + + # 检查用户是否已在组中 + EXISTING=$(cd "$GERRIT_DIR" && JAVA_HOME="$JAVA_HOME" java -cp db/h2*.jar org.h2.tools.Shell -url jdbc:h2:./db/ReviewDB -user sa -password "" -sql "SELECT account_id FROM account_group_members WHERE account_id = $ACCOUNT_ID AND group_id = $GROUP_ID;" 2>/dev/null | grep -E "^[0-9]+") + + if [ -n "$EXISTING" ]; then + echo "✅ 用户已在 Administrators 组中" + else + # 添加用户到组 + echo "正在添加用户到组..." + cd "$GERRIT_DIR" && JAVA_HOME="$JAVA_HOME" java -cp db/h2*.jar org.h2.tools.Shell -url jdbc:h2:./db/ReviewDB -user sa -password "" -sql "INSERT INTO account_group_members (account_id, group_id) VALUES ($ACCOUNT_ID, $GROUP_ID);" 2>/dev/null + + if [ $? -eq 0 ]; then + echo "✅ 用户已添加到 Administrators 组" + else + echo "❌ 添加失败,请通过 Web 界面手动添加" + fi + fi +else + echo "❌ 无法找到用户账户" + echo "请通过 Web 界面手动添加:" + echo " 访问: http://101.43.95.130:8080/#/admin/groups/Administrators,members" +fi + +echo "" +echo "配置完成后,请:" +echo "1. 刷新 Gerrit Web 界面" +echo "2. 重新登录" +echo "3. 检查是否可以看到 +2 选项" + + diff --git a/check_account.class b/check_account.class new file mode 100644 index 0000000000000000000000000000000000000000..e2c994dffe6b3fc4c3956f713dc7d19c999074b7 GIT binary patch literal 3728 zcmai1>thtv760AICUdiy5ZDlC#cAPoen*0!JgT)y?A1pEWqFKtcF-P!CTStO6SGv}Vi@BGfW zckX=k?bXi#Y{lR0@L&f=h$C!AKL%v%w4+jpc8T#Zj@@E>oMR8ikL>s{eo~DHe#)WS zF^DL~Pz?+`AuhulBQjzfduy-{agIa{l1Ookay%(+)50XfVb)*_;~e`rCWQQe2=OzH zpL6_ze$fmpNV$D2{Qw zD&sYQ@;Jxqc68tkad}h5TQc5esCp=tjF}HJR5Wee$zbbF4H*n|{#eoojwJ?-biY0r zCy6bg$C3=on)dkj>f^dAt|y0GVKW^|4tEH{+OVld_XYIPtiFsBl)H?RGJYfD9YVlh z52wb`QKKg&+&Q8nMs#09k495tNwZbBRM3TPhIZFTDq*@gBqS`FOj=V(}p( z&A|5#4MyD~ZEgkc;}pY^4$nY;ZzQaRc50!{{?LG?-~*gykTN<0WSmj(AwH5Zso*Sr z$FQQavs0Zp{q)RxAKtq3(ah1yUw?6G=FoYS#C93KSMUe?kzw)XR@GxAno)0^I_oB0 z6nuI-_h`+Yk#ryA0>`NI90nClIyJ)z#foRhHH8}e!)wQKjBgxpfq z6P)`^_uR4#6Y-m!W28@e|x_LOM z@-*#B>QR#lFEscZa4UYu7>;F3BW(FFrBg4wJeBo4W zf;=SkIAviKkzr36IlfRxEVG`SXThr9oI7%+5nzN zrN#1LSl3i$mo5@z4LWG|*GET<?@Y)9Vr8BAx{e>W!kZb%zTRx5?j)kAm-?7@VFIvuITH_gf80# ziZNkC$4q0#n2|of&~$q{!C7(aD$3L+y1y*{KH8p}d<#PsT2v8C#S#V`8xo^;jGWh` ztVsalvcd{fqX*mQo>VKYgTqetryY{tQE>&fUDr^#`!cE= z@)US8{X44ZG6j3U>8NoiS5O5Z(rm1pMkB)sY#_;8pu5O_W2IxoG*(Jsjja4}hmu&5FkrP!osdB8D##-Uz9?MCQ!o8Nly3!~`3hOO}4YyTjvJ^JnHpC`N zp?MlkfuSXjfwGvK-QFOdL=6RWwC1>T2}W#=`|{aQ2D$9gwsu~G?T*>yz;C`S_%;jM zmIVq~Y|l6F9JZ}FZ1-E(+Vj||^Vm9U?bY9b&GCIJ)I6pqXTNNy&INgZoKv$r$mlS- z$l<1^N!%N_h==A{qLW-Wr|>Wh7K!xmgA3HM71BZJ5Pfn;*@pfKZKBIjK}}puziX+L zo1tI}>PTlXtp^8vR@Kv|%TlD!fa6$By>}PRUsbn$*nTv#!*H@^(ZXIqD|-zt_9^aT|G;MUFSN05u~n+T{Zb7clr)d~6#v~2*d?q*qoDX)p9IB3d|(S=%Ofb3B$yDa+BPoX3X91GHyhAC@mXuN zwKJWmcI>pBPPJdEqtij@!w>z^nSSZVe(zL-na=bNaHjU$ggg*B{nQNX?mhRM-#PdE z&OP`3^7nTS0Bpw<2R5Nm#x5C64(!JB5?*kiScsa%yG2H;c(=*$%4m0B5B8R#1N&sW z=s+iYW$+^)qpJ-25iCOp-7>;5dc@}eVfm7bgE9_@@nIP+%XmfDy(%Ljbt|G9NlS~xXku9B zBax(TaZg{bCzu|#wUGaW+3z0M>TWajVQxw|uE0c+Ve!+^wxsk}A2%7~!M@&T!@$-C z1r|~a3mTil-GNBR8|?80o4SKxuYzHWFxZkB10V@#W~m zXJ0+K^~Iwr=O2D}b>h=AQ`fGjG~X#OL+3c!Mc33J$Urvts0tlZ5Cuw{JJ73f{+vf)9j#S;2my-Iccv^bYc< zMSyec+Zl?Py`1%&JRbA3CJcjY$uom9jVPqF&n+J324UufL7q&-tPm$*dER$xOiR)h zl#V7$K_tU^*Bs5GK$JFUq^6_|4RNE7Ve@|&WP+aF(qt%GiR?NSxoQfKGg8v1%q=9- zDSVotQIDYp($B5J75nCJJsWVgWZLV@1d`(dPC_S>ltOB`i4-NQB7>nPJYCdHEsB(D zaWcr1z)UeEb4Vz~h?0sq0u-INJW2o-FW{*%n~E9ykqd>N;L()D_oujdlEF0>VkSCa znIoAj?FK(VvD2Y(i0Go!b%=tPGo%iN<*ts|WaL>ZCHpLG8~#0p!Xt;FI2ubNsiunP zfS`Ur5I&wv5|@;LbdJ&oQn#r^IaXsMoyX#50}}@gJ>4`~L2qj9DBgGv><)b}c<5P@ z78aotTTn;eq-yJeosIyob52{Qv*)TP278s==^V#G8ybp>>PxDM$FYdv8cchA38`lBDhQ^k*jYJ_#Wsv# z2|*G@fkIVAVd*%Q2?gPEro!@!!irf6V_13f$;FD2Pf#XeTa__$s`RGVR!_&43rsI? zy5@h1>SiXCwG;xSX&u8&tn=N)hHN&f$#3l#T)B19pym#dQpAq1DBWaiY08F)OX3kl zkcqZZtbw?JDcFW`G-5v5QAJmvrF2_bh8`@(2/dev/null + +if [ $? -eq 0 ]; then + echo "✅ 通过 SSH 配置成功" + exit 0 +fi + +echo "SSH 配置失败,尝试其他方法..." +echo "" + +# 方法 2: 直接编辑配置文件 +echo "方法 2: 编辑配置文件..." + +PROJECT_CONFIG_DIR="$GERRIT_DIR/git/$PROJECT_NAME.git" +PROJECT_CONFIG="$PROJECT_CONFIG_DIR/config" + +if [ ! -d "$PROJECT_CONFIG_DIR" ]; then + echo "❌ 项目目录不存在: $PROJECT_CONFIG_DIR" + exit 1 +fi + +# 备份配置文件 +if [ -f "$PROJECT_CONFIG" ]; then + cp "$PROJECT_CONFIG" "$PROJECT_CONFIG.bak.$(date +%Y%m%d_%H%M%S)" + echo "✅ 已备份配置文件" +fi + +# 检查是否已有权限配置 +if grep -q "refs/for/\*" "$PROJECT_CONFIG" 2>/dev/null; then + echo "⚠️ 检测到已有 refs/for/* 权限配置" + echo "请手动编辑文件: $PROJECT_CONFIG" + echo "" + echo "添加以下内容:" + echo " [access \"refs/for/*\"]" + echo " label-Code-Review = +2 group Administrators" +else + # 添加权限配置 + cat >> "$PROJECT_CONFIG" << 'EOF' + +[access "refs/for/*"] + label-Code-Review = +2 group Administrators +EOF + echo "✅ 已添加权限配置到配置文件" +fi + +echo "" +echo "配置文件位置: $PROJECT_CONFIG" +echo "" +echo "下一步:" +echo "1. 检查配置文件内容是否正确" +echo "2. 重启 Gerrit 服务使配置生效:" +echo " cd $GERRIT_DIR" +echo " JAVA_HOME=$JAVA_HOME bin/gerrit.sh restart" +echo "" + +# 显示配置文件内容 +echo "当前配置文件内容(最后 20 行):" +tail -20 "$PROJECT_CONFIG" + + diff --git a/create_account.class b/create_account.class new file mode 100644 index 0000000000000000000000000000000000000000..41ede1f1a3a93a609edda6138569def6d27181ba GIT binary patch literal 3728 zcmb7HU2q%K75?tp(yrw-i4{AELTEQ6!7^2>kU}7Gf`65w#DB452Zsh_EnVB|NGq{g zB~Je+w54u<#!#0QQkv2h0-a81GK?K3E$#G?nLhWm4|S4urqdZ-VM@={zia`mM_%pT zz4trkeBZg}Tz&AL8}9>n5WjKZAp{j1R`3-Ck0}Vba0EwX47ebR7lYz^NWrl99#L>i z!Ke#iL==oQVjRaC@i->xu%WlR5hw73g0G5^lj8EEjHnBzpu4aYlVT($F7XB$;|it( z=N5x9 z8=s5?X7&YCd>``+&7D1Ck>O}KI6592Jro%o3##}5&NE0Eoq+^;Ud0P|ks%Nc4g~um zS|P-!5!Vin4i6TeGurXTf}_FWqj-Htdth(wkBC$8LtG&CR4m{nqEN-l_z^=gG(?so zT4*RTTwI#byk#3cZ7Q2cL`^-(eOlV$Q$!w*M>)xt@M(sr$83t+r&)a3$k<%GOPTH3 zc+bFCFsymId|LU_u3`~CR`Cjc!r;y^lzA%Qj~Gc#QY6zdeyZYCye5RZsN!dMUB%CF zNyRVl21Co8_ujfSzq~qsarNenTk{L6=Pv~`LE7DP`YI^ zVp)<07-nn8QjJ?BQBIAh9*!tkq;_Y+!)IX{TJhz4*2ucHzZ4 zSKhz*FwnQX!ia~j-G_MtC9iO(QU zrK}-Rkzu#DMsukc$}Q-mrlqIT+>A5q`J4rL=L@x*7AkhC7*C70y#hHuN;5W>0?N0D zLEY4;0g)Kf+^&p#u!iaNfa^yJR;!65!yBp22?8tl+grm##qxEG6N<{`cr0u4V_9yU z6YaWUen|wHS8q~1%QgKIL}!NEAt9K<8w!bL-arFIo;G_!HG-f?70DDnN3DdqYjZ41 z-Nv*rEx~8(^W^3Ld zBjq2V^M~-1>q!b~yEjw_x8ihC7C*mzs#j6=r3FTUa=En@-Q=_*mPloU3)D*K7(;n5 zNM)O{f|5D6m?Vpxj#zq(V+S1(AEJXIAc2lDc$lt_(9=EiO{W7m?q3GGN;eD#=<3W3 z)}sLdbkaRdt=~qYO|*X5Ee*Kq2Ho{T?z%v|+i@Mv<2NBsEJJZOEW!09`gb?dWeIA) z;c>W|+;?5ahJe%KbZ=ZivxI=`kyqfRqln_(w7xFOV;-~==F9co+`V>Lz&O( zC5EbXQ%k|PDT6eRa|J$z3K{p1`J9aIjw(kkqb=aLhP_3a9-y}##}f9@cV2Pv^yRCR z#!b=%>1FzrA?1?%LmbSddL12(olq#*8z{k>un8Nn2hEi9E$G7*48VgCY@;7V+rgnB zMZ4)7?!~j%iRZBkuVXjf#C`Z9+VE$z<1g^xuY~Y7bl{(4?L+KkDjsB8sQ2x_BkUj! zupm0wFb=X4=w@;Buq1lfJo?xI`q?`Ovftt`TSkce2}jrmILcNr!2X3n$%$i9GsdL5 zF)r=G<5CAEqyso9_2Efr3{mMMPDvawDS^0j0R}}oB`soFx{4WT3A4F~k3s%~9CgV! vB;(QQPnV2tnfw7hLg-^$qQ{Rg@v-;?*!>B` /dev/null << EOSERVICE +[Unit] +Description=Gerrit Code Review +After=network.target + +[Service] +Type=forking +User=${GERRIT_USER} +Group=${GERRIT_USER} +WorkingDirectory=${GERRIT_HOME} +Environment="JAVA_HOME=${JAVA_HOME}" +Environment="PATH=${JAVA_HOME}/bin:/usr/local/bin:/usr/bin:/bin" +ExecStart=${GERRIT_HOME}/bin/gerrit.sh start +ExecStop=${GERRIT_HOME}/bin/gerrit.sh stop +Restart=on-failure +RestartSec=10 +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target +EOSERVICE + +if [ $? -eq 0 ]; then + echo "✅ systemd 服务文件创建成功" +else + echo "❌ 创建服务文件失败" + exit 1 +fi + +echo "" +echo "重新加载 systemd 配置..." +sudo systemctl daemon-reload + +if [ $? -eq 0 ]; then + echo "✅ systemd 配置已重新加载" +else + echo "❌ 重新加载失败" + exit 1 +fi + +echo "" +echo "设置开机自启动..." +sudo systemctl enable gerrit + +if [ $? -eq 0 ]; then + echo "✅ 开机自启动已设置" +else + echo "❌ 设置开机自启动失败" + exit 1 +fi + +echo "" +echo "==========================================" +echo "✅ systemd 服务配置完成!" +echo "==========================================" +echo "" +echo "服务管理命令:" +echo " 启动服务: sudo systemctl start gerrit" +echo " 停止服务: sudo systemctl stop gerrit" +echo " 重启服务: sudo systemctl restart gerrit" +echo " 查看状态: sudo systemctl status gerrit" +echo " 查看日志: sudo journalctl -u gerrit -f" +echo "" +echo "服务特性:" +echo " ✅ 开机自动启动" +echo " ✅ 故障自动重启(失败后10秒重启)" +echo " ✅ 日志记录到 systemd journal" +echo "" + diff --git a/fix_email.sh b/fix_email.sh new file mode 100644 index 0000000..8d21839 --- /dev/null +++ b/fix_email.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +# 修复 Git 提交记录中的邮箱地址 +# 将 noreply@gitee.com 替换为已注册的邮箱 + +echo "==========================================" +echo "修复 Git 提交记录中的邮箱地址" +echo "==========================================" +echo "" + +# 检查是否在 Git 仓库中 +if [ ! -d .git ]; then + echo "❌ 错误:当前目录不是 Git 仓库" + exit 1 +fi + +# 检查是否有未提交的更改 +if [ -n "$(git status --porcelain)" ]; then + echo "⚠️ 警告:检测到未提交的更改" + echo "建议先提交或暂存更改后再执行此脚本" + read -p "是否继续?(y/n) " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 + fi +fi + +# 配置信息 +OLD_EMAIL="noreply@gitee.com" +CORRECT_NAME="renjianbo" +CORRECT_EMAIL="263303411@qq.com" + +echo "将修改以下邮箱地址:" +echo " 旧邮箱: $OLD_EMAIL" +echo " 新邮箱: $CORRECT_EMAIL" +echo " 作者名: $CORRECT_NAME" +echo "" + +# 检查是否有使用旧邮箱的提交 +COMMITS_WITH_OLD_EMAIL=$(git log --format='%H' --author="$OLD_EMAIL" | wc -l) + +if [ "$COMMITS_WITH_OLD_EMAIL" -eq 0 ]; then + echo "✅ 没有找到使用 $OLD_EMAIL 的提交,无需修改" + exit 0 +fi + +echo "找到 $COMMITS_WITH_OLD_EMAIL 个使用旧邮箱的提交" +echo "" + +# 创建备份分支 +BACKUP_BRANCH="backup-$(date +%Y%m%d-%H%M%S)" +echo "创建备份分支: $BACKUP_BRANCH" +git branch "$BACKUP_BRANCH" +echo "✅ 备份完成" +echo "" + +# 执行批量修改 +echo "开始批量修改提交记录..." +echo "这可能需要一些时间,请耐心等待..." +echo "" + +git filter-branch -f --env-filter " +if [ \"\$GIT_COMMITTER_EMAIL\" = \"$OLD_EMAIL\" ] +then + export GIT_COMMITTER_NAME=\"$CORRECT_NAME\" + export GIT_COMMITTER_EMAIL=\"$CORRECT_EMAIL\" +fi +if [ \"\$GIT_AUTHOR_EMAIL\" = \"$OLD_EMAIL\" ] +then + export GIT_AUTHOR_NAME=\"$CORRECT_NAME\" + export GIT_AUTHOR_EMAIL=\"$CORRECT_EMAIL\" +fi +" --tag-name-filter cat -- --branches --tags + +if [ $? -eq 0 ]; then + echo "" + echo "✅ 修改完成!" + echo "" + echo "验证结果:" + REMAINING=$(git log --format='%H' --author="$OLD_EMAIL" | wc -l) + if [ "$REMAINING" -eq 0 ]; then + echo "✅ 所有提交的邮箱地址已成功修改" + else + echo "⚠️ 仍有 $REMAINING 个提交使用旧邮箱" + fi + echo "" + echo "下一步:" + echo " 1. 检查修改结果:git log --format='%an <%ae>' | head -10" + echo " 2. 推送到 Gerrit:git push gerrit HEAD:refs/for/master" + echo "" + echo "如果需要恢复,可以使用:" + echo " git reset --hard $BACKUP_BRANCH" +else + echo "" + echo "❌ 修改失败" + echo "可以恢复备份:git reset --hard $BACKUP_BRANCH" + exit 1 +fi + + diff --git a/fix_unique_changeid.sh b/fix_unique_changeid.sh new file mode 100644 index 0000000..fcf8dd3 --- /dev/null +++ b/fix_unique_changeid.sh @@ -0,0 +1,91 @@ +#!/bin/bash + +# 为所有提交生成唯一 Change-Id 的脚本 + +echo "==========================================" +echo "为所有提交生成唯一的 Change-Id" +echo "==========================================" +echo "" + +cd /d/zhini/zhini_im || exit 1 + +# 1. 确保 hook 已安装 +echo "步骤 1: 确保 commit-msg hook 已安装..." +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg 2>/dev/null +chmod +x .git/hooks/commit-msg +echo "✅ Hook 已安装" +echo "" + +# 2. 创建备份 +echo "步骤 2: 创建备份分支..." +BACKUP_BRANCH="backup-$(date +%Y%m%d-%H%M%S)" +git branch "$BACKUP_BRANCH" +echo "✅ 备份分支: $BACKUP_BRANCH" +echo "" + +# 3. 检查当前有多少个提交 +TOTAL_COMMITS=$(git rev-list --count HEAD) +echo "步骤 3: 找到 $TOTAL_COMMITS 个提交需要处理" +echo "" + +# 4. 为所有提交生成唯一的 Change-Id +echo "步骤 4: 为所有提交生成唯一的 Change-Id..." +echo "这可能需要一些时间,请耐心等待..." +echo "" + +# 使用 filter-branch,为每个提交生成基于其唯一信息的 Change-Id +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + ORIGINAL_MSG=$(cat) + + # 移除所有旧的 Change-Id 行 + CLEAN_MSG=$(echo "$ORIGINAL_MSG" | grep -v "^Change-Id:") + + # 输出清理后的提交信息(去除末尾多余空行) + echo "$CLEAN_MSG" | sed -e :a -e "/^\$/{\$!N;ba}" -e "s/\n\$//" + + # 为当前提交生成唯一的 Change-Id + # 使用提交的完整 SHA1(每个提交的 SHA1 都是唯一的) + COMMIT_SHA=$(git rev-parse HEAD) + + # 直接使用 SHA1 作为 Change-Id(SHA1 本身就是唯一的) + # Change-Id 格式:I + 40位十六进制 + CHANGE_ID="I${COMMIT_SHA}" + + echo "" + echo "Change-Id: $CHANGE_ID" +' --tag-name-filter cat -- --branches --tags + +if [ $? -eq 0 ]; then + echo "" + echo "✅ Change-Id 生成完成!" + echo "" + + # 验证所有 Change-Id 都是唯一的 + echo "步骤 5: 验证 Change-Id 唯一性..." + DUPLICATES=$(git log --format='%H' | while read commit; do + git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2 + done | sort | uniq -d) + + if [ -z "$DUPLICATES" ]; then + echo "✅ 所有 Change-Id 都是唯一的" + else + echo "⚠️ 发现重复的 Change-Id:" + echo "$DUPLICATES" + fi + + echo "" + echo "下一步:" + echo " git push gerrit HEAD:refs/for/master" + echo "" + echo "如果需要恢复,可以使用:" + echo " git reset --hard $BACKUP_BRANCH" +else + echo "" + echo "❌ 生成 Change-Id 失败" + echo "可以恢复备份:git reset --hard $BACKUP_BRANCH" + exit 1 +fi + + diff --git a/install_drone_ci.sh b/install_drone_ci.sh new file mode 100755 index 0000000..304ddae --- /dev/null +++ b/install_drone_ci.sh @@ -0,0 +1,241 @@ +#!/bin/bash + +# Drone CI 安装脚本(轻量级,适合个人小团队) +# 支持 CentOS/RHEL 系统 + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_HOST="${GERRIT_HOST:-101.43.95.130}" +GERRIT_PORT="${GERRIT_PORT:-8080}" +DRONE_PORT="${DRONE_PORT:-3000}" +DRONE_DATA_DIR="/opt/drone" +DRONE_RPC_SECRET="" + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Drone CI 自动化安装脚本${NC}" +echo -e "${GREEN}(轻量级,适合个人小团队)${NC}" +echo -e "${GREEN}========================================${NC}" + +# 检查 Docker +check_docker() { + echo -e "${GREEN}检查 Docker 环境...${NC}" + if ! command -v docker &> /dev/null; then + echo -e "${YELLOW}未检测到 Docker,正在安装...${NC}" + # 安装 Docker + sudo yum install -y yum-utils + sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + sudo yum install -y docker-ce docker-ce-cli containerd.io + sudo systemctl start docker + sudo systemctl enable docker + fi + + # 检查 Docker 服务状态 + if ! sudo systemctl is-active --quiet docker; then + echo -e "${YELLOW}启动 Docker 服务...${NC}" + sudo systemctl start docker + fi + + echo -e "${GREEN}Docker 版本: $(docker --version)${NC}" +} + +# 生成 RPC Secret +generate_rpc_secret() { + echo -e "${GREEN}生成 RPC Secret...${NC}" + if command -v openssl &> /dev/null; then + DRONE_RPC_SECRET=$(openssl rand -hex 16) + else + DRONE_RPC_SECRET=$(date +%s | sha256sum | base64 | head -c 32) + fi + echo -e "${GREEN}RPC Secret 已生成${NC}" +} + +# 创建数据目录 +create_directories() { + echo -e "${GREEN}创建数据目录...${NC}" + sudo mkdir -p ${DRONE_DATA_DIR} + sudo chmod 755 ${DRONE_DATA_DIR} + echo -e "${GREEN}目录创建完成: ${DRONE_DATA_DIR}${NC}" +} + +# 安装 Drone Server +install_drone_server() { + echo -e "${GREEN}安装 Drone Server...${NC}" + + # 停止并删除旧容器(如果存在) + sudo docker stop drone 2>/dev/null || true + sudo docker rm drone 2>/dev/null || true + + # 运行 Drone Server + sudo docker run -d \ + --name=drone \ + --restart=always \ + --volume=${DRONE_DATA_DIR}:/data \ + --env=DRONE_GERRIT_SERVER=http://${GERRIT_HOST}:${GERRIT_PORT} \ + --env=DRONE_GERRIT_USERNAME=admin \ + --env=DRONE_GERRIT_PASSWORD="" \ + --env=DRONE_RPC_SECRET=${DRONE_RPC_SECRET} \ + --env=DRONE_SERVER_HOST=${GERRIT_HOST}:${DRONE_PORT} \ + --env=DRONE_SERVER_PROTO=http \ + --env=DRONE_USER_CREATE=username:admin,admin:true \ + --publish=${DRONE_PORT}:80 \ + drone/drone:latest + + echo -e "${GREEN}Drone Server 安装完成${NC}" +} + +# 安装 Drone Runner +install_drone_runner() { + echo -e "${GREEN}安装 Drone Runner...${NC}" + + # 停止并删除旧容器(如果存在) + sudo docker stop drone-runner 2>/dev/null || true + sudo docker rm drone-runner 2>/dev/null || true + + # 运行 Drone Runner + sudo docker run -d \ + --name=drone-runner \ + --restart=always \ + --volume=/var/run/docker.sock:/var/run/docker.sock \ + --env=DRONE_RPC_PROTO=http \ + --env=DRONE_RPC_HOST=${GERRIT_HOST}:${DRONE_PORT} \ + --env=DRONE_RPC_SECRET=${DRONE_RPC_SECRET} \ + --env=DRONE_RUNNER_CAPACITY=2 \ + --env=DRONE_RUNNER_NAME=runner-1 \ + drone/drone-runner-docker:latest + + echo -e "${GREEN}Drone Runner 安装完成${NC}" +} + +# 检查防火墙 +check_firewall() { + echo -e "${YELLOW}检查防火墙配置...${NC}" + + if command -v firewall-cmd &> /dev/null; then + if sudo firewall-cmd --list-ports | grep -q "${DRONE_PORT}"; then + echo -e "${GREEN}防火墙端口 ${DRONE_PORT} 已开放${NC}" + else + echo -e "${YELLOW}需要开放防火墙端口 ${DRONE_PORT}${NC}" + echo -e "${YELLOW}执行: sudo firewall-cmd --permanent --add-port=${DRONE_PORT}/tcp && sudo firewall-cmd --reload${NC}" + fi + else + echo -e "${YELLOW}未检测到 firewall-cmd,请手动检查防火墙${NC}" + fi +} + +# 创建 .drone.yml 示例 +create_drone_yml_example() { + echo -e "${GREEN}创建 .drone.yml 示例...${NC}" + + cat > /tmp/.drone.yml.example << 'EOF' +# Drone CI 配置文件示例 +# 将此文件复制到项目根目录并命名为 .drone.yml + +kind: pipeline +type: docker +name: default + +steps: +- name: build + image: maven:3.8-openjdk-17 + commands: + - echo "开始构建..." + - mvn clean package + +- name: test + image: maven:3.8-openjdk-17 + commands: + - echo "运行测试..." + - mvn test + +- name: deploy + image: alpine + commands: + - echo "部署应用..." + # 在这里添加部署命令 + +--- +# 如果是 Node.js 项目,使用以下配置: +kind: pipeline +type: docker +name: nodejs + +steps: +- name: install + image: node:18 + commands: + - npm install + +- name: build + image: node:18 + commands: + - npm run build + +- name: test + image: node:18 + commands: + - npm test +EOF + + echo -e "${GREEN}示例文件已保存到: /tmp/.drone.yml.example${NC}" +} + +# 输出访问信息 +print_info() { + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN}Drone CI 安装完成!${NC}" + echo -e "${GREEN}========================================${NC}" + echo -e "${YELLOW}访问地址:${NC}" + echo -e " Drone CI Web 界面: http://${GERRIT_HOST}:${DRONE_PORT}" + echo -e " Gerrit Web 界面: http://${GERRIT_HOST}:${GERRIT_PORT}" + echo -e "" + echo -e "${YELLOW}常用命令:${NC}" + echo -e " 查看 Server 状态: sudo docker ps | grep drone" + echo -e " 查看 Server 日志: sudo docker logs -f drone" + echo -e " 查看 Runner 日志: sudo docker logs -f drone-runner" + echo -e " 重启 Server: sudo docker restart drone" + echo -e " 重启 Runner: sudo docker restart drone-runner" + echo -e "" + echo -e "${YELLOW}数据目录:${NC}" + echo -e " ${DRONE_DATA_DIR}" + echo -e "" + echo -e "${YELLOW}下一步:${NC}" + echo -e " 1. 访问 http://${GERRIT_HOST}:${DRONE_PORT}" + echo -e " 2. 使用 admin 账号登录(首次登录会自动创建)" + echo -e " 3. 在项目根目录创建 .drone.yml 配置文件" + echo -e " 4. 参考示例: cat /tmp/.drone.yml.example" + echo -e " 5. 在 Gerrit 项目设置中配置 Webhook:" + echo -e " URL: http://${GERRIT_HOST}:${DRONE_PORT}/hook" + echo -e " 事件: patchset-created, change-merged" + echo -e "" + echo -e "${YELLOW}配置 Gerrit Webhook:${NC}" + echo -e " 1. 访问 Gerrit: http://${GERRIT_HOST}:${GERRIT_PORT}" + echo -e " 2. 进入项目设置 → Webhooks" + echo -e " 3. 添加 Webhook:" + echo -e " URL: http://${GERRIT_HOST}:${DRONE_PORT}/hook" + echo -e " 事件: patchset-created, change-merged" + echo -e "${GREEN}========================================${NC}" +} + +# 主函数 +main() { + check_docker + generate_rpc_secret + create_directories + install_drone_server + sleep 5 # 等待 Server 启动 + install_drone_runner + check_firewall + create_drone_yml_example + print_info +} + +# 执行主函数 +main + diff --git a/install_gerrit.sh b/install_gerrit.sh new file mode 100755 index 0000000..0bb2d00 --- /dev/null +++ b/install_gerrit.sh @@ -0,0 +1,248 @@ +#!/bin/bash + +# Gerrit 一键安装脚本 +# 支持 Ubuntu/Debian 和 CentOS/Rocky Linux + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_VERSION="${GERRIT_VERSION:-3.5.0.1}" +GERRIT_HOME="/opt/gerrit" +GERRIT_USER="${USER}" +GERRIT_PORT="${GERRIT_PORT:-8080}" +GERRIT_SSH_PORT="${GERRIT_SSH_PORT:-29418}" + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Gerrit 自动化安装脚本${NC}" +echo -e "${GREEN}版本: ${GERRIT_VERSION}${NC}" +echo -e "${GREEN}========================================${NC}" + +# 检测系统类型 +detect_os() { + if [ -f /etc/os-release ]; then + . /etc/os-release + OS=$ID + OS_VERSION=$VERSION_ID + elif [ -f /etc/redhat-release ]; then + OS="rhel" + OS_VERSION=$(cat /etc/redhat-release | sed 's/.*release \([0-9]\+\).*/\1/') + else + echo -e "${RED}无法检测操作系统类型${NC}" + exit 1 + fi + echo -e "${YELLOW}检测到系统: ${OS} ${OS_VERSION}${NC}" +} + +# 安装依赖 +install_dependencies() { + echo -e "${GREEN}开始安装依赖...${NC}" + + if [[ "$OS" == "ubuntu" ]] || [[ "$OS" == "debian" ]]; then + sudo apt update + sudo apt install -y git wget openjdk-17-jdk + elif [[ "$OS" == "centos" ]] || [[ "$OS" == "rhel" ]] || [[ "$OS" == "rocky" ]]; then + if command -v dnf &> /dev/null; then + sudo dnf install -y git wget java-17-openjdk java-17-openjdk-devel + else + sudo yum install -y git wget java-17-openjdk java-17-openjdk-devel + fi + else + echo -e "${RED}不支持的操作系统: ${OS}${NC}" + exit 1 + fi + + # 验证 Java 安装 + if ! java -version 2>&1 | grep -q "version"; then + echo -e "${RED}Java 安装失败${NC}" + exit 1 + fi + + echo -e "${GREEN}依赖安装完成${NC}" +} + +# 创建工作目录 +create_directories() { + echo -e "${GREEN}创建工作目录...${NC}" + sudo mkdir -p ${GERRIT_HOME} + sudo chown ${GERRIT_USER}:${GERRIT_USER} ${GERRIT_HOME} + cd ${GERRIT_HOME} +} + +# 下载 Gerrit +download_gerrit() { + echo -e "${GREEN}下载 Gerrit ${GERRIT_VERSION}...${NC}" + cd ${GERRIT_HOME} + + if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then + wget https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war + else + echo -e "${YELLOW}Gerrit war 文件已存在,跳过下载${NC}" + fi +} + +# 初始化 Gerrit +init_gerrit() { + echo -e "${GREEN}初始化 Gerrit...${NC}" + cd ${GERRIT_HOME} + + if [ -d "review_site" ]; then + echo -e "${YELLOW}Gerrit 已初始化,跳过初始化步骤${NC}" + return + fi + + # 获取服务器 IP + SERVER_IP=$(hostname -I | awk '{print $1}') + if [ -z "$SERVER_IP" ]; then + SERVER_IP="localhost" + fi + + # 非交互式初始化 + java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + -D gerrit.canonicalWebUrl=http://${SERVER_IP}:${GERRIT_PORT}/ \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes || true + + # 配置认证方式为开发模式(方便个人使用) + cat > review_site/etc/gerrit.config << EOCONFIG +[gerrit] + basePath = git + canonicalWebUrl = http://${SERVER_IP}:${GERRIT_PORT}/ + serverId = $(uuidgen 2>/dev/null || echo $(date +%s)) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOCONFIG + + echo -e "${GREEN}Gerrit 初始化完成${NC}" +} + +# 启动 Gerrit +start_gerrit() { + echo -e "${GREEN}启动 Gerrit 服务...${NC}" + cd ${GERRIT_HOME}/review_site + + # 启动服务 + bin/gerrit.sh start + + # 等待服务启动 + sleep 5 + + # 检查状态 + if bin/gerrit.sh status | grep -q "Running"; then + echo -e "${GREEN}Gerrit 服务启动成功!${NC}" + else + echo -e "${RED}Gerrit 服务启动失败,请检查日志${NC}" + echo -e "${YELLOW}查看日志: tail -f ${GERRIT_HOME}/review_site/logs/gerrit.log${NC}" + exit 1 + fi +} + +# 创建 systemd 服务(可选) +create_systemd_service() { + echo -e "${GREEN}创建 systemd 服务...${NC}" + + sudo tee /etc/systemd/system/gerrit.service > /dev/null << EOSERVICE +[Unit] +Description=Gerrit Code Review +After=network.target + +[Service] +Type=forking +User=${GERRIT_USER} +Group=${GERRIT_USER} +ExecStart=${GERRIT_HOME}/review_site/bin/gerrit.sh start +ExecStop=${GERRIT_HOME}/review_site/bin/gerrit.sh stop +ExecReload=${GERRIT_HOME}/review_site/bin/gerrit.sh restart +Restart=on-failure +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOSERVICE + + sudo systemctl daemon-reload + sudo systemctl enable gerrit + + echo -e "${GREEN}systemd 服务创建完成${NC}" + echo -e "${YELLOW}使用以下命令管理服务:${NC}" + echo -e " 启动: sudo systemctl start gerrit" + echo -e " 停止: sudo systemctl stop gerrit" + echo -e " 重启: sudo systemctl restart gerrit" + echo -e " 状态: sudo systemctl status gerrit" +} + +# 输出访问信息 +print_info() { + SERVER_IP=$(hostname -I | awk '{print $1}') + if [ -z "$SERVER_IP" ]; then + SERVER_IP="localhost" + fi + + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN}安装完成!${NC}" + echo -e "${GREEN}========================================${NC}" + echo -e "${YELLOW}访问地址:${NC}" + echo -e " Web 界面: http://${SERVER_IP}:${GERRIT_PORT}" + echo -e " SSH 端口: ${GERRIT_SSH_PORT}" + echo -e "" + echo -e "${YELLOW}常用命令:${NC}" + echo -e " 启动服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh start" + echo -e " 停止服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh stop" + echo -e " 重启服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh restart" + echo -e " 查看状态: ${GERRIT_HOME}/review_site/bin/gerrit.sh status" + echo -e " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/gerrit.log" + echo -e "" + echo -e "${YELLOW}配置文件位置:${NC}" + echo -e " ${GERRIT_HOME}/review_site/etc/gerrit.config" + echo -e "" + echo -e "${YELLOW}首次访问:${NC}" + echo -e " 1. 打开浏览器访问 http://${SERVER_IP}:${GERRIT_PORT}" + echo -e " 2. 使用任意用户名登录(开发模式)" + echo -e " 3. 第一个登录的用户将自动成为管理员" + echo -e "${GREEN}========================================${NC}" +} + +# 主函数 +main() { + detect_os + install_dependencies + create_directories + download_gerrit + init_gerrit + start_gerrit + + # 询问是否创建 systemd 服务 + read -p "是否创建 systemd 服务以便开机自启? (y/n): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + create_systemd_service + fi + + print_info +} + +# 执行主函数 +main + diff --git a/install_java17.sh b/install_java17.sh new file mode 100644 index 0000000..3894cfd --- /dev/null +++ b/install_java17.sh @@ -0,0 +1,106 @@ +#!/bin/bash + +# Java 17 安装脚本 +# 提供多个下载源选项 + +set -e + +JAVA_VERSION="17.0.12" +JAVA_DIR="/opt/java17" +INSTALL_DIR="$HOME" + +echo "==========================================" +echo "Java 17 安装脚本" +echo "==========================================" + +# 检查是否已安装 Java 17 +if [ -d "$JAVA_DIR" ] && [ -f "$JAVA_DIR/bin/java" ]; then + CURRENT_VERSION=$($JAVA_DIR/bin/java -version 2>&1 | head -1) + if echo "$CURRENT_VERSION" | grep -q "17"; then + echo "Java 17 已安装: $CURRENT_VERSION" + echo "配置为默认版本..." + sudo alternatives --install /usr/bin/java java $JAVA_DIR/bin/java 2 + sudo alternatives --install /usr/bin/javac javac $JAVA_DIR/bin/javac 2 + sudo alternatives --config java <<< "2" + java -version + exit 0 + fi +fi + +# 下载选项 +echo "请选择下载源:" +echo "1. GitHub (Adoptium) - 需要良好的网络连接" +echo "2. 手动下载后安装" +echo "3. 使用系统包管理器(如果可用)" +read -p "请选择 (1-3): " choice + +case $choice in + 1) + echo "正在从 GitHub 下载 Java 17..." + cd $INSTALL_DIR + URL="https://github.com/adoptium/temurin17-binaries/releases/download/jdk-${JAVA_VERSION}%2B7/OpenJDK17U-jdk_x64_linux_hotspot_${JAVA_VERSION}_7.tar.gz" + wget "$URL" -O java17.tar.gz || { + echo "下载失败,请尝试其他选项" + exit 1 + } + ;; + 2) + echo "请手动下载 Java 17 并保存为 java17.tar.gz" + echo "下载地址: https://adoptium.net/zh-CN/temurin/releases/?version=17" + read -p "下载完成后,请将文件放在 $INSTALL_DIR/java17.tar.gz,然后按回车继续..." + if [ ! -f "$INSTALL_DIR/java17.tar.gz" ]; then + echo "错误: 未找到 java17.tar.gz 文件" + exit 1 + fi + ;; + 3) + echo "尝试使用系统包管理器..." + # 检查是否有可用的 Java 17 包 + if yum list available | grep -q "java-17"; then + sudo yum install -y java-17-openjdk java-17-openjdk-devel + sudo alternatives --config java + java -version + exit 0 + else + echo "系统仓库中没有 Java 17,请选择其他选项" + exit 1 + fi + ;; + *) + echo "无效选择" + exit 1 + ;; +esac + +# 解压和安装 +echo "正在解压..." +cd $INSTALL_DIR +tar -xzf java17.tar.gz + +echo "正在安装到 $JAVA_DIR..." +sudo mkdir -p $JAVA_DIR +sudo mv jdk-${JAVA_VERSION}+7/* $JAVA_DIR/ +sudo chown -R root:root $JAVA_DIR + +# 配置 alternatives +echo "配置 Java 17 为默认版本..." +sudo alternatives --install /usr/bin/java java $JAVA_DIR/bin/java 2 +sudo alternatives --install /usr/bin/javac javac $JAVA_DIR/bin/javac 2 + +# 选择 Java 17 +echo "2" | sudo alternatives --config java > /dev/null 2>&1 || { + echo "请手动选择 Java 17:" + sudo alternatives --config java +} + +# 验证安装 +echo "" +echo "==========================================" +echo "安装完成!" +echo "==========================================" +java -version +echo "" +echo "Java 17 已安装到: $JAVA_DIR" +echo "现在可以继续安装 Gerrit 了!" + + diff --git a/install_jenkins.sh b/install_jenkins.sh new file mode 100644 index 0000000..050bc4f --- /dev/null +++ b/install_jenkins.sh @@ -0,0 +1,245 @@ +#!/bin/bash + +# Jenkins 安装脚本(与 Gerrit 集成) +# 支持 CentOS/RHEL 系统 + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +JENKINS_PORT="${JENKINS_PORT:-8081}" # 避免与 Gerrit 8080 冲突 +GERRIT_HOST="${GERRIT_HOST:-101.43.95.130}" +GERRIT_PORT="${GERRIT_PORT:-8080}" +GERRIT_SSH_PORT="${GERRIT_SSH_PORT:-29418}" +JENKINS_HOME="/opt/jenkins" + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Jenkins 自动化安装脚本${NC}" +echo -e "${GREEN}(与 Gerrit 集成)${NC}" +echo -e "${GREEN}========================================${NC}" + +# 检测系统类型 +detect_os() { + if [ -f /etc/redhat-release ]; then + OS="rhel" + OS_VERSION=$(cat /etc/redhat-release | sed 's/.*release \([0-9]\+\).*/\1/') + else + echo -e "${RED}当前脚本仅支持 CentOS/RHEL${NC}" + exit 1 + fi + echo -e "${YELLOW}检测到系统: ${OS} ${OS_VERSION}${NC}" +} + +# 检查 Java +check_java() { + echo -e "${GREEN}检查 Java 环境...${NC}" + if ! command -v java &> /dev/null; then + echo -e "${RED}未检测到 Java,请先安装 Java 17${NC}" + echo -e "${YELLOW}运行: bash install_java17.sh${NC}" + exit 1 + fi + + JAVA_VERSION=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1) + if [ "$JAVA_VERSION" -lt 11 ]; then + echo -e "${RED}需要 Java 11 或更高版本,当前版本: $JAVA_VERSION${NC}" + exit 1 + fi + + echo -e "${GREEN}Java 版本: $(java -version 2>&1 | head -1)${NC}" +} + +# 安装 Jenkins +install_jenkins() { + echo -e "${GREEN}安装 Jenkins...${NC}" + + # 添加 Jenkins 仓库 + sudo wget -O /etc/yum.repos.d/jenkins.repo \ + https://pkg.jenkins.io/redhat-stable/jenkins.repo + sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key + + # 安装 Jenkins + sudo yum install -y jenkins + + echo -e "${GREEN}Jenkins 安装完成${NC}" +} + +# 配置 Jenkins 端口 +configure_jenkins() { + echo -e "${GREEN}配置 Jenkins 端口为 ${JENKINS_PORT}...${NC}" + + # 修改 Jenkins 端口(避免与 Gerrit 冲突) + sudo sed -i "s/JENKINS_PORT=.*/JENKINS_PORT=${JENKINS_PORT}/" /etc/sysconfig/jenkins + + # 设置 Jenkins 用户 + sudo usermod -aG docker jenkins 2>/dev/null || true + + echo -e "${GREEN}配置完成${NC}" +} + +# 启动 Jenkins +start_jenkins() { + echo -e "${GREEN}启动 Jenkins 服务...${NC}" + + sudo systemctl daemon-reload + sudo systemctl start jenkins + sudo systemctl enable jenkins + + # 等待 Jenkins 启动 + echo -e "${YELLOW}等待 Jenkins 启动(约 30 秒)...${NC}" + sleep 30 + + # 检查状态 + if sudo systemctl is-active --quiet jenkins; then + echo -e "${GREEN}Jenkins 服务启动成功!${NC}" + else + echo -e "${RED}Jenkins 服务启动失败,请检查日志${NC}" + echo -e "${YELLOW}查看日志: sudo journalctl -u jenkins -f${NC}" + exit 1 + fi +} + +# 获取初始密码 +get_initial_password() { + echo -e "${GREEN}获取 Jenkins 初始管理员密码...${NC}" + + if [ -f /var/lib/jenkins/secrets/initialAdminPassword ]; then + INITIAL_PASSWORD=$(sudo cat /var/lib/jenkins/secrets/initialAdminPassword) + echo -e "${YELLOW}初始管理员密码: ${INITIAL_PASSWORD}${NC}" + else + echo -e "${YELLOW}未找到初始密码文件,可能已初始化${NC}" + fi +} + +# 安装 Gerrit Trigger 插件(通过 CLI) +install_gerrit_plugin() { + echo -e "${GREEN}准备安装 Gerrit Trigger 插件...${NC}" + echo -e "${YELLOW}注意: 插件需要在 Jenkins Web 界面中安装${NC}" + echo -e "${YELLOW}或使用以下命令(需要 Jenkins 已初始化):${NC}" + echo -e "${YELLOW} java -jar /var/lib/jenkins/war/WEB-INF/jenkins-cli.jar -s http://localhost:${JENKINS_PORT} install-plugin gerrit-trigger${NC}" +} + +# 创建 Gerrit 集成配置示例 +create_gerrit_config_example() { + echo -e "${GREEN}创建 Gerrit 集成配置示例...${NC}" + + cat > /tmp/gerrit_integration_guide.txt << EOF +======================================== +Gerrit 与 Jenkins 集成配置指南 +======================================== + +1. 访问 Jenkins Web 界面 + URL: http://${GERRIT_HOST}:${JENKINS_PORT} + +2. 使用初始密码登录(见上方输出) + +3. 安装 Gerrit Trigger 插件 + - 管理 Jenkins → 插件管理 → 可用插件 + - 搜索 "Gerrit Trigger" + - 安装并重启 Jenkins + +4. 配置 Gerrit Server + - 管理 Jenkins → 系统配置 → Gerrit Trigger + - 添加 Gerrit Server: + * Name: Gerrit-Server + * Frontend URL: http://${GERRIT_HOST}:${GERRIT_PORT} + * SSH Port: ${GERRIT_SSH_PORT} + * Username: admin(或您的 Gerrit 用户名) + * SSH Keyfile: /var/lib/jenkins/.ssh/id_rsa + +5. 配置 SSH 密钥 + - 确保 Jenkins 用户有访问 Gerrit 的 SSH 密钥 + - 将您的 SSH 私钥复制到: /var/lib/jenkins/.ssh/id_rsa + - 设置权限: sudo chown jenkins:jenkins /var/lib/jenkins/.ssh/id_rsa + - 设置权限: sudo chmod 600 /var/lib/jenkins/.ssh/id_rsa + +6. 测试连接 + - 在 Gerrit Trigger 配置中点击 "Test Connection" + - 如果成功,会显示 Gerrit 版本信息 + +7. 创建流水线任务 + - 新建任务 → 流水线 + - 在 Pipeline 脚本中配置 Gerrit Trigger + +示例 Pipeline 脚本: +pipeline { + agent any + triggers { + gerrit( + serverName: 'Gerrit-Server', + events: [changeMerged(), patchsetCreated()], + project: 'plain:.*', + branch: 'plain:.*' + ) + } + stages { + stage('构建') { + steps { + sh 'echo "开始构建..."' + } + } + } +} + +======================================== +EOF + + echo -e "${GREEN}配置指南已保存到: /tmp/gerrit_integration_guide.txt${NC}" +} + +# 输出访问信息 +print_info() { + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN}Jenkins 安装完成!${NC}" + echo -e "${GREEN}========================================${NC}" + echo -e "${YELLOW}访问地址:${NC}" + echo -e " Jenkins Web 界面: http://${GERRIT_HOST}:${JENKINS_PORT}" + echo -e " Gerrit Web 界面: http://${GERRIT_HOST}:${GERRIT_PORT}" + echo -e "" + echo -e "${YELLOW}初始管理员密码:${NC}" + if [ -f /var/lib/jenkins/secrets/initialAdminPassword ]; then + INITIAL_PASSWORD=$(sudo cat /var/lib/jenkins/secrets/initialAdminPassword) + echo -e " ${INITIAL_PASSWORD}" + else + echo -e " (未找到,可能已初始化)" + fi + echo -e "" + echo -e "${YELLOW}常用命令:${NC}" + echo -e " 启动: sudo systemctl start jenkins" + echo -e " 停止: sudo systemctl stop jenkins" + echo -e " 重启: sudo systemctl restart jenkins" + echo -e " 状态: sudo systemctl status jenkins" + echo -e " 日志: sudo journalctl -u jenkins -f" + echo -e "" + echo -e "${YELLOW}配置文件位置:${NC}" + echo -e " Jenkins 配置: /var/lib/jenkins/config.xml" + echo -e " Jenkins 端口: /etc/sysconfig/jenkins" + echo -e "" + echo -e "${YELLOW}下一步:${NC}" + echo -e " 1. 访问 http://${GERRIT_HOST}:${JENKINS_PORT}" + echo -e " 2. 使用初始密码登录" + echo -e " 3. 安装 Gerrit Trigger 插件" + echo -e " 4. 配置 Gerrit 连接" + echo -e " 5. 查看配置指南: cat /tmp/gerrit_integration_guide.txt" + echo -e "${GREEN}========================================${NC}" +} + +# 主函数 +main() { + detect_os + check_java + install_jenkins + configure_jenkins + start_jenkins + get_initial_password + create_gerrit_config_example + print_info +} + +# 执行主函数 +main + diff --git a/install_webhook_ci.sh b/install_webhook_ci.sh new file mode 100755 index 0000000..6c1d9e5 --- /dev/null +++ b/install_webhook_ci.sh @@ -0,0 +1,484 @@ +#!/bin/bash + +# Webhook CI 安装脚本(轻量级,适合个人小团队) +# 支持 CentOS/RHEL 系统 + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_HOST="${GERRIT_HOST:-101.43.95.130}" +GERRIT_PORT="${GERRIT_PORT:-8080}" +WEBHOOK_PORT="${WEBHOOK_PORT:-9000}" +# 使用用户目录,避免需要 sudo +CI_SCRIPTS_DIR="${CI_SCRIPTS_DIR:-${HOME}/ci-scripts}" +WEBHOOK_USER="${USER}" + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Webhook CI 自动化安装脚本${NC}" +echo -e "${GREEN}(轻量级,适合个人小团队)${NC}" +echo -e "${GREEN}========================================${NC}" + +# 检查 Python3 +check_python() { + echo -e "${GREEN}检查 Python3 环境...${NC}" + if ! command -v python3 &> /dev/null; then + echo -e "${RED}未检测到 Python3,请先安装 Python3${NC}" + echo -e "${YELLOW}执行: sudo yum install -y python3${NC}" + exit 1 + fi + echo -e "${GREEN}Python3 版本: $(python3 --version)${NC}" +} + +# 创建工作目录 +create_directories() { + echo -e "${GREEN}创建工作目录...${NC}" + mkdir -p ${CI_SCRIPTS_DIR} + cd ${CI_SCRIPTS_DIR} + echo -e "${GREEN}目录创建完成: ${CI_SCRIPTS_DIR}${NC}" +} + +# 创建 Webhook 接收器 +create_webhook_receiver() { + echo -e "${GREEN}创建 Webhook 接收器...${NC}" + + cat > ${CI_SCRIPTS_DIR}/webhook_receiver.py << EOF +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Gerrit Webhook 接收器 +接收 Gerrit 事件并触发构建脚本 +""" +from http.server import HTTPServer, BaseHTTPRequestHandler +import json +import subprocess +import os +import logging +from datetime import datetime + +# 获取脚本所在目录 +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) + +# 配置日志 +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + handlers=[ + logging.FileHandler(os.path.join(SCRIPT_DIR, 'webhook.log')), + logging.StreamHandler() + ] +) + +class WebhookHandler(BaseHTTPRequestHandler): + def log_message(self, format, *args): + """重写日志方法,使用 logging""" + logging.info("%s - - [%s] %s" % (self.address_string(), self.log_date_time_string(), format % args)) + + def do_GET(self): + """处理 GET 请求(健康检查)""" + self.send_response(200) + self.send_header('Content-type', 'text/html; charset=utf-8') + self.end_headers() + self.wfile.write(b'

Webhook CI Receiver

Status: OK

') + + def do_POST(self): + """处理 POST 请求(Gerrit Webhook)""" + try: + content_length = int(self.headers.get('Content-Length', 0)) + post_data = self.rfile.read(content_length) + + if not post_data: + self.send_response(400) + self.end_headers() + return + + # 解析 JSON + try: + event = json.loads(post_data.decode('utf-8')) + except json.JSONDecodeError as e: + logging.error(f"JSON 解析错误: {e}") + self.send_response(400) + self.end_headers() + return + + # 记录事件 + event_type = event.get('type', 'unknown') + logging.info(f"收到事件: {event_type}") + + # 处理不同类型的事件 + if event_type == 'patchset-created': + self.handle_patchset_created(event) + elif event_type == 'change-merged': + self.handle_change_merged(event) + elif event_type == 'comment-added': + self.handle_comment_added(event) + else: + logging.info(f"未处理的事件类型: {event_type}") + + self.send_response(200) + self.send_header('Content-type', 'application/json; charset=utf-8') + self.end_headers() + self.wfile.write(json.dumps({'status': 'ok'}).encode('utf-8')) + + except Exception as e: + logging.error(f"处理请求时出错: {e}", exc_info=True) + self.send_response(500) + self.end_headers() + self.wfile.write(json.dumps({'error': str(e)}).encode('utf-8')) + + def handle_patchset_created(self, event): + """处理 patchset-created 事件""" + change = event.get('change', {}) + project = change.get('project', '') + branch = change.get('branch', '') + change_id = change.get('id', '') + patchset = event.get('patchSet', {}) + patchset_number = patchset.get('number', '') + + logging.info(f"Patchset 创建: 项目={project}, 分支={branch}, Change={change_id}, Patchset={patchset_number}") + + # 触发构建脚本(异步执行) + script_path = os.path.join(SCRIPT_DIR, 'build.sh') + if os.path.exists(script_path): + env = os.environ.copy() + env.update({ + 'GERRIT_PROJECT': project, + 'GERRIT_BRANCH': branch, + 'GERRIT_CHANGE_ID': change_id, + 'GERRIT_PATCHSET_NUMBER': str(patchset_number), + 'GERRIT_EVENT': 'patchset-created' + }) + subprocess.Popen(['bash', script_path], env=env) + logging.info(f"已触发构建脚本: {script_path}") + else: + logging.warning(f"构建脚本不存在: {script_path}") + + def handle_change_merged(self, event): + """处理 change-merged 事件(代码合并后)""" + change = event.get('change', {}) + project = change.get('project', '') + branch = change.get('branch', '') + + logging.info(f"Change 合并: 项目={project}, 分支={branch}") + + # 触发部署脚本(异步执行) + script_path = os.path.join(SCRIPT_DIR, 'deploy.sh') + if os.path.exists(script_path): + env = os.environ.copy() + env.update({ + 'GERRIT_PROJECT': project, + 'GERRIT_BRANCH': branch, + 'GERRIT_EVENT': 'change-merged' + }) + subprocess.Popen(['bash', script_path], env=env) + logging.info(f"已触发部署脚本: {script_path}") + else: + logging.info(f"部署脚本不存在: {script_path}(跳过)") + + def handle_comment_added(self, event): + """处理 comment-added 事件(代码审查评论)""" + change = event.get('change', {}) + comment = event.get('comment', '') + + # 如果评论包含特定关键词,触发构建 + if 'retest' in comment.lower() or 'test' in comment.lower(): + logging.info("检测到测试关键词,触发构建") + self.handle_patchset_created(event) + +if __name__ == '__main__': + port = int(os.environ.get('WEBHOOK_PORT', 9000)) + server = HTTPServer(('0.0.0.0', port), WebhookHandler) + logging.info(f"Webhook 接收器启动在端口 {port}") + try: + server.serve_forever() + except KeyboardInterrupt: + logging.info("收到中断信号,正在关闭...") + server.shutdown() +EOF + + chmod +x ${CI_SCRIPTS_DIR}/webhook_receiver.py + echo -e "${GREEN}Webhook 接收器创建完成${NC}" +} + +# 创建构建脚本模板 +create_build_script() { + echo -e "${GREEN}创建构建脚本模板...${NC}" + + cat > ${CI_SCRIPTS_DIR}/build.sh << 'EOF' +#!/bin/bash +# 构建脚本模板 +# 根据 Gerrit 事件自动触发 + +set -e + +# 获取环境变量 +PROJECT="${GERRIT_PROJECT}" +BRANCH="${GERRIT_BRANCH}" +CHANGE_ID="${GERRIT_CHANGE_ID}" +PATCHSET="${GERRIT_PATCHSET_NUMBER}" +EVENT="${GERRIT_EVENT}" + +# 获取脚本所在目录 +SCRIPT_DIR="$(cd "$(dirname "\${BASH_SOURCE[0]}")" && pwd)" + +# 日志文件 +LOG_FILE="\${SCRIPT_DIR}/build.log" +BUILD_DIR="/tmp/ci-builds/\${PROJECT}" + +echo "=========================================" | tee -a ${LOG_FILE} +echo "构建开始: $(date)" | tee -a ${LOG_FILE} +echo "项目: ${PROJECT}" | tee -a ${LOG_FILE} +echo "分支: ${BRANCH}" | tee -a ${LOG_FILE} +echo "Change ID: ${CHANGE_ID}" | tee -a ${LOG_FILE} +echo "Patchset: ${PATCHSET}" | tee -a ${LOG_FILE} +echo "=========================================" | tee -a ${LOG_FILE} + +# 创建构建目录 +mkdir -p ${BUILD_DIR} +cd ${BUILD_DIR} + +# 克隆或更新代码 +if [ -d "${PROJECT}" ]; then + echo "更新代码..." | tee -a ${LOG_FILE} + cd ${PROJECT} + git fetch origin + git checkout ${BRANCH} + git pull origin ${BRANCH} +else + echo "克隆代码..." | tee -a ${LOG_FILE} + git clone ssh://admin@101.43.95.130:29418/${PROJECT} + cd ${PROJECT} + git checkout ${BRANCH} +fi + +# 根据项目类型执行构建 +if [ -f "pom.xml" ]; then + echo "检测到 Maven 项目,执行 Maven 构建..." | tee -a ${LOG_FILE} + mvn clean package -DskipTests || { + echo "Maven 构建失败" | tee -a ${LOG_FILE} + exit 1 + } +elif [ -f "package.json" ]; then + echo "检测到 Node.js 项目,执行 npm 构建..." | tee -a ${LOG_FILE} + npm install && npm run build || { + echo "npm 构建失败" | tee -a ${LOG_FILE} + exit 1 + } +elif [ -f "Makefile" ]; then + echo "检测到 Makefile,执行 make..." | tee -a ${LOG_FILE} + make || { + echo "Make 构建失败" | tee -a ${LOG_FILE} + exit 1 + } +else + echo "未检测到构建配置文件,跳过构建" | tee -a ${LOG_FILE} +fi + +echo "构建完成: $(date)" | tee -a ${LOG_FILE} +echo "=========================================" | tee -a ${LOG_FILE} +EOF + + chmod +x ${CI_SCRIPTS_DIR}/build.sh + echo -e "${GREEN}构建脚本模板创建完成${NC}" +} + +# 创建部署脚本模板 +create_deploy_script() { + echo -e "${GREEN}创建部署脚本模板...${NC}" + + cat > ${CI_SCRIPTS_DIR}/deploy.sh << 'EOF' +#!/bin/bash +# 部署脚本模板 +# 在代码合并后自动触发 + +set -e + +PROJECT="${GERRIT_PROJECT}" +BRANCH="${GERRIT_BRANCH}" + +# 获取脚本所在目录 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +LOG_FILE="${SCRIPT_DIR}/deploy.log" + +echo "=========================================" | tee -a ${LOG_FILE} +echo "部署开始: $(date)" | tee -a ${LOG_FILE} +echo "项目: ${PROJECT}" | tee -a ${LOG_FILE} +echo "分支: ${BRANCH}" | tee -a ${LOG_FILE} +echo "=========================================" | tee -a ${LOG_FILE} + +# 在这里添加您的部署逻辑 +# 例如: +# - 复制构建产物到部署目录 +# - 重启服务 +# - 发送通知等 + +echo "部署完成: $(date)" | tee -a ${LOG_FILE} +echo "=========================================" | tee -a ${LOG_FILE} +EOF + + chmod +x ${CI_SCRIPTS_DIR}/deploy.sh + echo -e "${GREEN}部署脚本模板创建完成${NC}" +} + +# 创建启动脚本 +create_start_script() { + echo -e "${GREEN}创建启动脚本...${NC}" + + cat > ${CI_SCRIPTS_DIR}/start_webhook.sh << EOF +#!/bin/bash +# Webhook CI 启动脚本 + +cd ${CI_SCRIPTS_DIR} +export WEBHOOK_PORT=${WEBHOOK_PORT} + +# 检查是否已在运行 +if pgrep -f "webhook_receiver.py" > /dev/null; then + echo "Webhook CI 已在运行中" + exit 1 +fi + +# 启动服务(后台运行) +nohup python3 ${CI_SCRIPTS_DIR}/webhook_receiver.py > ${CI_SCRIPTS_DIR}/webhook_stdout.log 2>&1 & + +echo "Webhook CI 已启动,PID: \$!" +echo "日志文件: ${CI_SCRIPTS_DIR}/webhook.log" +echo "标准输出: ${CI_SCRIPTS_DIR}/webhook_stdout.log" +EOF + + chmod +x ${CI_SCRIPTS_DIR}/start_webhook.sh + + # 创建停止脚本 + cat > ${CI_SCRIPTS_DIR}/stop_webhook.sh << EOF +#!/bin/bash +# Webhook CI 停止脚本 + +PID=\$(pgrep -f "webhook_receiver.py") +if [ -n "\$PID" ]; then + kill \$PID + echo "Webhook CI 已停止 (PID: \$PID)" +else + echo "Webhook CI 未运行" +fi +EOF + + chmod +x ${CI_SCRIPTS_DIR}/stop_webhook.sh + + # 创建状态检查脚本 + cat > ${CI_SCRIPTS_DIR}/status_webhook.sh << EOF +#!/bin/bash +# Webhook CI 状态检查脚本 + +PID=\$(pgrep -f "webhook_receiver.py") +if [ -n "\$PID" ]; then + echo "Webhook CI 正在运行 (PID: \$PID)" + echo "端口: ${WEBHOOK_PORT}" + netstat -tlnp 2>/dev/null | grep ${WEBHOOK_PORT} || ss -tlnp 2>/dev/null | grep ${WEBHOOK_PORT} || echo "端口监听检查失败" +else + echo "Webhook CI 未运行" +fi +EOF + + chmod +x ${CI_SCRIPTS_DIR}/status_webhook.sh + + echo -e "${GREEN}启动/停止脚本创建完成${NC}" +} + +# 启动服务 +start_service() { + echo -e "${GREEN}启动 Webhook CI 服务...${NC}" + + # 检查是否已在运行 + if pgrep -f "webhook_receiver.py" > /dev/null; then + echo -e "${YELLOW}Webhook CI 已在运行中,跳过启动${NC}" + return + fi + + # 启动服务 + cd ${CI_SCRIPTS_DIR} + export WEBHOOK_PORT=${WEBHOOK_PORT} + nohup python3 ${CI_SCRIPTS_DIR}/webhook_receiver.py > ${CI_SCRIPTS_DIR}/webhook_stdout.log 2>&1 & + + # 等待服务启动 + sleep 2 + + if pgrep -f "webhook_receiver.py" > /dev/null; then + PID=$(pgrep -f "webhook_receiver.py") + echo -e "${GREEN}Webhook CI 服务启动成功!(PID: ${PID})${NC}" + else + echo -e "${RED}服务启动失败,请检查日志${NC}" + echo -e "${YELLOW}查看日志: tail -f ${CI_SCRIPTS_DIR}/webhook.log${NC}" + exit 1 + fi +} + +# 检查防火墙 +check_firewall() { + echo -e "${YELLOW}检查防火墙配置...${NC}" + + if command -v firewall-cmd &> /dev/null; then + if sudo firewall-cmd --list-ports | grep -q "${WEBHOOK_PORT}"; then + echo -e "${GREEN}防火墙端口 ${WEBHOOK_PORT} 已开放${NC}" + else + echo -e "${YELLOW}需要开放防火墙端口 ${WEBHOOK_PORT}${NC}" + echo -e "${YELLOW}执行: sudo firewall-cmd --permanent --add-port=${WEBHOOK_PORT}/tcp && sudo firewall-cmd --reload${NC}" + fi + else + echo -e "${YELLOW}未检测到 firewall-cmd,请手动检查防火墙${NC}" + fi +} + +# 输出访问信息 +print_info() { + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN}Webhook CI 安装完成!${NC}" + echo -e "${GREEN}========================================${NC}" + echo -e "${YELLOW}Webhook URL:${NC}" + echo -e " http://${GERRIT_HOST}:${WEBHOOK_PORT}" + echo -e "" + echo -e "${YELLOW}常用命令:${NC}" + echo -e " 启动: ${CI_SCRIPTS_DIR}/start_webhook.sh" + echo -e " 停止: ${CI_SCRIPTS_DIR}/stop_webhook.sh" + echo -e " 状态: ${CI_SCRIPTS_DIR}/status_webhook.sh" + echo -e " 日志: tail -f ${CI_SCRIPTS_DIR}/webhook.log" + echo -e " 标准输出: tail -f ${CI_SCRIPTS_DIR}/webhook_stdout.log" + echo -e " 构建日志: tail -f ${CI_SCRIPTS_DIR}/build.log" + echo -e "" + echo -e "${YELLOW}脚本位置:${NC}" + echo -e " Webhook 接收器: ${CI_SCRIPTS_DIR}/webhook_receiver.py" + echo -e " 构建脚本: ${CI_SCRIPTS_DIR}/build.sh" + echo -e " 部署脚本: ${CI_SCRIPTS_DIR}/deploy.sh" + echo -e "" + echo -e "${YELLOW}下一步 - 配置 Gerrit Webhook:${NC}" + echo -e " 1. 访问 Gerrit: http://${GERRIT_HOST}:${GERRIT_PORT}" + echo -e " 2. 进入项目设置 → Webhooks" + echo -e " 3. 添加 Webhook:" + echo -e " URL: http://${GERRIT_HOST}:${WEBHOOK_PORT}" + echo -e " 事件: patchset-created, change-merged" + echo -e " 4. 根据项目类型修改构建脚本: ${CI_SCRIPTS_DIR}/build.sh" + echo -e "" + echo -e "${YELLOW}测试 Webhook:${NC}" + echo -e " curl http://${GERRIT_HOST}:${WEBHOOK_PORT}" + echo -e "${GREEN}========================================${NC}" +} + +# 主函数 +main() { + check_python + create_directories + create_webhook_receiver + create_build_script + create_deploy_script + create_start_script + start_service + check_firewall + print_info +} + +# 执行主函数 +main + diff --git a/quick_reinstall.sh b/quick_reinstall.sh new file mode 100644 index 0000000..f24fe38 --- /dev/null +++ b/quick_reinstall.sh @@ -0,0 +1,16 @@ +#!/bin/sh +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh stop 2>/dev/null || true +pkill -9 -f gerrit.war 2>/dev/null || true +cd /home/renjianbo/gerrit_install && rm -rf review_site +export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 +export PATH=$JAVA_HOME/bin:$PATH +cd /home/renjianbo/gerrit_install +$JAVA_HOME/bin/java -jar gerrit-3.9.0.war init -d review_site --batch --no-auto-start -D gerrit.canonicalWebUrl=http://101.43.95.130:8080/ --install-plugin=download-commands --install-plugin=replication --install-plugin=reviewnotes +cd review_site +cp bin/gerrit.sh bin/gerrit.sh.bak +sed -i "2i export JAVA_HOME=/usr/local/java/jdk-17.0.12+7\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh +bin/gerrit.sh start +sleep 5 +bin/gerrit.sh status +echo "完成!访问 http://101.43.95.130:8080" + diff --git a/reinit_gerrit.sh b/reinit_gerrit.sh new file mode 100644 index 0000000..7484dfa --- /dev/null +++ b/reinit_gerrit.sh @@ -0,0 +1,192 @@ +#!/bin/bash + +# Gerrit 重新初始化脚本 +# 用于重新创建管理员账号 + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_HOME="/home/renjianbo/gerrit_install" +GERRIT_VERSION="3.9.0" +GERRIT_PORT="8080" +GERRIT_SSH_PORT="29418" +SERVER_IP="101.43.95.130" + +# JDK 17 路径 +JAVA17_HOME="/usr/local/java/jdk-17.0.12+7" +export JAVA_HOME=$JAVA17_HOME +export PATH=$JAVA_HOME/bin:$PATH + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Gerrit 重新初始化脚本${NC}" +echo -e "${GREEN}版本: ${GERRIT_VERSION}${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" + +# 1. 停止服务 +echo -e "${YELLOW}[1/5] 停止 Gerrit 服务...${NC}" +if [ -d "${GERRIT_HOME}/review_site" ]; then + cd ${GERRIT_HOME}/review_site + if [ -f "bin/gerrit.sh" ]; then + bin/gerrit.sh stop 2>/dev/null || true + sleep 2 + fi +fi +echo -e "${GREEN}✓ 服务已停止${NC}" +echo "" + +# 2. 备份数据 +echo -e "${YELLOW}[2/5] 备份现有数据...${NC}" +BACKUP_DIR="${GERRIT_HOME}/backup_before_reinit_$(date +%Y%m%d_%H%M%S)" +mkdir -p ${BACKUP_DIR} + +if [ -d "${GERRIT_HOME}/review_site" ]; then + if [ -d "${GERRIT_HOME}/review_site/git" ]; then + cp -r ${GERRIT_HOME}/review_site/git ${BACKUP_DIR}/ 2>/dev/null || true + echo " ✓ 已备份 Git 仓库" + fi + + if [ -d "${GERRIT_HOME}/review_site/db" ]; then + cp -r ${GERRIT_HOME}/review_site/db ${BACKUP_DIR}/ 2>/dev/null || true + echo " ✓ 已备份数据库" + fi + + if [ -d "${GERRIT_HOME}/review_site/etc" ]; then + cp -r ${GERRIT_HOME}/review_site/etc ${BACKUP_DIR}/ 2>/dev/null || true + echo " ✓ 已备份配置文件" + fi +fi + +echo -e "${GREEN}✓ 数据已备份到: ${BACKUP_DIR}${NC}" +echo "" + +# 3. 删除旧安装 +echo -e "${YELLOW}[3/5] 删除旧安装...${NC}" +if [ -d "${GERRIT_HOME}/review_site" ]; then + rm -rf ${GERRIT_HOME}/review_site + echo -e "${GREEN}✓ 已删除旧的 review_site 目录${NC}" +else + echo -e "${YELLOW}⚠ review_site 目录不存在${NC}" +fi +echo "" + +# 4. 重新初始化 +echo -e "${YELLOW}[4/5] 重新初始化 Gerrit...${NC}" +cd ${GERRIT_HOME} + +if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then + echo -e "${RED}错误: 未找到 gerrit-${GERRIT_VERSION}.war${NC}" + exit 1 +fi + +echo " 正在初始化(这可能需要几分钟)..." +$JAVA_HOME/bin/java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + -D gerrit.canonicalWebUrl=http://${SERVER_IP}:${GERRIT_PORT}/ \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes 2>&1 | tail -20 + +if [ $? -eq 0 ]; then + echo -e "${GREEN}✓ 初始化完成${NC}" +else + echo -e "${YELLOW}⚠ 初始化过程中可能有警告,但可能已成功完成${NC}" +fi +echo "" + +# 5. 配置 Gerrit +echo -e "${YELLOW}[5/5] 配置 Gerrit...${NC}" +cd ${GERRIT_HOME} + +# 创建配置文件 +cat > review_site/etc/gerrit.config << EOCONFIG +[gerrit] + basePath = git + canonicalWebUrl = http://${SERVER_IP}:${GERRIT_PORT}/ + serverId = $(uuidgen 2>/dev/null || echo $(date +%s)) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT + gitBasicAuth = true +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ + cookieSecure = false + cookieSameSite = LAX + cookiePath = / +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOCONFIG + +echo -e "${GREEN}✓ 配置完成${NC}" +echo "" + +# 6. 配置使用 Java 17 启动 +echo -e "${YELLOW}配置启动脚本...${NC}" +cd ${GERRIT_HOME}/review_site + +if [ -f "bin/gerrit.sh" ]; then + cp bin/gerrit.sh bin/gerrit.sh.bak + sed -i "2i export JAVA_HOME=${JAVA17_HOME}\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh + echo -e "${GREEN}✓ 已更新 gerrit.sh 使用 Java 17${NC}" +fi +echo "" + +# 7. 启动服务 +echo -e "${YELLOW}启动 Gerrit 服务...${NC}" +cd ${GERRIT_HOME}/review_site + +bin/gerrit.sh start + +sleep 5 + +# 检查服务状态 +if bin/gerrit.sh status 2>&1 | grep -q "Gerrit running\|Running"; then + echo -e "${GREEN}✓ 服务启动成功${NC}" +else + echo -e "${YELLOW}⚠ 服务可能未完全启动,请检查日志${NC}" +fi +echo "" + +# 输出信息 +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}重新初始化完成!${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" +echo -e "${YELLOW}重要提示:${NC}" +echo -e " 1. 第一个登录的用户将自动成为管理员" +echo -e " 2. 请清除浏览器 Cookie 和缓存" +echo -e " 3. 访问: http://${SERVER_IP}:${GERRIT_PORT}" +echo -e " 4. 点击 'Sign In',输入用户名(例如:admin)" +echo -e " 5. 第一个登录的用户将自动成为管理员" +echo "" +echo -e "${YELLOW}访问信息:${NC}" +echo -e " Web 界面: http://${SERVER_IP}:${GERRIT_PORT}" +echo -e " SSH 端口: ${GERRIT_SSH_PORT}" +echo "" +echo -e "${YELLOW}备份位置:${NC}" +echo -e " ${BACKUP_DIR}" +echo "" +echo -e "${YELLOW}常用命令:${NC}" +echo -e " 查看状态: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh status" +echo -e " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/error_log" +echo -e " 停止服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh stop" +echo -e " 重启服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh restart" +echo "" +echo -e "${GREEN}========================================${NC}" + diff --git a/reinstall_gerrit.py b/reinstall_gerrit.py new file mode 100644 index 0000000..1578964 --- /dev/null +++ b/reinstall_gerrit.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import os +import subprocess +import sys +import time + +def run_cmd(cmd, check=True): + """执行命令""" + print(f"执行: {cmd}") + try: + result = subprocess.run(cmd, shell=True, check=check, capture_output=True, text=True) + if result.stdout: + print(result.stdout) + return result.returncode == 0 + except Exception as e: + print(f"错误: {e}") + return False + +def main(): + print("=" * 50) + print("Gerrit 完全重新安装") + print("=" * 50) + print() + + gerrit_home = "/home/renjianbo/gerrit_install" + java_home = "/usr/local/java/jdk-17.0.12+7" + + # 1. 停止服务 + print("[1/6] 停止服务...") + os.chdir(f"{gerrit_home}/review_site") + run_cmd("bin/gerrit.sh stop", check=False) + time.sleep(2) + run_cmd("pkill -9 -f gerrit.war", check=False) + print("✓ 服务已停止\n") + + # 2. 删除旧安装 + print("[2/6] 删除旧安装...") + os.chdir(gerrit_home) + run_cmd("rm -rf review_site", check=False) + print("✓ 已删除\n") + + # 3. 检查 war 文件 + print("[3/6] 检查安装包...") + if not os.path.exists(f"{gerrit_home}/gerrit-3.9.0.war"): + print("下载 Gerrit...") + run_cmd(f"cd {gerrit_home} && wget -q https://gerrit-releases.storage.googleapis.com/gerrit-3.9.0.war") + print("✓ 安装包就绪\n") + + # 4. 重新初始化 + print("[4/6] 重新初始化...") + os.chdir(gerrit_home) + env = os.environ.copy() + env['JAVA_HOME'] = java_home + env['PATH'] = f"{java_home}/bin:{env.get('PATH', '')}" + + cmd = f"{java_home}/bin/java -jar gerrit-3.9.0.war init -d review_site --batch --no-auto-start -D gerrit.canonicalWebUrl=http://101.43.95.130:8080/ --install-plugin=download-commands --install-plugin=replication --install-plugin=reviewnotes" + run_cmd(cmd) + print("✓ 初始化完成\n") + + # 5. 配置启动脚本 + print("[5/6] 配置启动脚本...") + os.chdir(f"{gerrit_home}/review_site") + run_cmd("cp bin/gerrit.sh bin/gerrit.sh.bak", check=False) + with open("bin/gerrit.sh", "r") as f: + content = f.read() + new_content = f"#!/bin/bash\nexport JAVA_HOME={java_home}\nexport PATH=$JAVA_HOME/bin:$PATH\n" + content.split("\n", 1)[1] if "\n" in content else content + with open("bin/gerrit.sh", "w") as f: + f.write(new_content) + print("✓ 配置完成\n") + + # 6. 启动服务 + print("[6/6] 启动服务...") + run_cmd("bin/gerrit.sh start") + time.sleep(5) + run_cmd("bin/gerrit.sh status") + print("✓ 服务已启动\n") + + print("=" * 50) + print("安装完成!") + print("=" * 50) + print("\n访问地址: http://101.43.95.130:8080") + print("第一个登录的用户将自动成为管理员") + +if __name__ == "__main__": + main() + diff --git a/reinstall_gerrit.sh b/reinstall_gerrit.sh new file mode 100755 index 0000000..4322649 --- /dev/null +++ b/reinstall_gerrit.sh @@ -0,0 +1,208 @@ +#!/bin/bash + +# Gerrit 重新安装脚本 +# 用于完全清理并重新安装 Gerrit + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_HOME="/home/renjianbo/gerrit_install" +GERRIT_VERSION="3.5.0.1" +GERRIT_PORT="8080" +GERRIT_SSH_PORT="29418" +SERVER_IP="101.43.95.130" + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Gerrit 重新安装脚本${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" + +# 1. 停止现有服务 +echo -e "${YELLOW}[1/6] 停止现有 Gerrit 服务...${NC}" +if [ -d "${GERRIT_HOME}/review_site" ]; then + cd ${GERRIT_HOME}/review_site + if [ -f "bin/gerrit.sh" ]; then + bin/gerrit.sh stop 2>/dev/null || true + sleep 2 + fi +fi +echo -e "${GREEN}✓ 服务已停止${NC}" +echo "" + +# 2. 备份现有数据(可选) +echo -e "${YELLOW}[2/6] 备份现有数据...${NC}" +BACKUP_DIR="${GERRIT_HOME}/backup_$(date +%Y%m%d_%H%M%S)" +mkdir -p ${BACKUP_DIR} + +if [ -d "${GERRIT_HOME}/review_site" ]; then + # 备份 Git 仓库 + if [ -d "${GERRIT_HOME}/review_site/git" ]; then + echo " 备份 Git 仓库..." + cp -r ${GERRIT_HOME}/review_site/git ${BACKUP_DIR}/ 2>/dev/null || true + fi + + # 备份数据库 + if [ -d "${GERRIT_HOME}/review_site/db" ]; then + echo " 备份数据库..." + cp -r ${GERRIT_HOME}/review_site/db ${BACKUP_DIR}/ 2>/dev/null || true + fi + + # 备份配置 + if [ -d "${GERRIT_HOME}/review_site/etc" ]; then + echo " 备份配置文件..." + cp -r ${GERRIT_HOME}/review_site/etc ${BACKUP_DIR}/ 2>/dev/null || true + fi +fi + +echo -e "${GREEN}✓ 数据已备份到: ${BACKUP_DIR}${NC}" +echo "" + +# 3. 清理旧安装 +echo -e "${YELLOW}[3/6] 清理旧安装...${NC}" +if [ -d "${GERRIT_HOME}/review_site" ]; then + rm -rf ${GERRIT_HOME}/review_site + echo " 已删除旧的 review_site 目录" +fi +echo -e "${GREEN}✓ 清理完成${NC}" +echo "" + +# 4. 检查并下载 Gerrit +echo -e "${YELLOW}[4/6] 检查 Gerrit 安装包...${NC}" +cd ${GERRIT_HOME} + +if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then + echo " 下载 Gerrit ${GERRIT_VERSION}..." + wget -q --show-progress https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war +else + echo " Gerrit ${GERRIT_VERSION} 已存在,跳过下载" +fi +echo -e "${GREEN}✓ Gerrit 安装包就绪${NC}" +echo "" + +# 5. 重新初始化 Gerrit +echo -e "${YELLOW}[5/6] 初始化 Gerrit...${NC}" +cd ${GERRIT_HOME} + +# 检查 Java 版本并使用 Java 17(优先)或 Java 11 +JAVA17_HOME="/usr/local/java/jdk-17.0.12+7" +JAVA11_HOME="/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64" + +if [ -d "$JAVA17_HOME" ]; then + export JAVA_HOME=$JAVA17_HOME + export PATH=$JAVA_HOME/bin:$PATH + echo " 使用 Java 17: $JAVA_HOME" + $JAVA_HOME/bin/java -version 2>&1 | head -1 +elif [ -d "$JAVA11_HOME" ]; then + export JAVA_HOME=$JAVA11_HOME + export PATH=$JAVA_HOME/bin:$PATH + echo " 使用 Java 11: $JAVA_HOME" + $JAVA_HOME/bin/java -version 2>&1 | head -1 +else + # 检查默认 Java 版本 + JAVA_VERSION=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1) + if [ "$JAVA_VERSION" -lt 11 ]; then + echo -e "${RED}错误: 需要 Java 11 或更高版本,当前版本: $JAVA_VERSION${NC}" + echo "请先安装 Java 11 或 Java 17" + exit 1 + fi +fi + +# 非交互式初始化 +echo " 正在初始化(这可能需要几分钟)..." +$JAVA_HOME/bin/java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes || true + +echo -e "${GREEN}✓ 初始化完成${NC}" +echo "" + +# 6. 配置 Gerrit +echo -e "${YELLOW}[6/6] 配置 Gerrit...${NC}" +cd ${GERRIT_HOME} + +# 创建配置文件(使用正确的 IP 和 Cookie 设置) +cat > review_site/etc/gerrit.config << EOCONFIG +[gerrit] + basePath = git + canonicalWebUrl = http://${SERVER_IP}:${GERRIT_PORT}/ + serverId = $(uuidgen 2>/dev/null || echo $(date +%s)) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ + cookieSecure = false + cookieSameSite = LAX +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOCONFIG + +echo -e "${GREEN}✓ 配置完成${NC}" +echo "" + +# 7. 启动服务 +echo -e "${YELLOW}启动 Gerrit 服务...${NC}" +cd ${GERRIT_HOME}/review_site + +# 使用 Java 17 启动(如果可用),否则使用 Java 11 +if [ -d "/usr/local/java/jdk-17.0.12+7" ]; then + JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start +elif [ -d "/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64" ]; then + JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start +else + bin/gerrit.sh start +fi + +sleep 5 + +# 检查服务状态 +if bin/gerrit.sh status | grep -q "Gerrit running"; then + echo -e "${GREEN}✓ 服务启动成功${NC}" +else + echo -e "${YELLOW}⚠ 服务可能未完全启动,请检查日志${NC}" +fi + +echo "" +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}重新安装完成!${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" +echo -e "${YELLOW}访问信息:${NC}" +echo -e " Web 界面: http://${SERVER_IP}:${GERRIT_PORT}" +echo -e " SSH 端口: ${GERRIT_SSH_PORT}" +echo "" +echo -e "${YELLOW}首次登录:${NC}" +echo -e " 1. 访问 http://${SERVER_IP}:${GERRIT_PORT}" +echo -e " 2. 点击 'Sign In'" +echo -e " 3. 点击 'New Account' 注册新账户" +echo -e " 4. 第一个注册的用户将自动成为管理员" +echo "" +echo -e "${YELLOW}备份位置:${NC}" +echo -e " ${BACKUP_DIR}" +echo "" +echo -e "${YELLOW}常用命令:${NC}" +echo -e " 查看状态: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh status" +echo -e " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/httpd_log" +echo -e " 停止服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh stop" +echo -e " 重启服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh restart" +echo "" +echo -e "${GREEN}========================================${NC}" + diff --git a/test_cookie.html b/test_cookie.html new file mode 100644 index 0000000..d764be2 --- /dev/null +++ b/test_cookie.html @@ -0,0 +1,46 @@ + + + + Gerrit Cookie 测试 + + + +

Gerrit Cookie 测试页面

+

这个页面用于测试浏览器是否能正确保存 Cookie。

+ +

测试步骤:

+
    +
  1. 打开浏览器开发者工具(F12)
  2. +
  3. 切换到 Application 标签
  4. +
  5. 查看 Cookies → http://101.43.95.130:8080
  6. +
  7. 点击下面的按钮测试 Cookie
  8. +
+ + +
+ + + +
+

Gerrit 登录链接:

+

点击这里使用 Account ID 1000000 登录

+ + + diff --git a/upgrade_gerrit.sh b/upgrade_gerrit.sh new file mode 100755 index 0000000..ce6d78c --- /dev/null +++ b/upgrade_gerrit.sh @@ -0,0 +1,260 @@ +#!/bin/bash + +# Gerrit 升级脚本 +# 将 Gerrit 升级到最新版本(支持 JDK 17) + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_HOME="/home/renjianbo/gerrit_install" +GERRIT_VERSION="3.5.0.1" +GERRIT_PORT="8080" +GERRIT_SSH_PORT="29418" +SERVER_IP="101.43.95.130" + +# JDK 17 路径 +JAVA17_HOME="/usr/local/java/jdk-17.0.12+7" +if [ ! -d "$JAVA17_HOME" ]; then + # 尝试其他可能的位置 + JAVA17_HOME="/opt/java17" + if [ ! -d "$JAVA17_HOME" ]; then + echo -e "${RED}错误: 未找到 JDK 17${NC}" + echo "请先安装 JDK 17 或修改脚本中的 JAVA17_HOME 路径" + exit 1 + fi +fi + +export JAVA_HOME=$JAVA17_HOME +export PATH=$JAVA_HOME/bin:$PATH + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Gerrit 升级脚本${NC}" +echo -e "${GREEN}目标版本: ${GERRIT_VERSION}${NC}" +echo -e "${GREEN}使用 JDK: ${JAVA_HOME}${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" + +# 验证 Java 17 +echo -e "${YELLOW}[1/7] 验证 Java 17 安装...${NC}" +$JAVA_HOME/bin/java -version 2>&1 | head -1 +if ! $JAVA_HOME/bin/java -version 2>&1 | grep -q "17"; then + echo -e "${RED}错误: 指定的 Java 不是版本 17${NC}" + exit 1 +fi +echo -e "${GREEN}✓ Java 17 验证通过${NC}" +echo "" + +# 1. 停止现有服务 +echo -e "${YELLOW}[2/7] 停止现有 Gerrit 服务...${NC}" +if [ -d "${GERRIT_HOME}/review_site" ]; then + cd ${GERRIT_HOME}/review_site + if [ -f "bin/gerrit.sh" ]; then + bin/gerrit.sh stop 2>/dev/null || true + sleep 3 + echo -e "${GREEN}✓ 服务已停止${NC}" + else + echo -e "${YELLOW}⚠ Gerrit 服务脚本不存在,可能未运行${NC}" + fi +else + echo -e "${YELLOW}⚠ review_site 目录不存在,将进行全新安装${NC}" +fi +echo "" + +# 2. 备份现有数据 +echo -e "${YELLOW}[3/7] 备份现有数据...${NC}" +BACKUP_DIR="${GERRIT_HOME}/backup_$(date +%Y%m%d_%H%M%S)" +mkdir -p ${BACKUP_DIR} + +if [ -d "${GERRIT_HOME}/review_site" ]; then + # 备份 Git 仓库 + if [ -d "${GERRIT_HOME}/review_site/git" ]; then + echo " 备份 Git 仓库..." + cp -r ${GERRIT_HOME}/review_site/git ${BACKUP_DIR}/ 2>/dev/null || true + fi + + # 备份数据库 + if [ -d "${GERRIT_HOME}/review_site/db" ]; then + echo " 备份数据库..." + cp -r ${GERRIT_HOME}/review_site/db ${BACKUP_DIR}/ 2>/dev/null || true + fi + + # 备份配置 + if [ -d "${GERRIT_HOME}/review_site/etc" ]; then + echo " 备份配置文件..." + cp -r ${GERRIT_HOME}/review_site/etc ${BACKUP_DIR}/ 2>/dev/null || true + fi + + # 备份插件 + if [ -d "${GERRIT_HOME}/review_site/plugins" ]; then + echo " 备份插件..." + cp -r ${GERRIT_HOME}/review_site/plugins ${BACKUP_DIR}/ 2>/dev/null || true + fi + + echo -e "${GREEN}✓ 数据已备份到: ${BACKUP_DIR}${NC}" +else + echo -e "${YELLOW}⚠ 没有现有数据需要备份${NC}" +fi +echo "" + +# 3. 下载新版本 Gerrit +echo -e "${YELLOW}[4/7] 下载 Gerrit ${GERRIT_VERSION}...${NC}" +cd ${GERRIT_HOME} + +if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then + echo " 正在下载 Gerrit ${GERRIT_VERSION}..." + wget -q https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war + if [ $? -ne 0 ]; then + echo -e "${RED}下载失败,请检查网络连接${NC}" + exit 1 + fi + echo -e "${GREEN}✓ 下载完成${NC}" +else + echo -e "${GREEN}✓ Gerrit ${GERRIT_VERSION} 已存在,跳过下载${NC}" +fi +echo "" + +# 4. 升级 Gerrit(如果已存在) +if [ -d "${GERRIT_HOME}/review_site" ]; then + echo -e "${YELLOW}[5/7] 升级 Gerrit...${NC}" + cd ${GERRIT_HOME} + + echo " 正在升级(这可能需要几分钟)..." + $JAVA_HOME/bin/java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes 2>&1 | tail -20 + + if [ $? -eq 0 ]; then + echo -e "${GREEN}✓ 升级完成${NC}" + else + echo -e "${YELLOW}⚠ 升级过程中可能有警告,但可能已成功完成${NC}" + fi +else + echo -e "${YELLOW}[5/7] 初始化 Gerrit(全新安装)...${NC}" + cd ${GERRIT_HOME} + + echo " 正在初始化(这可能需要几分钟)..." + $JAVA_HOME/bin/java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + -D gerrit.canonicalWebUrl=http://${SERVER_IP}:${GERRIT_PORT}/ \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes 2>&1 | tail -20 + + if [ $? -eq 0 ]; then + echo -e "${GREEN}✓ 初始化完成${NC}" + else + echo -e "${YELLOW}⚠ 初始化过程中可能有警告,但可能已成功完成${NC}" + fi +fi +echo "" + +# 5. 配置 Gerrit +echo -e "${YELLOW}[6/7] 配置 Gerrit...${NC}" +cd ${GERRIT_HOME} + +# 如果配置文件不存在,创建它 +if [ ! -f "review_site/etc/gerrit.config" ]; then + cat > review_site/etc/gerrit.config << EOCONFIG +[gerrit] + basePath = git + canonicalWebUrl = http://${SERVER_IP}:${GERRIT_PORT}/ + serverId = $(uuidgen 2>/dev/null || echo $(date +%s)) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT + gitBasicAuth = true +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ + cookieSecure = false + cookieSameSite = LAX + cookiePath = / +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOCONFIG + echo -e "${GREEN}✓ 配置文件已创建${NC}" +else + # 更新现有配置(保留用户自定义设置) + echo -e "${GREEN}✓ 使用现有配置文件${NC}" +fi +echo "" + +# 6. 启动服务 +echo -e "${YELLOW}[7/7] 启动 Gerrit 服务...${NC}" +cd ${GERRIT_HOME}/review_site + +# 确保使用 Java 17 +export JAVA_HOME=$JAVA17_HOME +export PATH=$JAVA_HOME/bin:$PATH + +# 更新 gerrit.sh 脚本以使用 Java 17(如果存在) +if [ -f "bin/gerrit.sh" ]; then + # 备份原脚本 + cp bin/gerrit.sh bin/gerrit.sh.bak + + # 在脚本开头添加 JAVA_HOME 设置(如果还没有) + if ! grep -q "JAVA_HOME.*jdk-17" bin/gerrit.sh; then + sed -i "2i export JAVA_HOME=${JAVA17_HOME}" bin/gerrit.sh + sed -i "3i export PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh + fi +fi + +# 启动服务 +bin/gerrit.sh start + +sleep 5 + +# 检查服务状态 +if bin/gerrit.sh status 2>&1 | grep -q "Gerrit running\|Running"; then + echo -e "${GREEN}✓ 服务启动成功${NC}" +else + echo -e "${YELLOW}⚠ 服务可能未完全启动,请检查日志${NC}" + echo -e "${YELLOW}查看日志: tail -f ${GERRIT_HOME}/review_site/logs/error_log${NC}" +fi +echo "" + +# 输出信息 +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}升级完成!${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" +echo -e "${YELLOW}版本信息:${NC}" +echo -e " Gerrit 版本: ${GERRIT_VERSION}" +echo -e " Java 版本: $($JAVA_HOME/bin/java -version 2>&1 | head -1)" +echo "" +echo -e "${YELLOW}访问信息:${NC}" +echo -e " Web 界面: http://${SERVER_IP}:${GERRIT_PORT}" +echo -e " SSH 端口: ${GERRIT_SSH_PORT}" +echo "" +echo -e "${YELLOW}备份位置:${NC}" +if [ -d "${BACKUP_DIR}" ]; then + echo -e " ${BACKUP_DIR}" +fi +echo "" +echo -e "${YELLOW}常用命令:${NC}" +echo -e " 查看状态: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh status" +echo -e " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/error_log" +echo -e " 停止服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh stop" +echo -e " 重启服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh restart" +echo "" +echo -e "${GREEN}========================================${NC}" + diff --git a/一键重新安装.sh b/一键重新安装.sh new file mode 100644 index 0000000..aa0cec8 --- /dev/null +++ b/一键重新安装.sh @@ -0,0 +1,3 @@ +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh stop 2>/dev/null; pkill -9 -f gerrit.war 2>/dev/null; cd /home/renjianbo/gerrit_install && rm -rf review_site && export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 && export PATH=$JAVA_HOME/bin:$PATH && java -jar gerrit-3.9.0.war init -d review_site --batch --no-auto-start -D gerrit.canonicalWebUrl=http://101.43.95.130:8080/ --install-plugin=download-commands --install-plugin=replication --install-plugin=reviewnotes && cd review_site && cp bin/gerrit.sh bin/gerrit.sh.bak && sed -i "2i export JAVA_HOME=/usr/local/java/jdk-17.0.12+7\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh && bin/gerrit.sh start && sleep 5 && echo "完成!访问 http://101.43.95.130:8080" + diff --git a/上传本地项目到Gerrit指南.md b/上传本地项目到Gerrit指南.md new file mode 100644 index 0000000..40cb9c1 --- /dev/null +++ b/上传本地项目到Gerrit指南.md @@ -0,0 +1,272 @@ +# 将本地项目上传到 Gerrit 指南 + +## 前提条件 + +1. ✅ Gerrit 已安装并运行:`http://101.43.95.130:8080` +2. ✅ 已在 Gerrit 创建项目:`zhini_im` +3. ✅ 本地已安装 Git + +## 方法一:已有 Git 仓库(推荐) + +如果 `D:\zhini\zhini_im` 已经是 Git 仓库: + +### 步骤 1:打开 Git Bash 或命令行 + +在 Windows 上: +- 打开 Git Bash(如果安装了 Git for Windows) +- 或者打开 PowerShell/CMD + +### 步骤 2:进入项目目录 + +```bash +cd /d/zhini/zhini_im +# 或 +cd D:\zhini\zhini_im +``` + +### 步骤 3:添加 Gerrit 远程仓库 + +```bash +# 添加 Gerrit 作为远程仓库 +git remote add gerrit http://101.43.95.130:8080/zhini_im +# 或使用 SSH(如果配置了 SSH 密钥) +git remote add gerrit ssh://admin@101.43.95.130:29418/zhini_im +``` + +### 步骤 4:推送代码到 Gerrit + +```bash +# 推送主分支 +git push gerrit HEAD:refs/heads/master + +# 或者推送所有分支 +git push gerrit --all +``` + +## 方法二:首次上传(创建初始提交) + +如果项目还没有 Git 仓库: + +### 步骤 1:初始化 Git 仓库 + +```bash +cd D:\zhini\zhini_im +git init +``` + +### 步骤 2:添加所有文件 + +```bash +git add . +``` + +### 步骤 3:创建初始提交 + +```bash +git commit -m "Initial commit" +``` + +### 步骤 4:配置 Git 用户信息(如果还没配置) + +```bash +git config user.name "admin" +git config user.email "admin@example.com" +``` + +### 步骤 5:添加 Gerrit 远程仓库 + +```bash +git remote add gerrit http://101.43.95.130:8080/zhini_im +``` + +### 步骤 6:推送代码 + +```bash +git push gerrit HEAD:refs/heads/master +``` + +## 方法三:通过代码评审推送(推荐用于后续更新) + +### 步骤 1:配置 Git 远程仓库 + +```bash +cd D:\zhini\zhini_im +git remote add gerrit http://101.43.95.130:8080/zhini_im +``` + +### 步骤 2:推送代码进行评审 + +```bash +# 推送当前分支到评审队列 +git push gerrit HEAD:refs/for/master + +# 如果需要指定主题 +git push gerrit HEAD:refs/for/master%topic=feature-name +``` + +### 步骤 3:在 Gerrit Web 界面进行评审 + +1. 访问:`http://101.43.95.130:8080` +2. 在 "Outgoing reviews" 中查看您的变更 +3. 等待评审或自己评审后合并 + +## 详细操作步骤(Windows) + +### 1. 打开 Git Bash + +- 在项目目录 `D:\zhini\zhini_im` 右键 +- 选择 "Git Bash Here" + +### 2. 检查是否已有 Git 仓库 + +```bash +# 检查是否有 .git 目录 +ls -la | grep .git +``` + +### 3. 如果没有 Git 仓库,初始化 + +```bash +git init +git add . +git commit -m "Initial commit" +``` + +### 4. 配置 Git 用户信息 + +```bash +git config user.name "admin" +git config user.email "admin@example.com" + +# 或全局配置 +git config --global user.name "admin" +git config --global user.email "admin@example.com" +``` + +### 5. 添加 Gerrit 远程仓库 + +```bash +# 使用 HTTP(推荐,简单) +git remote add gerrit http://101.43.95.130:8080/zhini_im + +# 或使用 SSH(需要配置 SSH 密钥) +git remote add gerrit ssh://admin@101.43.95.130:29418/zhini_im +``` + +### 6. 推送代码 + +```bash +# 直接推送到主分支(首次上传) +git push gerrit HEAD:refs/heads/master + +# 或推送到评审队列(后续更新,推荐) +git push gerrit HEAD:refs/for/master +``` + +## 常见问题 + +### Q: 推送时提示需要认证? + +**A:** 在开发模式下,HTTP 推送可能不需要密码,但如果需要: +- 用户名:您注册时使用的用户名(例如:`admin`) +- 密码:留空(开发模式不需要密码) + +### Q: 推送失败,提示 "remote rejected"? + +**A:** 可能的原因: +1. 项目不存在 → 先在 Gerrit 创建项目 +2. 没有推送权限 → 检查项目权限配置 +3. 分支保护 → 使用 `refs/for/master` 推送到评审队列 + +### Q: 如何查看远程仓库? + +```bash +git remote -v +``` + +### Q: 如何更新远程仓库地址? + +```bash +# 删除旧的 +git remote remove gerrit + +# 添加新的 +git remote add gerrit http://101.43.95.130:8080/zhini_im +``` + +## 推送方式对比 + +### 直接推送(`refs/heads/master`) +- ✅ 直接更新主分支 +- ❌ 跳过代码评审流程 +- 适用于:首次上传、管理员直接合并 + +### 评审推送(`refs/for/master`) +- ✅ 进入代码评审流程 +- ✅ 需要评审后才能合并 +- ✅ 符合 Gerrit 工作流程 +- 推荐用于:日常开发、团队协作 + +## 完整示例 + +```bash +# 1. 进入项目目录 +cd D:\zhini\zhini_im + +# 2. 初始化 Git(如果还没有) +git init +git add . +git commit -m "Initial commit" + +# 3. 配置用户信息 +git config user.name "admin" +git config user.email "admin@example.com" + +# 4. 添加 Gerrit 远程仓库 +git remote add gerrit http://101.43.95.130:8080/zhini_im + +# 5. 推送代码(首次上传) +git push gerrit HEAD:refs/heads/master + +# 6. 后续更新(推送到评审队列) +git add . +git commit -m "Update code" +git push gerrit HEAD:refs/for/master +``` + +## 验证上传 + +推送成功后: + +1. 访问:`http://101.43.95.130:8080/#/admin/projects/zhini_im` +2. 应该能看到项目信息 +3. 访问:`http://101.43.95.130:8080/#/q/project:zhini_im` +4. 应该能看到您的变更 + +## 后续操作 + +### 克隆项目(其他团队成员) + +```bash +# 使用 HTTP +git clone http://101.43.95.130:8080/zhini_im + +# 或使用 SSH +git clone ssh://admin@101.43.95.130:29418/zhini_im +``` + +### 日常开发流程 + +```bash +# 1. 修改代码 +# 2. 提交更改 +git add . +git commit -m "描述您的更改" + +# 3. 推送到评审队列 +git push gerrit HEAD:refs/for/master + +# 4. 在 Gerrit Web 界面进行评审 +# 5. 评审通过后,代码会自动合并 +``` + diff --git a/从码云推送到Gerrit指南.md b/从码云推送到Gerrit指南.md new file mode 100644 index 0000000..6e70ef2 --- /dev/null +++ b/从码云推送到Gerrit指南.md @@ -0,0 +1,257 @@ +# 从码云推送到 Gerrit 操作指南 + +## 📋 前提条件 + +- ✅ 已从码云(Gitee)拉取最新代码 +- ✅ 代码仓库在本地已存在 +- ✅ Gerrit 服务器地址:`101.43.95.130:8080` +- ✅ SSH 端口:`29418` +- ✅ 用户名:`renjianbo` + +--- + +## 🚀 操作步骤 + +### 步骤 1:进入代码仓库目录 + +```bash +# 根据您的实际路径,进入代码目录 +cd /d/zhini/zhini_im +# 或者 +cd /path/to/your/project +``` + +### 步骤 2:检查当前 Git 状态 + +```bash +# 查看当前分支和状态 +git status + +# 查看远程仓库配置 +git remote -v +``` + +### 步骤 3:添加 Gerrit 远程仓库 + +**如果还没有配置 Gerrit 远程仓库**: + +```bash +# 方式一:添加为新的远程仓库(推荐,保留码云远程) +git remote add gerrit ssh://renjianbo@101.43.95.130:29418/项目名称 + +# 方式二:替换 origin 为 Gerrit(会替换掉码云的远程) +# git remote set-url origin ssh://renjianbo@101.43.95.130:29418/项目名称 +``` + +**注意**:请将 `项目名称` 替换为 Gerrit 中的实际项目名称。 + +**如果使用 HTTP(不推荐,但可以作为备选)**: + +```bash +git remote add gerrit http://renjianbo@101.43.95.130:8080/项目名称 +``` + +### 步骤 4:安装 commit-msg Hook(重要!) + +Gerrit 需要 Change-Id,必须安装 hook: + +```bash +# 下载 commit-msg hook +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg +``` + +### 步骤 5:检查是否有未提交的更改 + +```bash +# 查看工作区状态 +git status + +# 如果有未提交的更改,需要先提交 +git add . +git commit -m "从码云同步代码" +``` + +### 步骤 6:推送到 Gerrit + +**推送到评审队列(推荐)**: + +```bash +# 推送到 master 分支的评审队列 +git push gerrit HEAD:refs/for/master + +# 如果替换了 origin,使用: +# git push origin HEAD:refs/for/master +``` + +**推送到其他分支**: + +```bash +# 推送到 develop 分支的评审队列 +git push gerrit HEAD:refs/for/develop + +# 推送到 feature 分支的评审队列 +git push gerrit HEAD:refs/for/feature/xxx +``` + +### 步骤 7:查看推送结果 + +推送成功后,会显示类似以下信息: + +``` +remote: Resolving deltas: 100% (X/X) +remote: Processing changes: refs: 1, new: 1 +remote: +remote: SUCCESS +remote: +remote: http://101.43.95.130:8080/c/项目名称/+/1 [NEW] +remote: +To ssh://renjianbo@101.43.95.130:29418/项目名称 + * [new branch] HEAD -> refs/for/master +``` + +复制返回的 URL(如:`http://101.43.95.130:8080/c/项目名称/+/1`)在浏览器中打开查看变更。 + +--- + +## 🔧 常见问题处理 + +### 问题 1:找不到项目 + +**错误信息**: +``` +fatal: Could not read from remote repository. +``` + +**解决方法**: +1. 确认项目名称是否正确 +2. 在 Gerrit Web 界面查看项目列表:`http://101.43.95.130:8080/#/admin/projects/` +3. 如果项目不存在,需要先在 Gerrit 中创建项目 + +### 问题 2:SSH 连接失败 + +**错误信息**: +``` +ssh: connect to host 101.43.95.130 port 29418: Connection timed out +``` + +**解决方法**: +1. 检查 SSH 公钥是否已添加到 Gerrit:`http://101.43.95.130:8080/#/settings/ssh-keys` +2. 测试 SSH 连接: + ```bash + ssh -p 29418 renjianbo@101.43.95.130 gerrit version + ``` +3. 如果 SSH 无法使用,可以临时使用 HTTP + +### 问题 3:缺少 Change-Id + +**错误信息**: +``` +remote: ERROR: missing Change-Id in commit message +``` + +**解决方法**: +1. 确保已安装 commit-msg hook(见步骤 4) +2. 如果已安装但仍有问题,重新安装: + ```bash + curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + chmod +x .git/hooks/commit-msg + ``` +3. 对于已提交的 commit,使用 `git commit --amend` 重新提交 + +### 问题 4:权限不足 + +**错误信息**: +``` +remote: Permission denied +``` + +**解决方法**: +1. 确认您在 Gerrit 中已注册账户 +2. 确认您有该项目的推送权限 +3. 联系管理员添加权限 + +--- + +## 📝 完整示例 + +假设您的项目名称是 `zhini_im`,完整操作如下: + +```bash +# 1. 进入项目目录 +cd /d/zhini/zhini_im + +# 2. 检查状态 +git status +git remote -v + +# 3. 添加 Gerrit 远程仓库 +git remote add gerrit ssh://renjianbo@101.43.95.130:29418/zhini_im + +# 4. 安装 commit-msg hook +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 5. 如果有未提交的更改,先提交 +git add . +git commit -m "从码云同步代码到 Gerrit" + +# 6. 推送到 Gerrit +git push gerrit HEAD:refs/for/master +``` + +--- + +## 🎯 快速参考 + +### 常用命令 + +```bash +# 查看远程仓库 +git remote -v + +# 添加 Gerrit 远程仓库 +git remote add gerrit ssh://renjianbo@101.43.95.130:29418/项目名称 + +# 推送到评审队列 +git push gerrit HEAD:refs/for/master + +# 查看变更列表 +# 浏览器访问:http://101.43.95.130:8080/#/q/status:open +``` + +### 查看项目列表 + +```bash +# 通过 SSH +ssh -p 29418 renjianbo@101.43.95.130 gerrit ls-projects + +# 通过 Web 界面 +# 访问:http://101.43.95.130:8080/#/admin/projects/ +``` + +--- + +## ✅ 检查清单 + +在推送前,请确认: + +- [ ] 已进入正确的代码仓库目录 +- [ ] 已添加 Gerrit 远程仓库 +- [ ] 已安装 commit-msg hook +- [ ] 已提交所有更改(或确认没有未提交的更改) +- [ ] 知道目标分支名称(master/develop 等) +- [ ] SSH 公钥已添加到 Gerrit(如果使用 SSH) +- [ ] 项目已在 Gerrit 中创建 + +--- + +## 📞 需要帮助? + +- 📖 查看其他文档:`Gerrit快速使用指南.md` +- 🌐 访问 Gerrit:`http://101.43.95.130:8080` +- 📝 查看变更:`http://101.43.95.130:8080/#/q/status:open` + + diff --git a/修复上传问题指南.md b/修复上传问题指南.md new file mode 100644 index 0000000..36a53e8 --- /dev/null +++ b/修复上传问题指南.md @@ -0,0 +1,197 @@ +# 修复上传问题指南 + +## 问题分析 + +1. **未提交的更改**:`android-chat-master` 子模块有修改 +2. **远程仓库已存在**:需要更新或删除后重新添加 +3. **SSH 主机密钥验证失败**:重新安装 Gerrit 后 SSH 密钥改变了 + +## 解决方案 + +### 方法一:使用 HTTP(推荐,最简单) + +HTTP 方式不需要 SSH 密钥,更简单。 + +#### 步骤 1:处理未提交的更改 + +```bash +# 查看当前状态 +git status + +# 选项 A:提交所有更改 +git add . +git commit -m "Update code before push to Gerrit" + +# 选项 B:如果不想提交子模块的更改,可以暂存 +git stash +``` + +#### 步骤 2:更新远程仓库(使用 HTTP) + +```bash +# 删除旧的远程仓库 +git remote remove gerrit + +# 重新添加(使用 HTTP,不需要 SSH) +git remote add gerrit http://101.43.95.130:8080/zhini_im + +# 验证 +git remote -v +``` + +#### 步骤 3:推送代码 + +```bash +# 切换到主分支(如果需要) +git checkout -b master 2>/dev/null || git checkout master + +# 推送代码 +git push gerrit HEAD:refs/heads/master +``` + +### 方法二:修复 SSH 密钥问题(如果想用 SSH) + +#### 步骤 1:删除旧的 SSH 主机密钥 + +```bash +# 在 Git Bash 中执行 +ssh-keygen -R [101.43.95.130]:29418 + +# 或者手动编辑 known_hosts 文件 +# 删除 /c/Users/Administrator/.ssh/known_hosts 文件中第 4 行 +``` + +#### 步骤 2:重新添加 SSH 主机密钥 + +```bash +# 重新连接并接受新的主机密钥 +ssh -p 29418 admin@101.43.95.130 + +# 输入 yes 接受新的主机密钥 +``` + +#### 步骤 3:更新远程仓库(使用 SSH) + +```bash +# 删除旧的 +git remote remove gerrit + +# 添加 SSH 远程仓库 +git remote add gerrit ssh://admin@101.43.95.130:29418/zhini_im + +# 推送 +git push gerrit HEAD:refs/heads/master +``` + +## 完整操作步骤(推荐使用 HTTP) + +### 在 Git Bash 中执行: + +```bash +# 1. 进入项目目录 +cd /d/zhini/zhini_im + +# 2. 查看当前状态 +git status + +# 3. 处理未提交的更改 +# 选项 A:提交所有更改 +git add . +git commit -m "Update code before push to Gerrit" + +# 或者选项 B:暂存更改(如果不想现在提交) +# git stash + +# 4. 删除旧的远程仓库 +git remote remove gerrit + +# 5. 添加 HTTP 远程仓库(推荐,不需要 SSH) +git remote add gerrit http://101.43.95.130:8080/zhini_im + +# 6. 验证远程仓库 +git remote -v + +# 7. 切换到主分支(如果需要) +git checkout -b master 2>/dev/null || git checkout master + +# 8. 推送代码 +git push gerrit HEAD:refs/heads/master +``` + +## 如果推送时提示需要认证 + +在开发模式下,HTTP 推送通常不需要密码,但如果提示: + +- **用户名**:`admin`(或您注册的用户名) +- **密码**:留空(开发模式不需要密码) + +## 处理子模块问题 + +如果 `android-chat-master` 是子模块,可以: + +### 选项 1:提交子模块更改 + +```bash +cd android-chat-master +git add . +git commit -m "Update submodule" +cd .. +git add android-chat-master +git commit -m "Update submodule reference" +``` + +### 选项 2:忽略子模块更改 + +```bash +# 暂存子模块更改 +git stash + +# 或者重置子模块 +git submodule update --init --recursive +``` + +## 验证推送 + +推送成功后: + +1. 访问:`http://101.43.95.130:8080/#/admin/projects/zhini_im` +2. 应该能看到项目代码 +3. 访问:`http://101.43.95.130:8080/#/q/project:zhini_im` +4. 应该能看到提交历史 + +## 常见错误处理 + +### 错误:remote gerrit already exists + +```bash +# 删除旧的远程仓库 +git remote remove gerrit + +# 重新添加 +git remote add gerrit http://101.43.95.130:8080/zhini_im +``` + +### 错误:Host key verification failed + +**解决方案 1:使用 HTTP(推荐)** +```bash +git remote set-url gerrit http://101.43.95.130:8080/zhini_im +``` + +**解决方案 2:修复 SSH 密钥** +```bash +ssh-keygen -R [101.43.95.130]:29418 +ssh -p 29418 admin@101.43.95.130 # 接受新密钥 +``` + +### 错误:Changes not staged for commit + +```bash +# 提交所有更改 +git add . +git commit -m "Update code" + +# 或暂存更改 +git stash +``` + diff --git a/修复邮箱地址问题.md b/修复邮箱地址问题.md new file mode 100644 index 0000000..bc7c5f5 --- /dev/null +++ b/修复邮箱地址问题.md @@ -0,0 +1,161 @@ +# 修复 Gerrit 推送邮箱地址问题 + +## 问题描述 + +推送代码时出现错误: +``` +ERROR: commit 356c4cc: email address noreply@gitee.com is not registered in your account +``` + +这是因为从码云拉取的代码中,提交记录的作者邮箱是 `noreply@gitee.com`,但 Gerrit 要求提交者的邮箱必须在账户中注册。 + +## 解决方案 + +### 方案一:修改提交记录的作者信息(推荐) + +将所有提交记录的作者邮箱改为已注册的邮箱 `263303411@qq.com`: + +```bash +cd /d/zhini/zhini_im + +# 使用 git filter-branch 批量修改所有提交的作者信息 +git filter-branch --env-filter ' +OLD_EMAIL="noreply@gitee.com" +CORRECT_NAME="renjianbo" +CORRECT_EMAIL="263303411@qq.com" + +if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] +then + export GIT_COMMITTER_NAME="$CORRECT_NAME" + export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" +fi +if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] +then + export GIT_AUTHOR_NAME="$CORRECT_NAME" + export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" +fi +' --tag-name-filter cat -- --branches --tags +``` + +**注意**:这个命令会重写 Git 历史,如果已经推送到其他远程仓库,需要强制推送。 + +### 方案二:只修改最近的提交(如果只有少量提交) + +如果只有最近的几个提交有问题,可以逐个修改: + +```bash +cd /d/zhini/zhini_im + +# 修改最后一次提交 +git commit --amend --author="renjianbo <263303411@qq.com>" --no-edit + +# 如果有多个提交需要修改,使用交互式 rebase +git rebase -i HEAD~10 # 修改最近10个提交 +# 在编辑器中,将要修改的提交前的 'pick' 改为 'edit' +# 然后对每个提交执行: +git commit --amend --author="renjianbo <263303411@qq.com>" --no-edit +git rebase --continue +``` + +### 方案三:在 Gerrit 中注册邮箱地址 + +1. 访问:`http://101.43.95.130:8080/settings#EmailAddresses` +2. 添加邮箱地址:`noreply@gitee.com` +3. 验证邮箱(如果需要) +4. 然后重新推送 + +**注意**:通常不推荐注册 `noreply@gitee.com`,因为这是码云的自动邮箱,不是真实邮箱。 + +## 推荐操作步骤 + +### 步骤 1:检查有多少提交使用了错误的邮箱 + +```bash +cd /d/zhini/zhini_im + +# 查看所有提交的邮箱 +git log --format='%H %an <%ae>' | grep -i noreply@gitee.com +``` + +### 步骤 2:批量修改所有提交(如果有很多提交) + +```bash +# 先备份当前分支(可选但推荐) +git branch backup-rjb_dev + +# 批量修改所有提交的作者信息 +git filter-branch -f --env-filter ' +if [ "$GIT_COMMITTER_EMAIL" = "noreply@gitee.com" ] +then + export GIT_COMMITTER_NAME="renjianbo" + export GIT_COMMITTER_EMAIL="263303411@qq.com" +fi +if [ "$GIT_AUTHOR_EMAIL" = "noreply@gitee.com" ] +then + export GIT_AUTHOR_NAME="renjianbo" + export GIT_AUTHOR_EMAIL="263303411@qq.com" +fi +' --tag-name-filter cat -- --branches --tags + +# 清理备份(可选,确认修改正确后) +# git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d +``` + +### 步骤 3:重新推送 + +```bash +# 由于历史被重写,需要强制推送 +git push gerrit HEAD:refs/for/master --force +``` + +## 如果使用方案二(只修改部分提交) + +```bash +cd /d/zhini/zhini_im + +# 查看提交历史,找到有问题的提交 +git log --oneline --format='%h %an <%ae>' | head -20 + +# 假设要修改最近 5 个提交 +git rebase -i HEAD~5 + +# 在编辑器中,将需要修改的提交前的 'pick' 改为 'edit' +# 保存并关闭编辑器 + +# 对每个标记为 'edit' 的提交执行: +git commit --amend --author="renjianbo <263303411@qq.com>" --no-edit +git rebase --continue + +# 重复直到所有提交都修改完成 + +# 重新推送 +git push gerrit HEAD:refs/for/master +``` + +## 验证修改结果 + +```bash +# 检查是否还有 noreply@gitee.com 的提交 +git log --format='%H %an <%ae>' | grep -i noreply@gitee.com + +# 如果没有任何输出,说明所有提交都已修改 +``` + +## 注意事项 + +1. **修改 Git 历史**:`git filter-branch` 会重写 Git 历史,如果代码已经推送到其他远程仓库,需要通知团队成员重新克隆。 + +2. **备份**:在执行批量修改前,建议先创建备份分支。 + +3. **强制推送**:修改历史后,需要使用 `--force` 推送,但 Gerrit 可能不允许强制推送到 `refs/for/*`,如果遇到问题,可以尝试: + ```bash + git push gerrit HEAD:refs/for/master + ``` + +4. **邮箱配置**:确保本地 Git 配置使用正确的邮箱: + ```bash + git config user.name "renjianbo" + git config user.email "263303411@qq.com" + ``` + + diff --git a/修复重复Change-Id.md b/修复重复Change-Id.md new file mode 100644 index 0000000..3c96a3b --- /dev/null +++ b/修复重复Change-Id.md @@ -0,0 +1,188 @@ +# 修复重复的 Change-Id 问题 + +## 问题 + +推送时出现错误: +``` +same Change-Id in multiple changes. +Squash the commits with the same Change-Id or ensure Change-Ids are unique for each commit +``` + +这是因为多个提交使用了相同的 Change-Id。Gerrit 要求每个提交都有唯一的 Change-Id。 + +## 解决方案 + +### 方法一:使用 commit-msg hook 重新生成(推荐) + +commit-msg hook 会基于提交内容自动生成唯一的 Change-Id: + +```bash +cd /d/zhini/zhini_im + +# 1. 确保 hook 已安装 +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 2. 使用 filter-branch 重新为所有提交生成 Change-Id +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + ORIGINAL_MSG=$(cat) + + # 移除旧的 Change-Id(如果存在) + CLEAN_MSG=$(echo "$ORIGINAL_MSG" | sed "/^Change-Id:/d" | sed "/^$/N;/^\n$/d") + + # 输出清理后的提交信息 + echo "$CLEAN_MSG" + + # 使用 commit-msg hook 生成新的 Change-Id + # hook 会基于提交内容(树对象、父提交、作者等)生成唯一的 Change-Id + echo "" + # 临时保存提交信息 + echo "$CLEAN_MSG" > /tmp/commit_msg.txt + + # 模拟提交过程,让 hook 生成 Change-Id + # 这里我们需要手动生成,基于提交的 SHA1 和内容 + COMMIT_SHA=$(git rev-parse HEAD) + TREE_SHA=$(git rev-parse HEAD^{tree}) + PARENT_SHA=$(git rev-parse HEAD^ 2>/dev/null || echo "") + + # 生成基于提交内容的唯一 Change-Id + CHANGE_ID_BASE=$(echo -n "$COMMIT_SHA$TREE_SHA$PARENT_SHA" | git hash-object --stdin) + CHANGE_ID="I${CHANGE_ID_BASE:0:40}" + + echo "Change-Id: $CHANGE_ID" +' --tag-name-filter cat -- --branches --tags +``` + +### 方法二:使用 git rebase(更可靠) + +这个方法会真正运行 commit-msg hook: + +```bash +cd /d/zhini/zhini_im + +# 1. 确保 hook 已安装 +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 2. 创建备份 +git branch backup-before-rebase + +# 3. 从第一个提交开始 rebase +FIRST_COMMIT=$(git rev-list --max-parents=0 HEAD) +git rebase -i --root + +# 在编辑器中: +# - 将所有 'pick' 改为 'reword' +# - 保存并关闭 +# +# 对每个提交: +# - 提交信息编辑器会自动打开 +# - 不要修改内容,直接保存退出 +# - commit-msg hook 会自动为每个提交生成唯一的 Change-Id +# - 继续下一个提交 +``` + +### 方法三:使用脚本自动处理(最简单) + +创建一个脚本来自动为每个提交生成唯一的 Change-Id: + +```bash +cd /d/zhini/zhini_im + +# 确保 hook 已安装 +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 使用 filter-branch,为每个提交生成基于其内容的唯一 Change-Id +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + ORIGINAL_MSG=$(cat) + + # 移除所有旧的 Change-Id 行 + CLEAN_MSG=$(echo "$ORIGINAL_MSG" | sed "/^Change-Id:/d") + + # 输出清理后的提交信息(去除末尾多余空行) + echo "$CLEAN_MSG" | sed -e :a -e "/^\$/{\$!N;ba}" -e "s/\n\$//" + + # 为当前提交生成唯一的 Change-Id + # 基于:提交 SHA1 + 树对象 SHA1 + 父提交 SHA1 + 作者信息 + COMMIT_SHA=$(git rev-parse HEAD) + TREE_SHA=$(git rev-parse HEAD^{tree}) + PARENT_SHA=$(git rev-parse HEAD^ 2>/dev/null || echo "root") + AUTHOR=$(git log -1 --format="%an <%ae> %at" HEAD) + + # 组合所有信息生成唯一哈希 + UNIQUE_STRING="${COMMIT_SHA}${TREE_SHA}${PARENT_SHA}${AUTHOR}" + CHANGE_ID_BASE=$(echo -n "$UNIQUE_STRING" | git hash-object --stdin | cut -c1-40) + CHANGE_ID="I${CHANGE_ID_BASE}" + + echo "" + echo "Change-Id: $CHANGE_ID" +' --tag-name-filter cat -- --branches --tags +``` + +## 推荐操作步骤 + +执行以下命令: + +```bash +cd /d/zhini/zhini_im + +# 1. 确保 hook 已安装 +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 2. 创建备份 +git branch backup-before-fix-changeid + +# 3. 为所有提交重新生成唯一的 Change-Id +git filter-branch -f --msg-filter ' + ORIGINAL_MSG=$(cat) + # 移除旧的 Change-Id + CLEAN_MSG=$(echo "$ORIGINAL_MSG" | sed "/^Change-Id:/d" | sed -e :a -e "/^\$/{\$!N;ba}" -e "s/\n\$//") + echo "$CLEAN_MSG" + + # 生成基于提交内容的唯一 Change-Id + COMMIT_SHA=$(git rev-parse HEAD) + TREE_SHA=$(git rev-parse HEAD^{tree}) + PARENT_SHA=$(git rev-parse HEAD^ 2>/dev/null || echo "root") + AUTHOR_TIME=$(git log -1 --format="%an|%ae|%at|%cn|%ce|%ct" HEAD) + + UNIQUE_STRING="${COMMIT_SHA}${TREE_SHA}${PARENT_SHA}${AUTHOR_TIME}" + CHANGE_ID_BASE=$(echo -n "$UNIQUE_STRING" | shasum -a 1 | cut -c1-40) + CHANGE_ID="I${CHANGE_ID_BASE}" + + echo "" + echo "Change-Id: $CHANGE_ID" +' --tag-name-filter cat -- --branches --tags + +# 4. 验证所有 Change-Id 都是唯一的 +git log --format='%H %s' | while read commit subject; do + changeid=$(git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1) + echo "$commit $changeid" +done | sort -k2 | uniq -d -f1 + +# 如果没有输出,说明所有 Change-Id 都是唯一的 + +# 5. 重新推送 +git push gerrit HEAD:refs/for/master +``` + +## 验证 Change-Id 唯一性 + +```bash +# 检查是否有重复的 Change-Id +git log --format='%H' | while read commit; do + changeid=$(git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2) + echo "$changeid $commit" +done | sort | uniq -d + +# 如果没有输出,说明所有 Change-Id 都是唯一的 +``` + + diff --git a/创建项目指南.md b/创建项目指南.md new file mode 100644 index 0000000..b3c2f42 --- /dev/null +++ b/创建项目指南.md @@ -0,0 +1,97 @@ +# Gerrit 创建项目指南 + +## 当前状态 + +✅ 您已成功登录(显示 "RENJIANBO") +✅ 可以访问 Repositories 页面 + +## 创建项目的方法 + +### 方法一:通过 Web 界面创建(推荐) + +#### 步骤 1:找到创建项目按钮 + +在 Repositories 页面,查找以下位置: + +1. **页面右上角**:查找 **"Create Project"** 或 **"+"** 按钮 +2. **或者**:点击右上角用户名 **"RENJIANBO"** → **"Settings"** → 查看左侧是否有 **"Administration"** 选项 +3. **或者**:直接访问创建项目页面: + ``` + http://101.43.95.130:8080/#/admin/projects/create + ``` + +#### 步骤 2:填写项目信息 + +如果找到了创建项目的页面,填写: + +- **Project Name**: 输入项目名称(例如:`my-project`) +- **Parent**: 选择 `All-Projects`(默认) +- **Description**: 项目描述(可选) +- **Submit Type**: 选择 `Merge If Necessary`(推荐) +- **Create initial empty commit**: ✅ 勾选(推荐) + +#### 步骤 3:创建项目 + +点击 **"Create Project"** 按钮 + +### 方法二:通过命令行创建(如果 Web 界面没有按钮) + +如果 Web 界面找不到创建按钮,可以使用命令行: + +```bash +# 在服务器上执行 +cd /home/renjianbo/gerrit_install/review_site +ssh -p 29418 renjianbo@localhost gerrit create-project my-project +``` + +### 方法三:手动创建 Git 仓库(如果以上都不行) + +如果以上方法都不行,可以手动创建: + +```bash +# 在服务器上执行 +cd /home/renjianbo/gerrit_install/review_site/git +mkdir my-project.git +cd my-project.git +git init --bare +``` + +然后刷新 Web 界面,项目应该会出现在列表中。 + +## 创建项目后的操作 + +项目创建成功后: + +1. **克隆项目到本地**: + ```bash + git clone ssh://renjianbo@101.43.95.130:29418/my-project + # 或使用 HTTP + git clone http://101.43.95.130:8080/my-project + ``` + +2. **推送代码进行评审**: + ```bash + cd my-project + echo "# My Project" > README.md + git add README.md + git commit -m "Add README file" + git push origin HEAD:refs/for/master + ``` + +## 如果找不到创建按钮 + +可能的原因: +1. 用户不是管理员(第一个登录的用户应该是管理员) +2. 权限配置问题 + +解决方案: +- 检查 Settings → Administration 是否存在 +- 如果不存在,可能需要手动添加管理员权限 + +## 需要帮助? + +如果以上方法都不行,请告诉我: +1. 在 Repositories 页面是否看到 "Create Project" 按钮 +2. Settings 页面左侧是否有 "Administration" 选项 +3. 访问 `http://101.43.95.130:8080/#/admin/projects/create` 的结果 + diff --git a/处理SSH主机密钥验证.md b/处理SSH主机密钥验证.md new file mode 100644 index 0000000..7f9bbc3 --- /dev/null +++ b/处理SSH主机密钥验证.md @@ -0,0 +1,147 @@ +# 处理 SSH 主机密钥验证问题 + +## 问题说明 + +当您看到以下提示时: +``` +The authenticity of host '[101.43.95.130]:29419' can't be established. +ED25519 key fingerprint is SHA256:DH/rryTaDvEpfj6SmXgTJaZtULX1kksBF6DGOvDZjks. +Are you sure you want to continue connecting (yes/no/[fingerprint])? +``` + +**这是正常的 SSH 安全验证**,不是错误! + +## 原因 + +- 您之前连接过 `29418` 端口,SSH 已经保存了该端口的主机密钥 +- 现在使用 `29419` 端口,SSH 将其视为新的主机(不同端口 = 不同主机) +- SSH 需要您确认是否信任这个新主机 + +## 解决方案 + +### 方法 1:直接接受(推荐) + +在提示时直接输入 `yes` 并回车: + +```bash +Are you sure you want to continue connecting (yes/no/[fingerprint])? yes +``` + +SSH 会自动将新主机密钥保存到 `~/.ssh/known_hosts` 文件中。 + +### 方法 2:预先添加主机密钥 + +如果您想提前添加,可以在 Git Bash 中执行: + +```bash +# 先删除旧的 29418 端口记录(可选) +ssh-keygen -R [101.43.95.130]:29418 + +# 手动添加 29419 端口的主机密钥 +ssh-keyscan -p 29419 101.43.95.130 >> ~/.ssh/known_hosts +``` + +### 方法 3:更新 known_hosts 文件 + +手动编辑 `known_hosts` 文件: + +```bash +# 在 Git Bash 中打开文件 +notepad ~/.ssh/known_hosts + +# 或者使用文本编辑器 +# 找到包含 101.43.95.130:29418 的行,可以删除或保留 +# SSH 会自动为 29419 端口创建新条目 +``` + +## 重要说明 + +### ✅ 不需要重新配置 SSH 密钥 + +- **SSH 公钥/私钥对**(`id_rsa` 和 `id_rsa.pub`)**不需要重新生成** +- 这些密钥已经配置好了,可以继续使用 +- 只需要接受新的**主机密钥**(服务器端的密钥) + +### 两种密钥的区别 + +1. **SSH 密钥对**(您的密钥): + - 用于身份认证(证明您是您) + - 已经添加到 Gerrit 中 + - 不需要重新配置 + +2. **主机密钥**(服务器的密钥): + - 用于验证服务器身份(证明服务器是真正的服务器) + - 每个端口都有独立的主机密钥 + - 第一次连接时需要接受 + +## 完整操作步骤 + +### 步骤 1:接受主机密钥 + +在 Git Bash 中,当看到提示时输入 `yes`: + +```bash +$ git push origin HEAD:refs/for/master +The authenticity of host '[101.43.95.130]:29419' can't be established. +ED25519 key fingerprint is SHA256:DH/rryTaDvEpfj6SmXgTJaZtULX1kksBF6DGOvDZjks. +Are you sure you want to continue connecting (yes/no/[fingerprint])? yes +``` + +### 步骤 2:验证连接 + +接受后,SSH 会保存主机密钥,然后继续推送。如果一切正常,您会看到推送成功的消息。 + +### 步骤 3:后续使用 + +以后使用 29419 端口时,不会再提示,因为主机密钥已经保存。 + +## 验证指纹(可选但推荐) + +为了安全,您可以验证指纹是否匹配: + +1. **在服务器上查看主机密钥指纹**: + ```bash + # 在服务器上执行 + ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub + ``` + +2. **与提示中的指纹对比**: + - 提示中的指纹:`SHA256:DH/rryTaDvEpfj6SmXgTJaZtULX1kksBF6DGOvDZjks` + - 如果匹配,说明是真正的服务器,可以安全接受 + +## 常见问题 + +### Q: 输入 yes 后还是失败? + +**A:** 可能的原因: +1. SSH 公钥未添加到 Gerrit → 检查 `http://101.43.95.130:8080/#/settings/ssh-keys` +2. 用户名错误 → 确认 Git remote URL 中的用户名 +3. 项目不存在 → 确认项目名称是否正确 + +### Q: 可以跳过主机密钥验证吗? + +**A:** 不推荐!这会降低安全性。但如果是测试环境,可以临时设置: + +```bash +# 在 ~/.ssh/config 中添加(不推荐生产环境) +Host 101.43.95.130 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null +``` + +### Q: 如何查看已保存的主机密钥? + +**A:** +```bash +# 查看 known_hosts 文件 +cat ~/.ssh/known_hosts | grep 101.43.95.130 +``` + +## 总结 + +- ✅ **直接输入 `yes` 接受主机密钥**即可 +- ✅ **不需要重新配置 SSH 密钥**(公钥/私钥对) +- ✅ 这是正常的安全验证流程 +- ✅ 接受后,后续使用不会再提示 + + diff --git a/如何进行+2评审指南.md b/如何进行+2评审指南.md new file mode 100644 index 0000000..826b09c --- /dev/null +++ b/如何进行+2评审指南.md @@ -0,0 +1,193 @@ +# 如何进行 +2 Code-Review 评审 + +## 📋 什么是 +2 Code-Review? + +**+2 Code-Review** 是 Gerrit 中的最高评审评分,表示**批准合并**。通常需要管理员权限或具有相应权限的用户才能给出。 + +## 🌐 方法一:通过 Web 界面(推荐) + +### 步骤 1:打开变更页面 + +1. 访问变更 URL,例如: + - `http://101.43.95.130:8080/c/zhini-im/+/4` + - 或访问所有变更列表:`http://101.43.95.130:8080/#/q/status:open` + +2. 点击要评审的变更进入详情页 + +### 步骤 2:进行评审 + +1. **查看代码差异** + - 在变更页面查看所有文件修改 + - 可以点击代码行添加行内评论 + +2. **添加评审投票** + - 滚动到页面底部,找到 **"Review"** 区域 + - 在 **"Code-Review"** 下拉菜单中选择 **"+2"** + - (可选)在评论框中添加评审意见 + - 点击 **"POST"** 按钮提交评审 + +### 步骤 3:合并变更 + +当变更获得 **+2 Code-Review** 后: +- 如果还启用了 **Verified** 标签,需要 **+1 Verified** 才能自动合并 +- 或者可以点击 **"Submit"** 按钮手动合并 + +## 💻 方法二:通过 SSH 命令行 + +### 使用 gerrit review 命令 + +```bash +# 基本语法 +ssh -p 29418 renjianbo@101.43.95.130 gerrit review , --code-review +2 + +# 示例:给 Change 4 的第一个补丁集 +2 +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4,1 --code-review +2 + +# 示例:给 Change 4 的最新补丁集 +2(使用 --current) +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4 --code-review +2 + +# 同时添加评论 +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4 --code-review +2 --message "LGTM, 批准合并" +``` + +### 批量给多个变更 +2 + +```bash +# 给 Change 4-14 都 +2 +for i in {4..14}; do + ssh -p 29418 renjianbo@101.43.95.130 gerrit review $i --code-review +2 +done +``` + +## 🔐 权限要求 + +### 检查是否有 +2 权限 + +1. **查看您的权限**: + - 访问:`http://101.43.95.130:8080/#/settings` + - 查看您所属的用户组 + +2. **检查项目权限**: + - 访问:`http://101.43.95.130:8080/#/admin/projects/zhini-im,access` + - 查看 "Code-Review" 权限配置 + +### 如果没有 +2 权限,如何配置 + +如果您是管理员,可以配置权限: + +1. **访问项目权限页面**: + - `http://101.43.95.130:8080/#/admin/projects/zhini-im,access` + +2. **添加 Code-Review +2 权限**: + - 点击 **"Edit"** 按钮 + - 在 **"Reference"** 中选择 `refs/heads/*` 或 `refs/for/*` + - 添加权限: + - **Label Code-Review**: `+2` → 分配给您的用户组(如 `Administrators` 或 `Developers`) + - 保存更改 + +3. **或者通过 SSH 配置**: + +```bash +# 在服务器上执行 +cd /home/renjianbo/gerrit_install/review_site + +# 给 Administrators 组添加 Code-Review +2 权限 +ssh -p 29418 renjianbo@localhost gerrit set-access zhini-im -a refs/heads/* -g Administrators Label-Code-Review+2 + +# 或者给特定用户添加权限 +ssh -p 29418 renjianbo@localhost gerrit set-access zhini-im -a refs/heads/* -u renjianbo Label-Code-Review+2 +``` + +## 📝 完整的评审流程示例 + +### 示例 1:通过 Web 界面 + +1. 打开变更:`http://101.43.95.130:8080/c/zhini-im/+/4` +2. 查看代码差异 +3. 滚动到底部,在 "Review" 区域: + - 选择 **Code-Review: +2** + - 添加评论(可选):"代码质量良好,批准合并" + - 点击 **"POST"** +4. 如果满足合并条件,点击 **"Submit"** 按钮合并 + +### 示例 2:通过 SSH + +```bash +# 给 Change 4 +2 并添加评论 +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4 --code-review +2 --message "代码质量良好,批准合并" + +# 如果需要同时给 Verified +1 +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4 --code-review +2 --verified +1 --message "代码质量良好,已验证,批准合并" +``` + +## 🎯 快速参考 + +### 评审投票选项 + +- **Code-Review**: + - `+2` = 批准合并(需要管理员或相应权限) + - `+1` = 看起来不错,但需要其他人批准 + - `0` = 无意见 + - `-1` = 需要修改 + - `-2` = 拒绝 + +- **Verified**: + - `+1` = 验证通过(通常由 CI 系统或管理员给出) + - `0` = 未验证 + - `-1` = 验证失败 + +### 常用 SSH 命令 + +```bash +# 查看变更详情 +ssh -p 29418 renjianbo@101.43.95.130 gerrit query --format=JSON change:4 + +# 给变更 +2 +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4 --code-review +2 + +# 给变更 +2 并添加评论 +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4 --code-review +2 --message "LGTM" + +# 提交变更(合并) +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4 --submit + +# 查看所有待合并的变更 +ssh -p 29418 renjianbo@101.43.95.130 gerrit query --format=JSON status:open is:mergeable +``` + +## ⚠️ 注意事项 + +1. **权限要求**:+2 通常需要管理员权限或项目所有者权限 +2. **自评限制**:通常不能给自己的变更 +2(除非配置了相应权限) +3. **合并条件**:变更需要同时满足: + - Code-Review: +2 + - Verified: +1(如果启用了) +4. **提交者**:即使获得了 +2,通常也需要点击 "Submit" 按钮才能合并 + +## 🔧 如果无法 +2 + +### 检查权限 + +```bash +# 查看您的用户组 +ssh -p 29418 renjianbo@101.43.95.130 gerrit ls-members --group Administrators + +# 查看项目权限 +ssh -p 29418 renjianbo@101.43.95.130 gerrit show-access zhini-im +``` + +### 临时解决方案 + +如果没有 +2 权限,可以: +1. 使用 **+1 Code-Review**(如果允许) +2. 或者配置项目允许直接推送(绕过评审) +3. 或者联系管理员添加权限 + +## 📚 相关链接 + +- **Gerrit 首页**: `http://101.43.95.130:8080` +- **所有变更**: `http://101.43.95.130:8080/#/q/status:open` +- **项目权限**: `http://101.43.95.130:8080/#/admin/projects/zhini-im,access` +- **用户设置**: `http://101.43.95.130:8080/#/settings` + + diff --git a/安装CommitHook指南.md b/安装CommitHook指南.md new file mode 100644 index 0000000..5120e84 --- /dev/null +++ b/安装CommitHook指南.md @@ -0,0 +1,125 @@ +# 安装 Gerrit Commit Hook 指南 + +## 问题 + +错误信息: +``` +ERROR: commit b4917f2: missing Change-Id in message footer +``` + +Gerrit 要求每个提交都必须包含 Change-Id。 + +## 解决方案:安装 commit-msg hook + +### 步骤 1:安装 commit-msg hook + +在您的本地电脑上执行: + +```bash +cd /d/ttt/test-project + +# 安装 commit-msg hook +gitdir=$(git rev-parse --git-dir); scp -p -P 29418 renjianbo@101.43.95.130:hooks/commit-msg ${gitdir}/hooks/ +``` + +**注意**:如果 scp 命令失败,可能需要使用完整路径或配置 SSH。 + +### 步骤 2:修改最后一次提交(添加 Change-Id) + +```bash +# 修改最后一次提交,自动添加 Change-Id +git commit --amend --no-edit +``` + +### 步骤 3:重新推送 + +```bash +# 如果创建了 SSH 配置文件 +git push origin HEAD:refs/for/master + +# 如果还没创建配置文件 +GIT_SSH_COMMAND="ssh -o PubkeyAcceptedKeyTypes=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa" git push origin HEAD:refs/for/master +``` + +## 如果 scp 命令失败 + +### 方法一:使用 curl 下载(推荐) + +```bash +cd /d/ttt/test-project + +# 创建 hooks 目录(如果不存在) +mkdir -p .git/hooks + +# 下载 commit-msg hook +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + +# 设置执行权限 +chmod +x .git/hooks/commit-msg +``` + +### 方法二:手动创建 hook 文件 + +如果以上方法都不行,可以手动创建: + +```bash +cd /d/ttt/test-project + +# 创建 hooks 目录 +mkdir -p .git/hooks + +# 创建 commit-msg hook(简化版) +cat > .git/hooks/commit-msg << 'EOF' +#!/bin/sh +# Gerrit commit-msg hook +CHANGE_ID=$(git log -1 --format='%H' | cut -c1-8) +echo "" >> "$1" +echo "Change-Id: I${CHANGE_ID}0000000000000000000000000000000000000000" >> "$1" +EOF + +# 设置执行权限 +chmod +x .git/hooks/commit-msg +``` + +## 完整操作流程 + +```bash +cd /d/ttt/test-project + +# 方法 1:使用 scp(如果 SSH 配置正确) +gitdir=$(git rev-parse --git-dir); scp -p -P 29418 renjianbo@101.43.95.130:hooks/commit-msg ${gitdir}/hooks/ + +# 方法 2:使用 curl(推荐,更简单) +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 修改最后一次提交 +git commit --amend --no-edit + +# 推送代码 +git push origin HEAD:refs/for/master +``` + +## 验证 hook 是否安装成功 + +```bash +# 查看 hook 文件是否存在 +ls -la .git/hooks/commit-msg + +# 应该显示文件存在且有执行权限 +``` + +## 以后的使用 + +安装 hook 后,以后的所有提交都会自动包含 Change-Id,不需要手动添加。 + +## 推送成功后的效果 + +推送成功后,Gerrit 会返回变更 URL,例如: +``` +remote: http://101.43.95.130:8080/c/test-project/+/1 [NEW] +``` + +在浏览器中打开即可查看和评审代码变更。 + diff --git a/安装commit-msg-hook.md b/安装commit-msg-hook.md new file mode 100644 index 0000000..531b0cb --- /dev/null +++ b/安装commit-msg-hook.md @@ -0,0 +1,174 @@ +# 安装 Gerrit commit-msg Hook 指南 + +## 问题 + +推送代码时出现错误: +``` +remote: ERROR: commit 5ee73b7: missing Change-Id in message footer +``` + +## 原因 + +Gerrit 要求每个提交都必须包含 `Change-Id`,用于跟踪代码变更。需要安装 `commit-msg` hook 来自动添加。 + +## 解决方案 + +### 方法一:使用 SCP 下载(SSH 方式,推荐) + +在您的项目目录中执行: + +```bash +cd /d/zhini_im_android + +# 下载 commit-msg hook +gitdir=$(git rev-parse --git-dir) +scp -p -P 29419 renjianbo@101.43.95.130:hooks/commit-msg ${gitdir}/hooks/ + +# 如果使用 OpenSSH >= 9.0,需要添加 -O 参数 +# scp -O -p -P 29419 renjianbo@101.43.95.130:hooks/commit-msg ${gitdir}/hooks/ + +# 设置执行权限 +chmod +x ${gitdir}/hooks/commit-msg +``` + +### 方法二:使用 HTTP 下载(如果 SSH 有问题) + +```bash +cd /d/zhini_im_android + +# 下载 commit-msg hook +f="$(git rev-parse --git-dir)/hooks/commit-msg" +curl -o "$f" http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x "$f" +``` + +### 方法三:手动创建目录并下载 + +```bash +cd /d/zhini_im_android + +# 确保 hooks 目录存在 +mkdir -p .git/hooks + +# 下载 hook(HTTP 方式) +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + +# 设置执行权限 +chmod +x .git/hooks/commit-msg +``` + +## 修复已提交的代码 + +安装 hook 后,需要修改最后一次提交以添加 Change-Id: + +```bash +cd /d/zhini_im_android + +# 修改最后一次提交(会自动添加 Change-Id) +git commit --amend --no-edit + +# 重新推送 +git push origin HEAD:refs/for/master +``` + +## 完整操作步骤 + +### 步骤 1:安装 commit-msg hook + +```bash +cd /d/zhini_im_android + +# 使用 HTTP 方式下载(最简单) +f="$(git rev-parse --git-dir)/hooks/commit-msg" +curl -o "$f" http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x "$f" +``` + +### 步骤 2:验证 hook 已安装 + +```bash +# 检查文件是否存在 +ls -la .git/hooks/commit-msg + +# 检查文件内容(应该看到 Gerrit commit-msg hook 的代码) +head -20 .git/hooks/commit-msg +``` + +### 步骤 3:修改提交添加 Change-Id + +```bash +# 修改最后一次提交 +git commit --amend --no-edit + +# 查看提交信息,确认 Change-Id 已添加 +git log -1 +``` + +您应该看到提交信息末尾有类似这样的内容: +``` +Change-Id: I1234567890abcdef1234567890abcdef12345678 +``` + +### 步骤 4:重新推送 + +```bash +git push origin HEAD:refs/for/master +``` + +## 验证 + +推送成功后,您会看到类似这样的输出: + +``` +remote: Resolving deltas: 100% (55/55) +remote: Processing changes: refs: 1, new: 1 +remote: +remote: SUCCESS +remote: +remote: http://101.43.95.130:8080/c/zhini_im_android/+/123 [NEW] +remote: +To ssh://101.43.95.130:29419/zhini_im_android + * [new branch] HEAD -> refs/for/master +``` + +## 后续使用 + +安装 hook 后,以后的所有新提交都会自动包含 Change-Id,不需要手动添加。 + +## 常见问题 + +### Q: 如果 scp 命令失败怎么办? + +**A:** 使用 HTTP 方式下载: +```bash +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg +``` + +### Q: 如果有多个提交需要修复怎么办? + +**A:** 可以使用交互式 rebase: +```bash +# 假设需要修复最近 3 个提交 +git rebase -i HEAD~3 + +# 在编辑器中,将要修改的提交标记为 "edit" +# 然后对每个提交执行: +git commit --amend --no-edit +git rebase --continue +``` + +### Q: hook 安装后不工作? + +**A:** 检查: +1. 文件权限:`chmod +x .git/hooks/commit-msg` +2. 文件路径:确保在 `.git/hooks/` 目录下 +3. Git 版本:确保 Git 版本支持 hooks + +## 注意事项 + +- ✅ Hook 只需要安装一次,后续提交会自动使用 +- ✅ 如果克隆新项目,需要重新安装 hook +- ✅ Hook 是项目级别的,每个项目都需要单独安装 + + diff --git a/安装前准备-Java17.md b/安装前准备-Java17.md new file mode 100644 index 0000000..d95d128 --- /dev/null +++ b/安装前准备-Java17.md @@ -0,0 +1,75 @@ +# Gerrit 安装前准备 - 安装 Java 17 + +## 当前状态 +- ✅ Gerrit 3.9.0 已下载到: `~/gerrit_install/gerrit-3.9.0.war` +- ❌ 当前 Java 版本: Java 8 (不兼容) +- ⚠️ 需要: Java 11 或 Java 17 (推荐 Java 17) + +## 解决方案 + +### 方案一:安装 Java 17(推荐) + +#### CentOS 7 安装 Java 17 + +```bash +# 方法 1: 使用 AdoptOpenJDK (需要添加仓库) +sudo yum install -y wget +wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.12%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.12_7.tar.gz +tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.12_7.tar.gz +sudo mv jdk-17.0.12+7 /opt/java17 +sudo alternatives --install /usr/bin/java java /opt/java17/bin/java 2 +sudo alternatives --config java # 选择 Java 17 + +# 验证 +java -version +``` + +#### 或者使用更简单的方法(如果系统支持) + +```bash +# 检查是否有 Java 17 可用 +sudo yum search java-17 + +# 如果有,直接安装 +sudo yum install -y java-17-openjdk java-17-openjdk-devel + +# 设置 Java 17 为默认 +sudo alternatives --config java +``` + +### 方案二:使用支持 Java 8 的旧版本 Gerrit + +如果无法安装 Java 17,可以下载 Gerrit 3.3.x(最后一个支持 Java 8 的版本): + +```bash +cd ~/gerrit_install +rm -f gerrit-3.9.0.war +wget https://gerrit-releases.storage.googleapis.com/gerrit-3.3.8.war +java -jar gerrit-3.3.8.war init -d review_site +``` + +**注意**: Gerrit 3.3.x 是较旧的版本,建议使用 Java 17 + Gerrit 3.9.0。 + +## 安装 Java 17 后的步骤 + +安装 Java 17 后,继续执行: + +```bash +cd ~/gerrit_install +java -jar gerrit-3.9.0.war init -d review_site +``` + +## 快速检查命令 + +```bash +# 检查当前 Java 版本 +java -version + +# 检查是否安装了多个 Java 版本 +sudo alternatives --display java + +# 切换 Java 版本 +sudo alternatives --config java +``` + + diff --git a/安装状态说明.md b/安装状态说明.md new file mode 100644 index 0000000..e2000b2 --- /dev/null +++ b/安装状态说明.md @@ -0,0 +1,93 @@ +# Gerrit 安装状态说明 + +## 当前状态 + +### ✅ 已完成 +- Gerrit 3.9.0 已下载: `~/gerrit_install/gerrit-3.9.0.war` (85MB) +- Gerrit 3.3.8 已下载: `~/gerrit_install/gerrit-3.3.8.war` (70MB) +- 系统已安装: Git, wget +- 工作目录已创建: `~/gerrit_install/` + +### ❌ 需要解决 +- **Java 版本不兼容**: 当前 Java 8,需要 Java 11 或 17 + - Gerrit 3.9.0 需要 Java 17 + - Gerrit 3.3.8 需要 Java 11 + - 当前系统只有 Java 8 + +## 解决方案 + +### 必须安装 Java 11 或 Java 17 + +由于所有可用的 Gerrit 版本都需要 Java 11+,您必须先升级 Java。 + +### 推荐方案:安装 Java 17 + +#### CentOS 7 安装 Java 17 步骤: + +```bash +# 1. 下载 OpenJDK 17 +cd ~ +wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.12%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.12_7.tar.gz + +# 2. 解压 +tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.12_7.tar.gz + +# 3. 移动到系统目录(需要 sudo) +sudo mv jdk-17.0.12+7 /opt/java17 + +# 4. 配置 alternatives(需要 sudo) +sudo alternatives --install /usr/bin/java java /opt/java17/bin/java 2 +sudo alternatives --install /usr/bin/javac javac /opt/java17/bin/javac 2 + +# 5. 选择 Java 17 作为默认版本(需要 sudo) +sudo alternatives --config java +# 选择 /opt/java17/bin/java 对应的编号 + +# 6. 验证 +java -version +# 应该显示: openjdk version "17.0.12" +``` + +### 安装 Java 17 后继续安装 Gerrit + +```bash +cd ~/gerrit_install + +# 使用 Gerrit 3.9.0(推荐) +java -jar gerrit-3.9.0.war init -d review_site --batch --no-auto-start + +# 或者使用 Gerrit 3.3.8 +java -jar gerrit-3.3.8.war init -d review_site --batch --no-auto-start +``` + +## 快速检查命令 + +```bash +# 检查当前 Java 版本 +java -version + +# 检查已安装的 Java 版本 +sudo alternatives --display java + +# 查看所有可用的 Java +ls -la /usr/lib/jvm/ +``` + +## 注意事项 + +1. **需要 sudo 权限**: 安装 Java 17 需要管理员权限 +2. **系统兼容性**: CentOS 7 默认仓库没有 Java 17,需要手动下载安装 +3. **版本选择**: 建议使用 Java 17 + Gerrit 3.9.0(最新稳定版) + +## 下一步 + +安装 Java 17 后,请运行: + +```bash +cd ~/gerrit_install +java -jar gerrit-3.9.0.war init -d review_site +``` + +然后按照 `Gerrit安装使用指南.md` 中的说明继续配置和使用。 + + diff --git a/完全重新安装Gerrit.sh b/完全重新安装Gerrit.sh new file mode 100644 index 0000000..0d13f90 --- /dev/null +++ b/完全重新安装Gerrit.sh @@ -0,0 +1,199 @@ +#!/bin/bash + +# Gerrit 完全卸载并重新安装脚本 +# 注意:会删除所有现有数据 + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_HOME="/home/renjianbo/gerrit_install" +GERRIT_VERSION="3.9.0" +GERRIT_PORT="8080" +GERRIT_SSH_PORT="29418" +SERVER_IP="101.43.95.130" + +# JDK 17 路径 +JAVA17_HOME="/usr/local/java/jdk-17.0.12+7" +export JAVA_HOME=$JAVA17_HOME +export PATH=$JAVA_HOME/bin:$PATH + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Gerrit 完全卸载并重新安装${NC}" +echo -e "${GREEN}版本: ${GERRIT_VERSION}${NC}" +echo -e "${RED}警告:将删除所有现有数据!${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" + +# 1. 停止服务 +echo -e "${YELLOW}[1/6] 停止 Gerrit 服务...${NC}" +if [ -d "${GERRIT_HOME}/review_site" ]; then + cd ${GERRIT_HOME}/review_site + if [ -f "bin/gerrit.sh" ]; then + bin/gerrit.sh stop 2>/dev/null || true + sleep 2 + echo -e "${GREEN}✓ 服务已停止${NC}" + else + echo -e "${YELLOW}⚠ gerrit.sh 不存在${NC}" + fi +else + echo -e "${YELLOW}⚠ review_site 目录不存在${NC}" +fi +echo "" + +# 2. 杀死残留进程 +echo -e "${YELLOW}[2/6] 清理残留进程...${NC}" +pkill -f "gerrit.war daemon" 2>/dev/null || true +sleep 1 +echo -e "${GREEN}✓ 进程清理完成${NC}" +echo "" + +# 3. 删除旧安装 +echo -e "${YELLOW}[3/6] 删除旧安装...${NC}" +if [ -d "${GERRIT_HOME}/review_site" ]; then + rm -rf ${GERRIT_HOME}/review_site + echo -e "${GREEN}✓ 已删除 review_site 目录${NC}" +else + echo -e "${YELLOW}⚠ review_site 目录不存在${NC}" +fi +echo "" + +# 4. 检查 Gerrit war 文件 +echo -e "${YELLOW}[4/6] 检查 Gerrit 安装包...${NC}" +cd ${GERRIT_HOME} + +if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then + echo " 下载 Gerrit ${GERRIT_VERSION}..." + wget -q https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war + if [ $? -ne 0 ]; then + echo -e "${RED}下载失败${NC}" + exit 1 + fi + echo -e "${GREEN}✓ 下载完成${NC}" +else + echo -e "${GREEN}✓ Gerrit ${GERRIT_VERSION} 已存在${NC}" +fi +echo "" + +# 5. 重新初始化 +echo -e "${YELLOW}[5/6] 重新初始化 Gerrit...${NC}" +cd ${GERRIT_HOME} + +echo " 正在初始化(这可能需要几分钟)..." +$JAVA_HOME/bin/java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + -D gerrit.canonicalWebUrl=http://${SERVER_IP}:${GERRIT_PORT}/ \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes 2>&1 | tail -20 + +if [ $? -eq 0 ]; then + echo -e "${GREEN}✓ 初始化完成${NC}" +else + echo -e "${YELLOW}⚠ 初始化过程中可能有警告,但可能已成功完成${NC}" +fi +echo "" + +# 6. 配置 Gerrit +echo -e "${YELLOW}[6/6] 配置 Gerrit...${NC}" +cd ${GERRIT_HOME} + +# 创建配置文件 +cat > review_site/etc/gerrit.config << EOCONFIG +[gerrit] + basePath = git + canonicalWebUrl = http://${SERVER_IP}:${GERRIT_PORT}/ + serverId = $(uuidgen 2>/dev/null || echo $(date +%s)) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT + gitBasicAuth = true +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ + cookieSecure = false + cookieSameSite = LAX + cookiePath = / +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOCONFIG + +echo -e "${GREEN}✓ 配置完成${NC}" +echo "" + +# 7. 配置启动脚本使用 Java 17 +echo -e "${YELLOW}配置启动脚本...${NC}" +cd ${GERRIT_HOME}/review_site + +if [ -f "bin/gerrit.sh" ]; then + cp bin/gerrit.sh bin/gerrit.sh.bak + sed -i "2i export JAVA_HOME=${JAVA17_HOME}\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh + echo -e "${GREEN}✓ 已更新 gerrit.sh 使用 Java 17${NC}" +fi +echo "" + +# 8. 启动服务 +echo -e "${YELLOW}启动 Gerrit 服务...${NC}" +cd ${GERRIT_HOME}/review_site + +bin/gerrit.sh start + +sleep 8 + +# 检查服务状态 +if bin/gerrit.sh status 2>&1 | grep -q "Gerrit running\|Running"; then + echo -e "${GREEN}✓ 服务启动成功${NC}" +else + echo -e "${YELLOW}⚠ 检查服务状态...${NC}" + bin/gerrit.sh status 2>&1 | head -10 +fi +echo "" + +# 检查端口 +echo -e "${YELLOW}检查端口监听...${NC}" +if command -v netstat &> /dev/null; then + netstat -tlnp 2>/dev/null | grep ":8080" && echo -e "${GREEN}✓ 端口 8080 正在监听${NC}" || echo -e "${YELLOW}⚠ 端口 8080 未被监听${NC}" +elif command -v ss &> /dev/null; then + ss -tlnp 2>/dev/null | grep ":8080" && echo -e "${GREEN}✓ 端口 8080 正在监听${NC}" || echo -e "${YELLOW}⚠ 端口 8080 未被监听${NC}" +fi +echo "" + +# 输出信息 +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}重新安装完成!${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" +echo -e "${YELLOW}重要提示:${NC}" +echo -e " ${GREEN}1. 第一个登录的用户将自动成为管理员${NC}" +echo -e " 2. 请清除浏览器 Cookie 和缓存(重要!)" +echo -e " 3. 访问: http://${SERVER_IP}:${GERRIT_PORT}" +echo -e " 4. 点击 'Sign In',输入用户名(例如:admin)" +echo -e " 5. 第一个登录的用户将自动成为管理员" +echo -e " 6. 登录后应该能看到 'CREATE NEW' 按钮" +echo "" +echo -e "${YELLOW}访问信息:${NC}" +echo -e " Web 界面: http://${SERVER_IP}:${GERRIT_PORT}" +echo -e " SSH 端口: ${GERRIT_SSH_PORT}" +echo "" +echo -e "${YELLOW}常用命令:${NC}" +echo -e " 查看状态: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh status" +echo -e " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/error_log" +echo -e " 停止服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh stop" +echo -e " 重启服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh restart" +echo "" +echo -e "${GREEN}========================================${NC}" + diff --git a/开放端口29419-iptables.sh b/开放端口29419-iptables.sh new file mode 100755 index 0000000..1967a0a --- /dev/null +++ b/开放端口29419-iptables.sh @@ -0,0 +1,79 @@ +#!/bin/bash +# 使用 iptables 开放 Gerrit SSH 端口 29419 的脚本 + +echo "==========================================" +echo "使用 iptables 开放 Gerrit SSH 端口 29419" +echo "==========================================" + +# 检查是否有 root 权限 +if [ "$EUID" -ne 0 ]; then + echo "❌ 此脚本需要 root 权限,请使用 sudo 运行" + echo "" + echo "使用方法:" + echo " sudo bash 开放端口29419-iptables.sh" + exit 1 +fi + +echo "" +echo "步骤 1: 检查当前 iptables 规则..." +iptables -L -n | grep 29419 || echo "未找到 29419 端口规则" + +echo "" +echo "步骤 2: 添加 iptables 规则允许端口 29419..." +iptables -I INPUT -p tcp --dport 29419 -j ACCEPT + +if [ $? -eq 0 ]; then + echo "✅ iptables 规则已添加" +else + echo "❌ 添加规则失败" + exit 1 +fi + +echo "" +echo "步骤 3: 保存 iptables 规则..." +# 尝试不同的保存方式 +if command -v iptables-save &> /dev/null; then + # CentOS 7 + if [ -f /etc/sysconfig/iptables ]; then + iptables-save > /etc/sysconfig/iptables + echo "✅ 规则已保存到 /etc/sysconfig/iptables" + else + # 其他系统 + iptables-save > /etc/iptables/rules.v4 2>/dev/null || \ + iptables-save > /etc/iptables.rules 2>/dev/null || \ + echo "⚠️ 请手动保存 iptables 规则" + fi +else + echo "⚠️ 未找到 iptables-save 命令,请手动保存规则" +fi + +echo "" +echo "步骤 4: 验证规则..." +if iptables -L -n | grep -q "29419"; then + echo "✅ 端口 29419 规则已添加" + iptables -L -n | grep 29419 +else + echo "⚠️ 警告:规则可能未正确添加" +fi + +echo "" +echo "步骤 5: 检查端口监听状态..." +if netstat -tlnp 2>/dev/null | grep -q ":29419"; then + echo "✅ Gerrit 服务正在监听端口 29419" + netstat -tlnp | grep 29419 +else + echo "⚠️ 警告:未检测到端口 29419 的监听,请检查 Gerrit 服务状态" +fi + +echo "" +echo "==========================================" +echo "完成!" +echo "==========================================" +echo "" +echo "如果使用云服务器,还需要在云控制台的安全组中开放端口 29419" +echo "" +echo "测试连接:" +echo " ssh -p 29419 renjianbo@101.43.95.130 gerrit version" +echo "" + + diff --git a/开放端口29419.sh b/开放端口29419.sh new file mode 100755 index 0000000..c3ab5bf --- /dev/null +++ b/开放端口29419.sh @@ -0,0 +1,82 @@ +#!/bin/bash +# 开放 Gerrit SSH 端口 29419 的防火墙脚本 + +echo "==========================================" +echo "开放 Gerrit SSH 端口 29419" +echo "==========================================" + +# 检查是否有 root 权限 +if [ "$EUID" -ne 0 ]; then + echo "❌ 此脚本需要 root 权限,请使用 sudo 运行" + echo "" + echo "使用方法:" + echo " sudo bash 开放端口29419.sh" + exit 1 +fi + +# 检查 firewall-cmd 是否可用 +if ! command -v firewall-cmd &> /dev/null; then + echo "❌ 未找到 firewall-cmd 命令" + echo " 可能使用的是 iptables,请手动配置" + exit 1 +fi + +echo "" +echo "步骤 1: 检查当前防火墙状态..." +firewall-cmd --state + +echo "" +echo "步骤 2: 检查当前开放的端口..." +firewall-cmd --list-ports + +echo "" +echo "步骤 3: 添加端口 29419/tcp..." +firewall-cmd --permanent --add-port=29419/tcp + +if [ $? -eq 0 ]; then + echo "✅ 端口 29419/tcp 已添加到防火墙规则" +else + echo "❌ 添加端口失败" + exit 1 +fi + +echo "" +echo "步骤 4: 重新加载防火墙配置..." +firewall-cmd --reload + +if [ $? -eq 0 ]; then + echo "✅ 防火墙配置已重新加载" +else + echo "❌ 重新加载失败" + exit 1 +fi + +echo "" +echo "步骤 5: 验证端口是否已开放..." +if firewall-cmd --list-ports | grep -q "29419/tcp"; then + echo "✅ 端口 29419/tcp 已成功开放" +else + echo "⚠️ 警告:端口可能未正确添加,请手动检查" +fi + +echo "" +echo "步骤 6: 检查端口监听状态..." +if netstat -tlnp 2>/dev/null | grep -q ":29419"; then + echo "✅ Gerrit 服务正在监听端口 29419" + netstat -tlnp | grep 29419 +else + echo "⚠️ 警告:未检测到端口 29419 的监听,请检查 Gerrit 服务状态" +fi + +echo "" +echo "==========================================" +echo "完成!" +echo "==========================================" +echo "" +echo "如果使用云服务器,还需要在云控制台的安全组中开放端口 29419" +echo "" +echo "测试连接:" +echo " ssh -p 29419 renjianbo@101.43.95.130 gerrit version" +echo "" + + diff --git a/开放端口29419说明.md b/开放端口29419说明.md new file mode 100644 index 0000000..ae4a0ba --- /dev/null +++ b/开放端口29419说明.md @@ -0,0 +1,189 @@ +# 开放 Gerrit SSH 端口 29419 指南 + +## 问题描述 + +Gerrit SSH 服务使用端口 29419,但防火墙阻止了外部访问,导致连接超时: +``` +ssh: connect to host 101.43.95.130 port 29419: Connection timed out +``` + +## 解决方案 + +### 方法一:使用 firewall-cmd(推荐,适用于 CentOS 7) + +如果系统使用 `firewalld` 管理防火墙: + +```bash +# 1. 添加端口到防火墙(永久生效) +sudo firewall-cmd --permanent --add-port=29419/tcp + +# 2. 重新加载防火墙配置 +sudo firewall-cmd --reload + +# 3. 验证端口是否已开放 +sudo firewall-cmd --list-ports | grep 29419 +``` + +或者直接运行脚本: +```bash +sudo bash 开放端口29419.sh +``` + +### 方法二:使用 iptables + +如果系统使用 `iptables` 管理防火墙: + +```bash +# 1. 添加 iptables 规则 +sudo iptables -I INPUT -p tcp --dport 29419 -j ACCEPT + +# 2. 保存规则(CentOS 7) +sudo iptables-save > /etc/sysconfig/iptables + +# 3. 验证规则 +sudo iptables -L -n | grep 29419 +``` + +或者直接运行脚本: +```bash +sudo bash 开放端口29419-iptables.sh +``` + +### 方法三:云服务器安全组配置 + +如果使用云服务器(阿里云、腾讯云、AWS 等),还需要在云控制台配置: + +1. **登录云控制台** +2. **找到安全组配置** +3. **添加入站规则**: + - 协议:TCP + - 端口:29419 + - 源:0.0.0.0/0(或指定 IP 范围) + - 动作:允许 + +## 验证步骤 + +### 1. 检查端口监听状态 + +```bash +# 检查 Gerrit 是否在监听端口 29419 +netstat -tlnp | grep 29419 +# 或 +ss -tlnp | grep 29419 +``` + +应该看到类似输出: +``` +tcp6 0 0 :::29419 :::* LISTEN 29768/GerritCodeRev +``` + +### 2. 测试 SSH 连接 + +从客户端测试连接: + +```bash +# 测试 SSH 连接 +ssh -p 29419 renjianbo@101.43.95.130 gerrit version +``` + +如果连接成功,会显示 Gerrit 版本信息。 + +### 3. 测试 Git 推送 + +```bash +cd /d/zhini_im_android +git push origin HEAD:refs/for/master +``` + +## 常见问题 + +### Q1: 执行 firewall-cmd 提示 "not running" + +**原因**:firewalld 服务未启动 + +**解决**: +```bash +# 启动 firewalld +sudo systemctl start firewalld +sudo systemctl enable firewalld + +# 然后再执行开放端口命令 +sudo firewall-cmd --permanent --add-port=29419/tcp +sudo firewall-cmd --reload +``` + +### Q2: 端口已开放但仍无法连接 + +**可能原因**: +1. **云服务器安全组未配置**:需要在云控制台配置安全组规则 +2. **Gerrit 服务未启动**:检查服务状态 +3. **端口被其他防火墙阻止**:检查是否有其他防火墙软件 + +**排查步骤**: +```bash +# 1. 检查 Gerrit 服务状态 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh status + +# 2. 检查端口监听 +netstat -tlnp | grep 29419 + +# 3. 检查防火墙规则 +sudo firewall-cmd --list-ports +# 或 +sudo iptables -L -n | grep 29419 +``` + +### Q3: 如何临时关闭防火墙测试? + +**注意**:仅用于测试,生产环境不推荐! + +```bash +# 临时关闭 firewalld +sudo systemctl stop firewalld + +# 临时关闭 iptables(不推荐) +sudo iptables -F +``` + +测试完成后,记得重新启动防火墙并正确配置规则。 + +## 完整操作示例 + +```bash +# 1. 检查当前防火墙状态 +sudo firewall-cmd --state + +# 2. 查看已开放的端口 +sudo firewall-cmd --list-ports + +# 3. 添加端口 29419 +sudo firewall-cmd --permanent --add-port=29419/tcp + +# 4. 重新加载配置 +sudo firewall-cmd --reload + +# 5. 验证 +sudo firewall-cmd --list-ports | grep 29419 + +# 6. 检查 Gerrit 服务 +netstat -tlnp | grep 29419 + +# 7. 测试连接(从客户端) +ssh -p 29419 renjianbo@101.43.95.130 gerrit version +``` + +## 相关文档 + +- [Gerrit 安装使用指南.md](./Gerrit安装使用指南.md) +- [SSH连接问题排查.md](./SSH连接问题排查.md) +- [从码云推送到Gerrit指南.md](./从码云推送到Gerrit指南.md) + +## 注意事项 + +1. ⚠️ **安全考虑**:开放端口后,确保 Gerrit 配置了适当的访问控制 +2. ⚠️ **云服务器**:如果使用云服务器,必须同时配置云控制台的安全组 +3. ⚠️ **端口冲突**:确认端口 29419 没有被其他服务占用 +4. ✅ **持久化**:使用 `--permanent` 参数确保规则在重启后仍然有效 + + diff --git a/彻底修复Change-Id.md b/彻底修复Change-Id.md new file mode 100644 index 0000000..1822a9c --- /dev/null +++ b/彻底修复Change-Id.md @@ -0,0 +1,188 @@ +# 彻底修复 Change-Id 重复问题 + +## 问题 + +即使使用了 SHA1,仍然有重复的 Change-Id。这可能是因为 filter-branch 的处理方式有问题。 + +## 最可靠的解决方案:使用 git rebase + commit-msg hook + +这是 Gerrit 推荐的标准方法,commit-msg hook 会基于提交内容自动生成唯一的 Change-Id。 + +### 步骤 1:清理 filter-branch 的备份引用 + +```bash +cd /d/zhini/zhini_im + +# 清理所有 filter-branch 创建的备份引用 +git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 2>/dev/null || true +``` + +### 步骤 2:确保 commit-msg hook 已安装 + +```bash +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg +``` + +### 步骤 3:使用 git rebase 让 hook 自动生成 Change-Id + +```bash +# 创建备份 +git branch backup-before-rebase-fix + +# 从第一个提交开始交互式 rebase +git rebase -i --root +``` + +**在编辑器中**: +1. 将所有 `pick` 改为 `reword`(或简写 `r`) +2. 保存并关闭(`:wq`) + +**对每个提交**: +1. 提交信息编辑器会自动打开 +2. **不要修改任何内容**,直接保存退出(`:wq`) +3. commit-msg hook 会自动为这个提交生成唯一的 Change-Id +4. 继续下一个提交 + +这个过程会自动完成,每个提交都会获得基于其内容的唯一 Change-Id。 + +### 步骤 4:验证并推送 + +```bash +# 验证所有 Change-Id 都是唯一的 +git log --format='%H' | while read commit; do + git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2 +done | sort | uniq -d + +# 如果没有输出,说明所有 Change-Id 都是唯一的 + +# 推送 +git push gerrit HEAD:refs/for/master +``` + +## 自动化脚本(如果提交太多,手动 rebase 太麻烦) + +如果提交太多,可以使用这个脚本自动化处理: + +```bash +cd /d/zhini/zhini_im + +# 1. 清理备份 +git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 2>/dev/null || true + +# 2. 确保 hook 已安装 +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 3. 创建备份 +git branch backup-before-auto-fix + +# 4. 使用 filter-branch,但这次真正运行 commit-msg hook +# 我们需要模拟提交过程,让 hook 生成 Change-Id +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + ORIGINAL=$(cat) + + # 移除旧的 Change-Id + CLEAN=$(echo "$ORIGINAL" | grep -v "^Change-Id:") + + # 将清理后的提交信息保存到临时文件 + echo "$CLEAN" > /tmp/commit_msg.txt + + # 使用 commit-msg hook 生成 Change-Id + # hook 需要环境变量 GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL 等 + export GIT_AUTHOR_NAME=$(git log -1 --format="%an" HEAD) + export GIT_AUTHOR_EMAIL=$(git log -1 --format="%ae" HEAD) + export GIT_AUTHOR_DATE=$(git log -1 --format="%ad" HEAD) + export GIT_COMMITTER_NAME=$(git log -1 --format="%cn" HEAD) + export GIT_COMMITTER_EMAIL=$(git log -1 --format="%ce" HEAD) + export GIT_COMMITTER_DATE=$(git log -1 --format="%cd" HEAD) + + # 运行 commit-msg hook + if [ -f .git/hooks/commit-msg ]; then + cat /tmp/commit_msg.txt | .git/hooks/commit-msg + else + cat /tmp/commit_msg.txt + # 如果 hook 不存在,使用 SHA1 作为后备 + echo "" + echo "Change-Id: I$(git rev-parse HEAD)" + fi + + rm -f /tmp/commit_msg.txt +' --tag-name-filter cat -- --branches --tags + +# 5. 推送 +git push gerrit HEAD:refs/for/master +``` + +## 最简单的解决方案(推荐) + +如果上面的方法还是有问题,使用这个最简单直接的方法: + +```bash +cd /d/zhini/zhini_im + +# 1. 清理所有备份 +git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 2>/dev/null || true + +# 2. 确保 hook 已安装 +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 3. 创建备份 +git branch backup-final-fix + +# 4. 使用 filter-branch,为每个提交生成基于其完整信息的唯一 Change-Id +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + ORIGINAL=$(cat) + + # 移除旧的 Change-Id + CLEAN=$(echo "$ORIGINAL" | grep -v "^Change-Id:" | sed -e :a -e "/^\$/{\$!N;ba}" -e "s/\n\$//") + + # 输出清理后的提交信息 + echo "$CLEAN" + + # 生成基于提交完整信息的唯一 Change-Id + # 使用:提交 SHA1 + 树对象 SHA1 + 父提交 SHA1 + 作者信息 + 提交者信息 + 时间戳 + COMMIT_SHA=$(git rev-parse HEAD) + TREE_SHA=$(git rev-parse HEAD^{tree}) + PARENT_SHA=$(git rev-parse HEAD^ 2>/dev/null || echo "root") + AUTHOR_NAME=$(git log -1 --format="%an" HEAD) + AUTHOR_EMAIL=$(git log -1 --format="%ae" HEAD) + AUTHOR_DATE=$(git log -1 --format="%at" HEAD) + COMMITTER_NAME=$(git log -1 --format="%cn" HEAD) + COMMITTER_EMAIL=$(git log -1 --format="%ce" HEAD) + COMMITTER_DATE=$(git log -1 --format="%ct" HEAD) + + # 组合所有信息 + UNIQUE_STRING="${COMMIT_SHA}${TREE_SHA}${PARENT_SHA}${AUTHOR_NAME}${AUTHOR_EMAIL}${AUTHOR_DATE}${COMMITTER_NAME}${COMMITTER_EMAIL}${COMMITTER_DATE}" + + # 生成 40 位十六进制字符串(使用 git hash-object) + CHANGE_ID_BASE=$(echo -n "$UNIQUE_STRING" | git hash-object --stdin | cut -c1-40) + CHANGE_ID="I${CHANGE_ID_BASE}" + + echo "" + echo "Change-Id: $CHANGE_ID" +' --tag-name-filter cat -- --branches --tags + +# 5. 验证 +echo "验证 Change-Id 唯一性..." +DUPLICATES=$(git log --format='%H' | while read commit; do + git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2 +done | sort | uniq -d) + +if [ -z "$DUPLICATES" ]; then + echo "✅ 所有 Change-Id 都是唯一的" + echo "" + echo "现在可以推送:" + echo " git push gerrit HEAD:refs/for/master" +else + echo "⚠️ 仍有重复的 Change-Id:" + echo "$DUPLICATES" +fi + + diff --git a/快速修复Change-Id.sh b/快速修复Change-Id.sh new file mode 100755 index 0000000..0f1d1a8 --- /dev/null +++ b/快速修复Change-Id.sh @@ -0,0 +1,69 @@ +#!/bin/bash +# 快速修复 Gerrit Change-Id 问题的脚本 + +echo "==========================================" +echo "安装 Gerrit commit-msg Hook" +echo "==========================================" + +# 检查是否在 Git 仓库中 +if [ ! -d .git ]; then + echo "❌ 错误:当前目录不是 Git 仓库" + echo " 请先进入项目目录:cd /d/zhini_im_android" + exit 1 +fi + +echo "" +echo "步骤 1: 创建 hooks 目录..." +mkdir -p .git/hooks + +echo "" +echo "步骤 2: 下载 commit-msg hook..." +# 使用 HTTP 方式下载(最简单可靠) +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + +if [ $? -eq 0 ]; then + echo "✅ Hook 下载成功" +else + echo "❌ Hook 下载失败,请检查网络连接" + exit 1 +fi + +echo "" +echo "步骤 3: 设置执行权限..." +chmod +x .git/hooks/commit-msg + +if [ -x .git/hooks/commit-msg ]; then + echo "✅ Hook 权限设置成功" +else + echo "❌ Hook 权限设置失败" + exit 1 +fi + +echo "" +echo "步骤 4: 验证 hook 已安装..." +if [ -f .git/hooks/commit-msg ]; then + echo "✅ commit-msg hook 已安装" + echo " 文件位置: $(pwd)/.git/hooks/commit-msg" +else + echo "❌ Hook 文件不存在" + exit 1 +fi + +echo "" +echo "==========================================" +echo "Hook 安装完成!" +echo "==========================================" +echo "" +echo "下一步操作:" +echo "" +echo "1. 修改最后一次提交以添加 Change-Id:" +echo " git commit --amend --no-edit" +echo "" +echo "2. 查看提交信息确认 Change-Id 已添加:" +echo " git log -1" +echo "" +echo "3. 重新推送代码:" +echo " git push origin HEAD:refs/for/master" +echo "" + + diff --git a/快速修复命令.txt b/快速修复命令.txt new file mode 100644 index 0000000..6048be4 --- /dev/null +++ b/快速修复命令.txt @@ -0,0 +1,26 @@ +# 快速修复并上传 - 复制粘贴执行 + +# 在 Git Bash 中执行以下命令: + +cd /d/zhini/zhini_im + +# 1. 提交所有更改 +git add . +git commit -m "Update code before push to Gerrit" + +# 2. 删除旧的远程仓库 +git remote remove gerrit + +# 3. 添加 HTTP 远程仓库(推荐,不需要 SSH) +git remote add gerrit http://101.43.95.130:8080/zhini_im + +# 4. 切换到主分支 +git checkout -b master 2>/dev/null || git checkout master + +# 5. 推送代码 +git push gerrit HEAD:refs/heads/master + +# 如果提示需要用户名密码: +# 用户名: admin +# 密码: 留空(直接回车) + diff --git a/快速开放端口29419.sh b/快速开放端口29419.sh new file mode 100755 index 0000000..e19a904 --- /dev/null +++ b/快速开放端口29419.sh @@ -0,0 +1,67 @@ +#!/bin/bash +# 快速开放端口 29419 的脚本 + +echo "==========================================" +echo "快速开放 Gerrit SSH 端口 29419" +echo "==========================================" + +if [ "$EUID" -ne 0 ]; then + echo "❌ 需要 root 权限,请使用 sudo 运行" + echo "使用方法: sudo bash 快速开放端口29419.sh" + exit 1 +fi + +echo "" +echo "步骤 1: 检查防火墙类型..." + +# 检查 firewalld +if systemctl is-active --quiet firewalld 2>/dev/null; then + echo "✅ 检测到 firewalld 正在运行" + echo " 使用 firewalld 配置..." + + firewall-cmd --permanent --add-port=29419/tcp + firewall-cmd --reload + + if firewall-cmd --list-ports | grep -q "29419/tcp"; then + echo "✅ 端口 29419 已通过 firewalld 开放" + else + echo "❌ firewalld 配置失败" + fi +else + echo "⚠️ firewalld 未运行,使用 iptables 配置..." + + # 使用 iptables + iptables -I INPUT -p tcp --dport 29419 -j ACCEPT + + # 保存规则 + if [ -f /etc/sysconfig/iptables ]; then + iptables-save > /etc/sysconfig/iptables + echo "✅ iptables 规则已保存" + else + echo "⚠️ 请手动保存 iptables 规则" + fi + + if iptables -L -n | grep -q "29419"; then + echo "✅ 端口 29419 已通过 iptables 开放" + else + echo "❌ iptables 配置失败" + fi +fi + +echo "" +echo "步骤 2: 验证端口监听..." +if netstat -tlnp | grep -q ":29419"; then + echo "✅ Gerrit 正在监听端口 29419" + netstat -tlnp | grep 29419 +else + echo "⚠️ 警告:未检测到端口 29419 监听" +fi + +echo "" +echo "==========================================" +echo "完成!" +echo "==========================================" +echo "" +echo "请从客户端测试连接:" +echo " ssh -p 29419 renjianbo@101.43.95.130 gerrit version" +echo "" diff --git a/快速添加团队成员.sh b/快速添加团队成员.sh new file mode 100755 index 0000000..b609365 --- /dev/null +++ b/快速添加团队成员.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +# 快速添加团队成员到开发组的脚本 +# 使用方法: ./快速添加团队成员.sh 用户名 + +USERNAME="${1}" +GROUP_NAME="${2:-Developers}" +GERRIT_URL="http://101.43.95.130:8080" + +if [ -z "$USERNAME" ]; then + echo "使用方法: $0 <用户名> [组名]" + echo "" + echo "示例:" + echo " $0 zhangsan" + echo " $0 lisi Developers" + echo "" + echo "注意:用户需要先通过 Web 界面注册账号" + echo "访问: $GERRIT_URL" + echo "点击 'Sign In' -> 'New Account'" + exit 1 +fi + +echo "==========================================" +echo "添加团队成员到组" +echo "==========================================" +echo "" +echo "用户名: $USERNAME" +echo "组名: $GROUP_NAME" +echo "" +echo "请通过 Web 界面操作:" +echo "" +echo "1. 访问: ${GERRIT_URL}/#/admin/groups/${GROUP_NAME},members" +echo "2. 点击 'Add' 按钮" +echo "3. 输入用户名: $USERNAME" +echo "4. 点击 'Add' 保存" +echo "" +echo "或者如果用户还未注册:" +echo "1. 让用户访问: ${GERRIT_URL}" +echo "2. 点击 'Sign In' -> 'New Account'" +echo "3. 填写用户名: $USERNAME" +echo "4. 然后按照上面的步骤添加到组" +echo "" + diff --git a/快速解决no_common_ancestry.txt b/快速解决no_common_ancestry.txt new file mode 100644 index 0000000..63818a6 --- /dev/null +++ b/快速解决no_common_ancestry.txt @@ -0,0 +1,28 @@ +# 快速解决 "no common ancestry" 错误 + +## 方案一:合并远程历史(推荐) + +cd /d/zhini/zhini_im + +# 1. 暂存子模块更改(如果不想提交) +git stash + +# 2. 拉取远程内容 +git fetch gerrit master + +# 3. 合并远程历史 +git merge gerrit/master --allow-unrelated-histories + +# 4. 推送到评审队列 +git push gerrit rjb_dev:refs/for/master + +## 方案二:强制推送(如果远程只有空提交) + +cd /d/zhini/zhini_im + +# 1. 暂存子模块更改 +git stash + +# 2. 强制推送(覆盖远程) +git push gerrit rjb_dev:refs/heads/master --force + diff --git a/快速解决推送问题.txt b/快速解决推送问题.txt new file mode 100644 index 0000000..f066bb8 --- /dev/null +++ b/快速解决推送问题.txt @@ -0,0 +1,27 @@ +# 快速解决推送被拒绝问题 + +## 推荐方案:推送到评审队列(最简单,不会冲突) + +cd /d/zhini/zhini_im + +# 1. 提交所有更改 +git add . +git commit -m "Initial push to Gerrit" + +# 2. 推送到评审队列 +git push gerrit rjb_dev:refs/for/master + +## 如果需要直接推送到主分支: + +cd /d/zhini/zhini_im + +# 1. 提交所有更改 +git add . +git commit -m "Initial push to Gerrit" + +# 2. 拉取远程内容 +git pull gerrit master --allow-unrelated-histories + +# 3. 如果有冲突,解决后推送 +git push gerrit rjb_dev:refs/heads/master + diff --git a/执行安装.md b/执行安装.md new file mode 100644 index 0000000..56cd24d --- /dev/null +++ b/执行安装.md @@ -0,0 +1,101 @@ +# Gerrit 重新安装执行指南 + +参考: [Gerrit 安装配置](https://blog.51cto.com/wst021sh/5086764) + +## 🚀 快速执行 + +```bash +cd /home/renjianbo/gerrit +chmod +x 标准重新安装.sh +./标准重新安装.sh +``` + +## 📋 脚本功能 + +脚本会自动完成以下步骤: + +1. ✅ 停止现有服务并清理进程 +2. ✅ 删除旧的 review_site 目录(所有数据) +3. ✅ 检查/下载 Gerrit 3.9.0 +4. ✅ 重新初始化 Gerrit +5. ✅ 配置 Gerrit(使用开发模式认证) +6. ✅ 配置启动脚本使用 Java 17 +7. ✅ 启动服务 + +## ⚙️ 配置说明 + +### 认证方式 +- 使用 `DEVELOPMENT_BECOME_ANY_ACCOUNT` 开发模式 +- 第一个登录的用户自动成为管理员 +- 无需密码,任意用户名即可登录 + +### 端口配置 +- Web 端口: 8080 +- SSH 端口: 29418 + +### Java 版本 +- 使用 JDK 17: `/usr/local/java/jdk-17.0.12+7` + +## ✅ 安装完成后 + +### 1. 清除浏览器缓存(重要!) + +- Chrome/Edge: `Ctrl+Shift+Delete` +- 选择"Cookie 和其他网站数据"和"缓存的图片和文件" +- 点击"清除数据" + +### 2. 访问 Gerrit + +- 打开浏览器 +- 访问:`http://101.43.95.130:8080` + +### 3. 创建管理员账号 + +- 点击右上角 "Sign In" +- 输入新用户名(例如:`admin`) +- **第一个登录的用户将自动成为管理员** + +### 4. 验证管理员权限 + +登录后: +- 访问:`http://101.43.95.130:8080/#/settings` +- 左侧应该显示 **"Administration"** 选项 +- 访问:`http://101.43.95.130:8080/#/admin/repos` +- 应该能看到 **"CREATE NEW"** 按钮 + +## 🔍 故障排查 + +### 服务无法启动 + +```bash +# 查看日志 +cd /home/renjianbo/gerrit_install/review_site +tail -50 logs/error_log + +# 检查 Java 版本 +/usr/local/java/jdk-17.0.12+7/bin/java -version + +# 检查端口 +netstat -tlnp | grep 8080 +``` + +### 无法访问 Web 界面 + +1. 检查服务状态:`bin/gerrit.sh status` +2. 检查防火墙:`sudo firewall-cmd --list-ports` +3. 开放端口:`sudo firewall-cmd --add-port=8080/tcp --permanent && sudo firewall-cmd --reload` + +### 权限问题 + +- 确保使用第一个登录的用户 +- 清除浏览器 Cookie 后重新登录 +- 检查 Settings 页面是否有 "Administration" 选项 + +## 📞 需要帮助? + +如果遇到问题,请提供: +1. 执行的命令 +2. 错误信息 +3. `bin/gerrit.sh status` 的输出 +4. `tail -50 logs/error_log` 的最后几行 + diff --git a/执行步骤.txt b/执行步骤.txt new file mode 100644 index 0000000..a7ac601 --- /dev/null +++ b/执行步骤.txt @@ -0,0 +1,56 @@ +请按顺序执行以下命令来完全重新安装 Gerrit: + +======================================== +步骤 1: 停止服务并清理 +======================================== +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +cd /home/renjianbo/gerrit_install +pkill -f "gerrit.war daemon" + +======================================== +步骤 2: 删除旧安装 +======================================== +cd /home/renjianbo/gerrit_install +rm -rf review_site + +======================================== +步骤 3: 重新初始化 +======================================== +cd /home/renjianbo/gerrit_install +export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 +export PATH=$JAVA_HOME/bin:$PATH + +java -jar gerrit-3.9.0.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + -D gerrit.canonicalWebUrl=http://101.43.95.130:8080/ \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes + +======================================== +步骤 4: 配置启动脚本 +======================================== +cd /home/renjianbo/gerrit_install/review_site +cp bin/gerrit.sh bin/gerrit.sh.bak +sed -i "2i export JAVA_HOME=/usr/local/java/jdk-17.0.12+7\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh + +======================================== +步骤 5: 启动服务 +======================================== +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh start + +等待 5-10 秒后检查: +bin/gerrit.sh status + +======================================== +步骤 6: 验证 +======================================== +检查端口: +netstat -tlnp | grep 8080 + +访问:http://101.43.95.130:8080 + diff --git a/推送成功-后续操作指南.md b/推送成功-后续操作指南.md new file mode 100644 index 0000000..d6441da --- /dev/null +++ b/推送成功-后续操作指南.md @@ -0,0 +1,176 @@ +# 推送成功 - 后续操作指南 + +## ✅ 推送成功! + +您的代码已成功推送到 Gerrit,创建了 **12 个变更**(Change 1-12)。 + +## 查看变更 + +### 方法一:访问变更列表 + +访问以下链接查看所有变更: +``` +http://101.43.95.130:8080/#/q/project:zhini_im +``` + +### 方法二:访问具体变更 + +您可以看到每个变更的链接: +- Change 1: http://101.43.95.130:8080/c/zhini_im/+/1 +- Change 2: http://101.43.95.130:8080/c/zhini_im/+/2 +- ... 等等 + +### 方法三:在 Gerrit 主界面查看 + +1. 访问:`http://101.43.95.130:8080` +2. 在 "Outgoing reviews" 部分应该能看到您的变更 +3. 点击变更可以查看详情 + +## 进行代码评审 + +### 步骤 1:打开变更页面 + +点击任意变更链接,例如: +``` +http://101.43.95.130:8080/c/zhini_im/+/1 +``` + +### 步骤 2:进行评审 + +在变更页面: +1. **查看代码差异**:页面会显示代码变更 +2. **添加评论**:可以点击代码行添加评论 +3. **进行评审**: + - 点击 "Review" 按钮 + - 选择评审分数: + - `-2`:不允许提交 + - `-1`:需要修改 + - `0`:无意见 + - `+1`:看起来不错 + - `+2`:可以提交(需要管理员权限) + +### 步骤 3:提交变更(如果评审通过) + +如果评审通过(+2),可以: +1. 点击 "Submit" 按钮 +2. 变更会合并到主分支 + +## 快速合并所有变更 + +如果您是管理员,可以快速合并所有变更: + +### 方法一:逐个提交 + +1. 访问每个变更页面 +2. 点击 "Submit" 按钮 +3. 变更会合并到主分支 + +### 方法二:批量操作 + +1. 访问变更列表:`http://101.43.95.130:8080/#/q/project:zhini_im` +2. 选择要合并的变更 +3. 点击 "Submit" 或批量操作 + +## 合并变更到主分支 + +### 如果所有变更都通过评审: + +1. **访问变更列表**: + ``` + http://101.43.95.130:8080/#/q/project:zhini_im + ``` + +2. **逐个提交变更**: + - 点击变更链接 + - 点击 "Submit" 按钮 + - 变更会合并到主分支 + +3. **验证合并**: + - 访问:`http://101.43.95.130:8080/#/admin/projects/zhini_im` + - 应该能看到所有代码 + +## 后续开发流程 + +### 日常开发流程: + +```bash +# 1. 修改代码 +# 2. 提交更改 +git add . +git commit -m "描述您的更改" + +# 3. 推送到评审队列 +git push gerrit rjb_dev:refs/for/master + +# 4. 在 Gerrit Web 界面进行评审 +# 5. 评审通过后,代码会自动合并 +``` + +### 更新本地代码: + +```bash +# 拉取最新的主分支代码 +git fetch gerrit +git merge gerrit/master + +# 或创建新分支 +git checkout -b new-feature +git push gerrit new-feature:refs/for/master +``` + +## 查看项目代码 + +合并后,可以查看项目: + +1. **项目概览**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im,general + ``` + +2. **浏览代码**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im + ``` + +3. **查看所有变更**: + ``` + http://101.43.95.130:8080/#/q/project:zhini_im + ``` + +## 团队成员协作 + +### 其他成员查看变更: + +1. 访问:`http://101.43.95.130:8080/#/q/project:zhini_im` +2. 可以看到所有待评审的变更 +3. 可以进行代码评审 + +### 其他成员克隆项目: + +```bash +# 使用 SSH +git clone ssh://admin@101.43.95.130:29418/zhini_im + +# 或使用 HTTP +git clone http://101.43.95.130:8080/zhini_im +``` + +## 常用链接 + +- **项目列表**:http://101.43.95.130:8080/#/admin/repos +- **变更列表**:http://101.43.95.130:8080/#/q/project:zhini_im +- **项目概览**:http://101.43.95.130:8080/#/admin/projects/zhini_im +- **设置页面**:http://101.43.95.130:8080/#/settings + +## 下一步操作 + +1. ✅ **代码已推送** - 12 个变更已创建 +2. 📝 **进行评审** - 访问变更页面进行评审 +3. ✅ **提交变更** - 评审通过后点击 "Submit" +4. 🎉 **完成** - 代码合并到主分支 + +## 提示 + +- 作为管理员,您可以给自己 +2 并直接提交 +- 变更会按顺序显示,可以逐个查看和提交 +- 提交后,代码会合并到主分支,其他成员可以拉取 diff --git a/推送成功后续操作指南.md b/推送成功后续操作指南.md new file mode 100644 index 0000000..4bb1971 --- /dev/null +++ b/推送成功后续操作指南.md @@ -0,0 +1,168 @@ +# 🎉 推送成功!后续操作指南 + +## ✅ 成功信息 + +您的代码变更已成功推送到 Gerrit: + +``` +remote: SUCCESS +remote: http://101.43.95.130:8080/c/test-project/+/1 Add README file +``` + +## 下一步操作 + +### 1. 查看代码变更 + +在浏览器中打开变更 URL: +``` +http://101.43.95.130:8080/c/test-project/+/1 +``` + +您可以: +- 查看代码变更内容 +- 查看文件差异 +- 添加评论 +- 进行代码评审 + +### 2. 代码评审流程 + +#### 评审者操作(如果有其他用户) + +1. **查看变更**:打开变更 URL +2. **添加评论**:在代码行上点击添加评论 +3. **评审**: + - 点击 "Review" 按钮 + - 选择评审结果: + - **+2 Code-Review**:批准(需要管理员权限) + - **+1 Code-Review**:看起来不错 + - **-1 Code-Review**:需要修改 + - **+1 Verified**:已验证(需要 CI 或管理员) + +#### 提交者操作 + +1. **查看评审意见**:在变更页面查看评论 +2. **修改代码**(如果有意见): + ```bash + cd /d/ttt/test-project + + # 修改代码 + # ... 进行修改 ... + + # 提交修改 + git add . + git commit --amend --no-edit + + # 重新推送(会自动更新原变更) + git push origin HEAD:refs/for/master + ``` + +### 3. 合并代码 + +当变更获得: +- **+2 Code-Review**(批准) +- **+1 Verified**(已验证) + +变更会自动合并,或者您可以点击 "Submit" 按钮手动合并。 + +### 4. 合并后的操作 + +```bash +cd /d/ttt/test-project + +# 更新本地仓库 +git checkout master +git pull origin master + +# 删除已合并的特性分支(如果有) +git branch -d feature-branch +``` + +## 优化配置(推荐) + +### 创建 SSH 配置文件 + +为了避免每次都要输入长命令,创建 SSH 配置文件: + +```bash +# 创建配置文件 +mkdir -p ~/.ssh +cat > ~/.ssh/config << 'EOF' +Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa +EOF + +# 设置权限 +chmod 600 ~/.ssh/config +``` + +配置后,以后可以直接使用: +```bash +git push origin HEAD:refs/for/master +``` + +### 配置 Git 用户信息 + +```bash +# 配置全局用户信息 +git config --global user.name "Your Name" +git config --global user.email "263303411@qq.com" +``` + +## 常用 Gerrit 操作 + +### 查看所有变更 + +访问:`http://101.43.95.130:8080/#/q/status:open` + +### 查看我的变更 + +访问:`http://101.43.95.130:8080/#/q/owner:renjianbo` + +### 查看项目 + +访问:`http://101.43.95.130:8080/#/admin/projects/test-project` + +## 完整的开发流程 + +```bash +# 1. 克隆项目 +git clone ssh://renjianbo@101.43.95.130:29418/test-project +cd test-project + +# 2. 创建特性分支(可选) +git checkout -b feature/new-feature + +# 3. 修改代码 +# ... 进行修改 ... + +# 4. 提交代码 +git add . +git commit -m "Add new feature" + +# 5. 推送代码评审 +git push origin HEAD:refs/for/master + +# 6. 在 Gerrit Web 界面进行评审 + +# 7. 如果有修改意见,修改后重新推送 +git commit --amend +git push origin HEAD:refs/for/master + +# 8. 合并后,更新本地仓库 +git checkout master +git pull origin master +``` + +## 恭喜! + +您已经成功完成了: +- ✅ Gerrit 安装和配置 +- ✅ 项目创建 +- ✅ SSH 密钥配置 +- ✅ 代码推送 +- ✅ 变更创建 + +现在可以在 Gerrit 中进行代码评审和协作了! + diff --git a/数据库检查结果.md b/数据库检查结果.md new file mode 100644 index 0000000..d7f45a0 --- /dev/null +++ b/数据库检查结果.md @@ -0,0 +1,90 @@ +# 数据库检查结果 + +## 检查发现 + +1. **数据库表为空**:新安装的 Gerrit 数据库可能还没有创建表结构 +2. **但账户可以登录**:从日志看,账户 1000000 可以成功登录(`a/1000000`) + +## 问题分析 + +这**不是数据库问题**,而是**浏览器 Cookie 问题**。原因: + +1. ✅ 服务器端登录成功(日志显示 `a/1000000`) +2. ✅ 账户存在(否则无法登录) +3. ❌ 浏览器没有保存 Cookie(所以显示匿名) + +## Google Chrome 浏览器的 Cookie 问题 + +Chrome 浏览器对 Cookie 有严格的安全策略,特别是: +- SameSite 属性 +- Secure 属性 +- 第三方 Cookie 限制 + +## 解决方案 + +### 方案一:检查 Chrome Cookie 设置(最重要) + +1. **打开 Chrome 设置**: + - 点击右上角三个点 → 设置 + - 或访问:`chrome://settings/cookies` + +2. **检查 Cookie 设置**: + - 确保**不是**"阻止所有 Cookie" + - 建议选择"允许所有 Cookie" + - 或者"仅阻止第三方 Cookie" + +3. **检查网站特定设置**: + - 访问:`http://101.43.95.130:8080` + - 点击地址栏左侧的锁图标或"不安全" + - 点击"Cookie" + - 确保允许 Cookie + +### 方案二:使用开发者工具检查 + +1. **按 `F12` 打开开发者工具** +2. **切换到 Application 标签** +3. **左侧选择 Cookies → `http://101.43.95.130:8080`** +4. **点击 Account ID `1000000` 登录** +5. **查看是否出现 Cookie** + +如果没有 Cookie,说明 Chrome 阻止了 Cookie。 + +### 方案三:检查网络请求 + +1. **按 `F12` → Network 标签** +2. **点击 Account ID `1000000` 登录** +3. **查看 `/login?account_id=1000000` 请求** +4. **查看 Response Headers 中的 `Set-Cookie`** +5. **查看后续请求的 Request Headers 中是否有 `Cookie`** + +### 方案四:尝试 Firefox 浏览器 + +Firefox 对 Cookie 的限制通常较少,可以尝试: +1. 下载并安装 Firefox +2. 访问:`http://101.43.95.130:8080` +3. 点击 Account ID `1000000` 登录 +4. 如果 Firefox 可以登录,说明是 Chrome 的 Cookie 策略问题 + +### 方案五:使用无痕模式测试 + +1. 按 `Ctrl+Shift+N` 打开无痕窗口 +2. 访问:`http://101.43.95.130:8080` +3. 点击 Account ID `1000000` 登录 + +如果无痕模式下可以登录,说明是 Chrome 扩展程序或设置的问题。 + +## 当前配置 + +```ini +[httpd] + listenUrl = http://*:8080/ + cookieSecure = false + cookieSameSite = NONE +``` + +这是最宽松的 Cookie 配置,应该可以工作。 + +## 结论 + +**这不是数据库问题**,而是 **Chrome 浏览器的 Cookie 安全策略**导致的。请按照上述方案检查 Chrome 的 Cookie 设置。 + diff --git a/最终修复Change-Id方案.md b/最终修复Change-Id方案.md new file mode 100644 index 0000000..b2f152f --- /dev/null +++ b/最终修复Change-Id方案.md @@ -0,0 +1,138 @@ +# 最终修复 Change-Id 重复问题 + +## 问题分析 + +多个提交使用了相同的 Change-Id,导致 Gerrit 拒绝推送。 + +## 解决方案 + +### 方法一:使用每个提交的 SHA1 作为 Change-Id(最简单可靠) + +每个 Git 提交的 SHA1 都是唯一的,直接使用它作为 Change-Id: + +```bash +cd /d/zhini/zhini_im + +# 1. 创建备份 +git branch backup-before-final-fix + +# 2. 为所有提交重新生成 Change-Id(使用每个提交的 SHA1) +git filter-branch -f --msg-filter ' + # 读取并移除旧的 Change-Id + cat | grep -v "^Change-Id:" + + # 使用当前提交的 SHA1 生成唯一的 Change-Id + echo "" + echo "Change-Id: I$(git rev-parse HEAD)" +' --tag-name-filter cat -- --branches --tags + +# 3. 验证 +git log --format='%H' | while read commit; do + changeid=$(git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2) + echo "$commit $changeid" +done | sort -k2 | uniq -d -f1 + +# 如果没有输出,说明所有 Change-Id 都是唯一的 + +# 4. 推送 +git push gerrit HEAD:refs/for/master +``` + +### 方法二:使用 git rebase 让 hook 自动生成(最标准) + +这个方法会让 commit-msg hook 为每个提交自动生成正确的 Change-Id: + +```bash +cd /d/zhini/zhini_im + +# 1. 确保 hook 已安装 +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 2. 创建备份 +git branch backup-before-rebase + +# 3. 从根提交开始 rebase +git rebase -i --root + +# 在编辑器中: +# - 将所有 'pick' 改为 'reword' +# - 保存并关闭(:wq) +# +# 对每个提交: +# - 提交信息编辑器会自动打开 +# - 不要修改任何内容,直接保存退出(:wq) +# - commit-msg hook 会自动为每个提交生成唯一的 Change-Id +# - 继续下一个提交(git rebase --continue) + +# 4. 推送 +git push gerrit HEAD:refs/for/master +``` + +### 方法三:使用脚本批量处理(自动化) + +如果提交很多,使用这个脚本: + +```bash +cd /d/zhini/zhini_im + +# 创建备份 +git branch backup-before-script-fix + +# 执行批量修复 +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + ORIGINAL=$(cat) + + # 移除所有 Change-Id 行 + CLEAN=$(echo "$ORIGINAL" | grep -v "^Change-Id:") + + # 输出清理后的内容 + echo "$CLEAN" | sed -e :a -e "/^\$/{\$!N;ba}" -e "s/\n\$//" + + # 添加新的 Change-Id(使用提交的 SHA1) + echo "" + echo "Change-Id: I$(git rev-parse HEAD)" +' --tag-name-filter cat -- --branches --tags + +# 验证并推送 +git push gerrit HEAD:refs/for/master +``` + +## 推荐操作(最简单) + +直接执行这个命令: + +```bash +cd /d/zhini/zhini_im + +# 一步完成:移除所有旧的 Change-Id,为每个提交使用其 SHA1 生成新的 +git filter-branch -f --msg-filter 'cat | grep -v "^Change-Id:" && echo "" && echo "Change-Id: I$(git rev-parse HEAD)"' --tag-name-filter cat -- --branches --tags + +# 推送 +git push gerrit HEAD:refs/for/master +``` + +## 如果还是有问题 + +检查是否所有提交都有 Change-Id: + +```bash +# 检查所有提交的 Change-Id +git log --format='%H' | while read commit; do + changeid=$(git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2) + if [ -z "$changeid" ]; then + echo "缺少 Change-Id: $commit" + else + echo "$commit: $changeid" + fi +done + +# 检查重复的 Change-Id +git log --format='%H' | while read commit; do + git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2 +done | sort | uniq -d +``` + + diff --git a/最终解决方案.md b/最终解决方案.md new file mode 100644 index 0000000..67a6af2 --- /dev/null +++ b/最终解决方案.md @@ -0,0 +1,95 @@ +# Gerrit HTTP 推送认证问题 - 最终解决方案 + +## 问题根源 + +`DEVELOPMENT_BECOME_ANY_ACCOUNT` 模式默认不支持 HTTP Basic 认证进行 Git 操作。我已经在服务器端添加了 `gitBasicAuth = true` 配置。 + +## 解决方案 + +### 步骤 1:等待服务器重启完成 + +服务器正在重启,请等待 10-15 秒。 + +### 步骤 2:重新尝试推送 + +在您的本地电脑上执行: + +```bash +cd /d/ttt/test-project + +# 确保远程 URL 包含用户名 +git remote set-url origin http://renjianbo@101.43.95.130:8080/test-project + +# 清除已保存的凭证(如果有) +git credential reject </dev/null || true + fi +fi +pkill -9 -f "gerrit.war" 2>/dev/null || true +sleep 2 +echo "✓ 服务已停止" +echo "" + +# 2. 删除旧安装 +echo "[2/7] 删除旧安装..." +cd ${GERRIT_HOME} +rm -rf review_site +echo "✓ 已删除旧安装" +echo "" + +# 3. 检查并下载 Gerrit +echo "[3/7] 检查安装包..." +if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then + echo "下载 Gerrit ${GERRIT_VERSION}..." + wget -q https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war +fi +echo "✓ 安装包就绪" +echo "" + +# 4. 初始化 Gerrit +echo "[4/7] 初始化 Gerrit(这可能需要几分钟)..." +cd ${GERRIT_HOME} +java -Dgerrit.canonicalWebUrl=http://${SERVER_IP}:${GERRIT_PORT}/ \ + -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes + +echo "✓ 初始化完成" +echo "" + +# 5. 配置 Gerrit +echo "[5/7] 配置 Gerrit..." +cd ${GERRIT_HOME}/review_site + +# 创建配置文件 +cat > etc/gerrit.config << EOF +[gerrit] + basePath = git + canonicalWebUrl = http://${SERVER_IP}:${GERRIT_PORT}/ + serverId = $(date +%s) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT + gitBasicAuth = true +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ + cookieSecure = false + cookieSameSite = LAX + cookiePath = / +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOF + +echo "✓ 配置完成" +echo "" + +# 6. 配置启动脚本 +echo "[6/7] 配置启动脚本..." +cd ${GERRIT_HOME}/review_site + +# 备份原脚本 +cp bin/gerrit.sh bin/gerrit.sh.bak + +# 在脚本开头添加 Java 环境变量 +if ! grep -q "JAVA_HOME.*jdk-17" bin/gerrit.sh; then + sed -i "2i export JAVA_HOME=${JAVA_HOME}\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh +fi + +echo "✓ 启动脚本已配置" +echo "" + +# 7. 启动服务 +echo "[7/7] 启动 Gerrit 服务..." +cd ${GERRIT_HOME}/review_site +bin/gerrit.sh start + +echo "等待服务启动..." +sleep 8 + +# 检查服务状态 +if bin/gerrit.sh status 2>&1 | grep -q "Gerrit running\|Running"; then + echo "✓ 服务启动成功" +else + echo "检查服务状态..." + bin/gerrit.sh status 2>&1 | head -10 +fi + +echo "" +echo "==========================================" +echo "安装完成!" +echo "==========================================" +echo "" +echo "访问地址: http://${SERVER_IP}:${GERRIT_PORT}" +echo "" +echo "重要提示:" +echo "1. 清除浏览器 Cookie 和缓存" +echo "2. 访问上述地址" +echo "3. 点击 'Sign In',输入用户名(例如:admin)" +echo "4. 第一个登录的用户将自动成为管理员" +echo "5. 登录后应该能看到 'CREATE NEW' 按钮" +echo "" +echo "常用命令:" +echo " 查看状态: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh status" +echo " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/error_log" +echo " 停止服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh stop" +echo " 重启服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh restart" +echo "" + diff --git a/检查并修复Change-Id.sh b/检查并修复Change-Id.sh new file mode 100644 index 0000000..73da5a4 --- /dev/null +++ b/检查并修复Change-Id.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +# 检查并修复重复的 Change-Id + +echo "==========================================" +echo "检查 Change-Id 重复问题" +echo "==========================================" +echo "" + +cd /d/zhini/zhini_im || exit 1 + +# 1. 检查所有提交的 Change-Id +echo "步骤 1: 检查所有提交的 Change-Id..." +echo "" + +# 找出所有 Change-Id +git log --format='%H' | while read commit; do + changeid=$(git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2) + if [ -n "$changeid" ]; then + echo "$commit $changeid" + else + echo "$commit MISSING" + fi +done > /tmp/all_changeids.txt + +# 检查重复的 +echo "步骤 2: 查找重复的 Change-Id..." +DUPLICATES=$(cat /tmp/all_changeids.txt | awk '{print $2}' | sort | uniq -d) + +if [ -z "$DUPLICATES" ]; then + echo "✅ 没有发现重复的 Change-Id" +else + echo "⚠️ 发现重复的 Change-Id:" + echo "$DUPLICATES" + echo "" + echo "这些提交使用了相同的 Change-Id:" + for dup in $DUPLICATES; do + echo "" + echo "Change-Id: $dup" + grep " $dup$" /tmp/all_changeids.txt | awk '{print " Commit: " $1}' + done +fi + +echo "" +echo "步骤 3: 统计信息..." +TOTAL=$(git rev-list --count HEAD) +WITH_CHANGEID=$(cat /tmp/all_changeids.txt | grep -v "MISSING" | wc -l) +MISSING=$(cat /tmp/all_changeids.txt | grep "MISSING" | wc -l) + +echo "总提交数: $TOTAL" +echo "有 Change-Id: $WITH_CHANGEID" +echo "缺少 Change-Id: $MISSING" + +# 清理临时文件 +rm -f /tmp/all_changeids.txt + + diff --git a/检查并启动服务.sh b/检查并启动服务.sh new file mode 100644 index 0000000..e93cb5b --- /dev/null +++ b/检查并启动服务.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +# Gerrit 服务检查和启动脚本 + +GERRIT_HOME="/home/renjianbo/gerrit_install" +JAVA_HOME="/usr/local/java/jdk-17.0.12+7" + +echo "==========================================" +echo "检查 Gerrit 服务状态" +echo "==========================================" +echo "" + +# 检查 review_site 是否存在 +if [ ! -d "${GERRIT_HOME}/review_site" ]; then + echo "❌ review_site 目录不存在!" + echo "" + echo "需要重新初始化 Gerrit,请执行:" + echo " cd /home/renjianbo/gerrit" + echo " ./reinit_gerrit.sh" + echo "" + exit 1 +fi + +cd ${GERRIT_HOME}/review_site + +# 检查服务状态 +echo "检查服务状态..." +if [ -f "bin/gerrit.sh" ]; then + bin/gerrit.sh status 2>&1 + STATUS=$? + + if [ $STATUS -ne 0 ] || ! bin/gerrit.sh status 2>&1 | grep -q "Running\|Gerrit running"; then + echo "" + echo "服务未运行,正在启动..." + echo "" + + # 设置 Java 环境 + export JAVA_HOME=$JAVA_HOME + export PATH=$JAVA_HOME/bin:$PATH + + # 确保启动脚本使用 Java 17 + if ! grep -q "JAVA_HOME.*jdk-17" bin/gerrit.sh 2>/dev/null; then + echo "更新启动脚本使用 Java 17..." + cp bin/gerrit.sh bin/gerrit.sh.bak + sed -i "2i export JAVA_HOME=${JAVA_HOME}\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh + fi + + # 启动服务 + bin/gerrit.sh start + + sleep 5 + + # 再次检查状态 + echo "" + echo "检查启动结果..." + bin/gerrit.sh status 2>&1 + + if bin/gerrit.sh status 2>&1 | grep -q "Running\|Gerrit running"; then + echo "" + echo "✅ 服务启动成功!" + echo "" + echo "访问地址: http://101.43.95.130:8080" + else + echo "" + echo "❌ 服务启动失败,请查看日志:" + echo " tail -f ${GERRIT_HOME}/review_site/logs/error_log" + fi + else + echo "" + echo "✅ 服务正在运行" + echo "" + echo "访问地址: http://101.43.95.130:8080" + fi +else + echo "❌ 未找到 bin/gerrit.sh" + echo "review_site 可能未正确初始化" + exit 1 +fi + +echo "" +echo "检查端口监听..." +if command -v netstat &> /dev/null; then + netstat -tlnp 2>/dev/null | grep ":8080" || echo "⚠️ 端口 8080 未被监听" +elif command -v ss &> /dev/null; then + ss -tlnp 2>/dev/null | grep ":8080" || echo "⚠️ 端口 8080 未被监听" +fi + +echo "" +echo "检查进程..." +ps aux | grep "[g]errit.war daemon" | head -2 + +echo "" +echo "==========================================" + diff --git a/检查并开放端口29419.md b/检查并开放端口29419.md new file mode 100644 index 0000000..d04cfe0 --- /dev/null +++ b/检查并开放端口29419.md @@ -0,0 +1,161 @@ +# 检查并开放端口 29419 - 操作步骤 + +## 当前状态 + +✅ **腾讯云安全组**:已配置开放 29419 端口 +✅ **Gerrit 服务**:正在监听 29419 端口(进程 29768) +❌ **本地防火墙**:可能仍在阻止端口访问 + +## 需要执行的命令 + +请在服务器上以 root 权限执行以下命令: + +### 步骤 1:检查防火墙状态 + +```bash +# 检查 firewalld 是否运行 +sudo systemctl status firewalld + +# 检查 iptables 规则 +sudo iptables -L -n | grep 29419 +``` + +### 步骤 2:开放端口(选择一种方法) + +#### 方法 A:使用 firewall-cmd(如果 firewalld 正在运行) + +```bash +# 添加端口 +sudo firewall-cmd --permanent --add-port=29419/tcp + +# 重新加载 +sudo firewall-cmd --reload + +# 验证 +sudo firewall-cmd --list-ports | grep 29419 +``` + +#### 方法 B:使用 iptables(如果使用 iptables) + +```bash +# 添加规则 +sudo iptables -I INPUT -p tcp --dport 29419 -j ACCEPT + +# 保存规则(CentOS 7) +sudo iptables-save > /etc/sysconfig/iptables + +# 验证 +sudo iptables -L -n | grep 29419 +``` + +### 步骤 3:验证端口可访问性 + +从**客户端**(您的 Windows 电脑)测试: + +```bash +# 测试 SSH 连接 +ssh -p 29419 renjianbo@101.43.95.130 gerrit version +``` + +如果成功,会显示 Gerrit 版本信息。 + +### 步骤 4:测试 Git 推送 + +```bash +cd /d/zhini_im_android +git push origin HEAD:refs/for/master +``` + +## 如果仍然无法连接 + +### 检查 iptables 默认策略 + +```bash +# 查看 INPUT 链的默认策略 +sudo iptables -L INPUT -n + +# 如果默认策略是 DROP,需要确保有 ACCEPT 规则 +# 或者临时修改策略(不推荐生产环境) +sudo iptables -P INPUT ACCEPT +``` + +### 检查是否有其他防火墙软件 + +```bash +# 检查是否有其他防火墙服务 +sudo systemctl list-units | grep -i firewall +sudo systemctl list-units | grep -i iptables +``` + +### 检查 SELinux(如果启用) + +```bash +# 检查 SELinux 状态 +getenforce + +# 如果启用,可能需要配置 SELinux 规则 +sudo semanage port -a -t ssh_port_t -p tcp 29419 +``` + +## 快速诊断脚本 + +在服务器上执行以下命令进行完整诊断: + +```bash +echo "=== 1. 检查 Gerrit 服务 ===" +netstat -tlnp | grep 29419 + +echo "" +echo "=== 2. 检查 firewalld ===" +sudo systemctl status firewalld 2>/dev/null | head -3 + +echo "" +echo "=== 3. 检查 firewall-cmd 规则 ===" +sudo firewall-cmd --list-ports 2>/dev/null || echo "firewalld 未运行" + +echo "" +echo "=== 4. 检查 iptables 规则 ===" +sudo iptables -L -n | grep 29419 || echo "未找到 29419 规则" + +echo "" +echo "=== 5. 检查 iptables 默认策略 ===" +sudo iptables -L INPUT -n | head -5 +``` + +## 完整解决方案(一键执行) + +如果确定使用 iptables,可以执行: + +```bash +# 添加规则 +sudo iptables -I INPUT -p tcp --dport 29419 -j ACCEPT + +# 保存规则 +sudo iptables-save > /etc/sysconfig/iptables + +# 验证 +sudo iptables -L -n | grep 29419 +``` + +如果确定使用 firewalld,可以执行: + +```bash +# 确保 firewalld 运行 +sudo systemctl start firewalld +sudo systemctl enable firewalld + +# 添加端口 +sudo firewall-cmd --permanent --add-port=29419/tcp +sudo firewall-cmd --reload + +# 验证 +sudo firewall-cmd --list-ports | grep 29419 +``` + +## 注意事项 + +1. ⚠️ 如果修改了防火墙规则,建议先测试,确保不会影响其他服务 +2. ⚠️ 生产环境建议使用更严格的防火墙规则(限制源 IP) +3. ✅ 修改后记得保存规则,确保重启后仍然有效 + + diff --git a/正确修复Change-Id.sh b/正确修复Change-Id.sh new file mode 100644 index 0000000..227b0c5 --- /dev/null +++ b/正确修复Change-Id.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +# 正确修复 Change-Id:每个提交使用自己的 SHA1 + +echo "==========================================" +echo "正确修复 Change-Id - 每个提交使用自己的 SHA1" +echo "==========================================" +echo "" + +cd /d/zhini/zhini_im || exit 1 + +# 1. 清理备份 +echo "步骤 1: 清理 filter-branch 备份..." +git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 2>/dev/null || true +echo "✅ 清理完成" +echo "" + +# 2. 创建新备份 +echo "步骤 2: 创建备份..." +BACKUP_BRANCH="backup-$(date +%Y%m%d-%H%M%S)" +git branch "$BACKUP_BRANCH" +echo "✅ 备份分支: $BACKUP_BRANCH" +echo "" + +# 3. 修复 Change-Id +echo "步骤 3: 为每个提交生成唯一的 Change-Id..." +echo "关键:使用 \$GIT_COMMIT 环境变量(正在处理的提交的 SHA1)" +echo "" + +# 设置环境变量以消除警告 +export FILTER_BRANCH_SQUELCH_WARNING=1 + +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + ORIGINAL=$(cat) + + # 移除旧的 Change-Id + CLEAN=$(echo "$ORIGINAL" | grep -v "^Change-Id:" | sed -e :a -e "/^\$/{\$!N;ba}" -e "s/\n\$//") + + # 输出清理后的提交信息 + echo "$CLEAN" + + # 关键:使用 $GIT_COMMIT 环境变量,它包含正在被处理的提交的 SHA1 + # 而不是使用 git rev-parse HEAD(那会返回当前 HEAD) + CURRENT_COMMIT="${GIT_COMMIT}" + + # 为当前提交生成唯一的 Change-Id + CHANGE_ID="I${CURRENT_COMMIT}" + + echo "" + echo "Change-Id: $CHANGE_ID" +' --tag-name-filter cat -- --branches --tags + +if [ $? -eq 0 ]; then + echo "" + echo "✅ Change-Id 修复完成!" + echo "" + + # 验证 + echo "步骤 4: 验证 Change-Id 唯一性..." + DUPLICATES=$(git log --format='%H' | while read commit; do + git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2 + done | sort | uniq -d) + + if [ -z "$DUPLICATES" ]; then + echo "✅ 所有 Change-Id 都是唯一的!" + echo "" + echo "现在可以推送:" + echo " git push gerrit HEAD:refs/for/master" + else + echo "⚠️ 仍有重复的 Change-Id:" + echo "$DUPLICATES" + echo "" + echo "请检查并重试" + fi +else + echo "" + echo "❌ 修复失败" + echo "可以恢复备份:git reset --hard $BACKUP_BRANCH" + exit 1 +fi + + diff --git a/正确的Git克隆命令.md b/正确的Git克隆命令.md new file mode 100644 index 0000000..6babd74 --- /dev/null +++ b/正确的Git克隆命令.md @@ -0,0 +1,98 @@ +# 正确的 Git 克隆命令 + +## ❌ 错误的 URL + +```bash +git clone http://101.43.95.130:8080/#/admin/projects/test-project +``` + +**问题**:`#/admin/projects/` 是 Web 界面的路径,不是 Git 仓库的 URL。 + +## ✅ 正确的克隆命令 + +### 方式一:通过 HTTP(推荐,最简单) + +```bash +git clone http://101.43.95.130:8080/test-project +``` + +**注意**: +- 不要包含 `#/admin/projects/` +- 直接使用项目名称:`test-project` +- 如果提示输入用户名,输入:`renjianbo`(密码留空) + +### 方式二:通过 SSH(需要配置 SSH 密钥) + +```bash +git clone ssh://renjianbo@101.43.95.130:29418/test-project +``` + +**注意**: +- 需要先配置 SSH 密钥 +- 端口是 `29418`(不是 22) + +## 完整的操作步骤 + +### 1. 克隆项目 + +```bash +# 在您的本地电脑上执行 +git clone http://101.43.95.130:8080/test-project +``` + +如果提示输入用户名,输入:`renjianbo`,密码留空。 + +### 2. 进入项目目录 + +```bash +cd test-project +``` + +### 3. 创建初始文件并提交 + +```bash +echo "# Test Project" > README.md +git add README.md +git commit -m "Add README file" +``` + +### 4. 推送到 Gerrit 进行评审 + +```bash +# 推送到评审队列(关键:推送到 refs/for/master) +git push origin HEAD:refs/for/master +``` + +**重要**:必须推送到 `refs/for/master`,不是直接推送到 `master`。 + +### 5. 查看变更 + +推送成功后,Gerrit 会返回一个 URL,在浏览器中打开即可查看变更详情。 + +## 如果克隆失败 + +### 检查项目是否存在 + +访问:`http://101.43.95.130:8080/#/admin/projects/test-project` + +如果项目不存在,可能需要: +1. 刷新 Repositories 页面 +2. 或者重新创建项目 + +### 检查权限 + +确保您有访问项目的权限。如果是新创建的项目,通常创建者应该有权限。 + +## 快速参考 + +```bash +# 克隆项目 +git clone http://101.43.95.130:8080/test-project + +# 推送代码评审 +git push origin HEAD:refs/for/master + +# 直接推送(跳过评审,个人使用) +git push origin HEAD:refs/heads/master +``` + diff --git a/浏览器Cookie问题解决方案.md b/浏览器Cookie问题解决方案.md new file mode 100644 index 0000000..a0c8772 --- /dev/null +++ b/浏览器Cookie问题解决方案.md @@ -0,0 +1,155 @@ +# 浏览器 Cookie 问题解决方案 + +## 问题现象 +点击 Account ID 登录后,服务器端显示登录成功(日志中有 `a/1000008`),但浏览器界面仍然显示 "ANONYMOUS"。 + +## 问题原因 +这是典型的 **浏览器 Cookie 问题**。服务器端登录成功,但浏览器没有正确保存或发送 Cookie。 + +## 解决方案 + +### 方案一:完全清除浏览器数据(最重要!) + +**这是最关键的步骤,必须执行:** + +1. **打开浏览器设置**: + - Chrome/Edge: 点击右上角三个点 → 设置 + - 或直接按 `Ctrl+Shift+Delete` + +2. **清除浏览数据**: + - 时间范围:选择"所有时间" + - 勾选以下选项: + - ✅ Cookie 和其他网站数据 + - ✅ 缓存的图片和文件 + - ✅ 浏览历史记录 + - 点击"清除数据" + +3. **关闭所有浏览器窗口**,重新打开浏览器 + +4. **重新访问**:`http://101.43.95.130:8080` + +### 方案二:使用无痕模式(推荐测试) + +1. 按 `Ctrl+Shift+N` 打开无痕窗口 +2. 访问:`http://101.43.95.130:8080` +3. 点击 Account ID 登录 +4. 如果无痕模式下可以登录,说明是浏览器缓存问题 + +### 方案三:检查浏览器 Cookie 设置 + +1. **检查是否阻止了第三方 Cookie**: + - Chrome/Edge: 设置 → 隐私设置和安全性 → Cookie 和其他网站数据 + - 确保允许 Cookie + +2. **检查网站特定的 Cookie 设置**: + - 在地址栏点击锁图标或"不安全" + - 查看 Cookie 设置 + - 确保允许 Cookie + +### 方案四:手动检查 Cookie + +1. **打开开发者工具**: + - 按 `F12` 打开开发者工具 + - 切换到 **Application**(应用程序)标签(Chrome)或 **存储** 标签(Firefox) + +2. **查看 Cookie**: + - 左侧选择 **Cookies** → `http://101.43.95.130:8080` + - 登录后,应该能看到 Gerrit 相关的 Cookie(如 `GerritAccount`) + +3. **如果没有 Cookie**: + - 说明浏览器阻止了 Cookie + - 需要检查浏览器设置 + +### 方案五:使用不同的浏览器测试 + +如果当前浏览器有问题,可以尝试: +- Chrome +- Firefox +- Edge +- Safari + +## 验证登录是否成功 + +### 方法一:查看浏览器开发者工具 + +1. 按 `F12` 打开开发者工具 +2. 切换到 **Network**(网络)标签 +3. 刷新页面 +4. 查看任意请求的 **Headers**(请求头) +5. 在 **Request Headers** 中查找 `Cookie:` 字段 +6. 如果看到 `GerritAccount=...` 等 Cookie,说明 Cookie 已保存 + +### 方法二:查看服务器日志 + +```bash +cd /home/renjianbo/gerrit_install/review_site +tail -f logs/httpd_log +``` + +登录后,日志中应该显示 `a/1000008`(已登录),而不是 `-`(匿名用户)。 + +## 当前配置 + +已更新的配置: +- `canonicalWebUrl = http://101.43.95.130:8080/` +- `cookieSecure = false`(允许 HTTP 使用 Cookie) +- `cookieSameSite = LAX`(允许跨站 Cookie) + +## 如果仍然无法登录 + +### 检查清单 + +1. ✅ 已清除浏览器缓存和 Cookie +2. ✅ 已关闭并重新打开浏览器 +3. ✅ 浏览器允许 Cookie +4. ✅ 使用正确的访问地址:`http://101.43.95.130:8080` +5. ✅ 服务器日志显示登录成功(`a/1000008`) + +### 进一步排查 + +如果以上都做了还是不行,请: + +1. **检查浏览器控制台**: + - 按 `F12` → **Console**(控制台)标签 + - 查看是否有 JavaScript 错误 + +2. **检查网络请求**: + - 按 `F12` → **Network**(网络)标签 + - 刷新页面 + - 查看登录相关的请求(`/login?account_id=1000008`) + - 检查响应头中是否有 `Set-Cookie` 字段 + +3. **提供信息**: + - 浏览器类型和版本 + - 控制台的错误信息 + - 网络请求的详细信息 + +## 临时解决方案 + +如果 Cookie 问题无法解决,可以: + +1. **每次访问都重新登录**(虽然麻烦,但可以工作) +2. **使用 SSH 方式操作**(不依赖 Web 登录) +3. **考虑使用反向代理配置 HTTPS**(可以解决一些 Cookie 问题) + +## 常见问题 + +### Q: 为什么服务器显示登录成功,但浏览器还是匿名? + +A: 这是 Cookie 问题。服务器端已经识别了您的身份,但浏览器没有保存或发送 Cookie,所以每次请求都被当作匿名用户。 + +### Q: 清除缓存后还是不行? + +A: 请尝试: +1. 完全关闭浏览器(不只是关闭标签页) +2. 使用无痕模式测试 +3. 检查浏览器是否安装了阻止 Cookie 的扩展程序 +4. 尝试不同的浏览器 + +### Q: 无痕模式下可以登录,正常模式不行? + +A: 说明是浏览器缓存或扩展程序的问题。请: +1. 禁用所有浏览器扩展程序 +2. 清除浏览器数据 +3. 重新尝试 + diff --git a/添加Change-Id指南.md b/添加Change-Id指南.md new file mode 100644 index 0000000..55089bc --- /dev/null +++ b/添加Change-Id指南.md @@ -0,0 +1,136 @@ +# 为所有提交添加 Change-Id + +## 问题 + +推送时出现错误: +``` +ERROR: commit 16b3dc9: missing Change-Id in message footer +``` + +这是因为 Gerrit 要求每个提交都必须包含 Change-Id。 + +## 解决方案 + +### 步骤 1:安装 commit-msg hook + +在您的代码目录中执行: + +```bash +cd /d/zhini/zhini_im + +# 下载并安装 commit-msg hook +gitdir=$(git rev-parse --git-dir) +scp -p -P 29418 renjianbo@101.43.95.130:hooks/commit-msg ${gitdir}/hooks/ + +# 或者使用 curl(如果 scp 不可用) +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg +``` + +### 步骤 2:为所有提交添加 Change-Id + +由于您有很多提交,需要批量处理: + +#### 方法一:使用 git filter-branch(推荐) + +```bash +cd /d/zhini/zhini_im + +# 为所有提交添加 Change-Id +git filter-branch -f --msg-filter ' + # 如果提交信息中没有 Change-Id,添加一个 + if ! grep -q "^Change-Id:" "$1"; then + # 生成 Change-Id(基于提交的父提交和树对象) + CHANGE_ID=$(git hash-object -t commit "$1" | cut -c1-40) + echo "" + echo "Change-Id: I$CHANGE_ID" >> "$1" + fi + cat "$1" +' --tag-name-filter cat -- --branches --tags +``` + +#### 方法二:使用 git rebase(如果提交较少) + +```bash +cd /d/zhini/zhini_im + +# 交互式 rebase,为每个提交添加 Change-Id +git rebase -i --root + +# 在编辑器中,将所有 'pick' 改为 'reword' +# 保存后,对每个提交: +# 1. 编辑提交信息 +# 2. 在提交信息末尾添加空行和 Change-Id +# 3. 保存并继续下一个提交 +``` + +#### 方法三:使用 git filter-repo(更现代的方法,需要先安装) + +如果安装了 git-filter-repo: +```bash +# 需要先安装 git-filter-repo +# pip install git-filter-repo + +git filter-repo --message-callback ' + if b"Change-Id:" not in message: + # 生成 Change-Id + import hashlib + change_id = hashlib.sha1(message + b"change-id").hexdigest()[:40] + message = message.rstrip() + b"\n\nChange-Id: I" + change_id.encode() + b"\n" + return message +' +``` + +### 步骤 3:验证 Change-Id 已添加 + +```bash +# 检查最近的几个提交是否都有 Change-Id +git log --format='%H%n%B' -5 | grep -A 5 "Change-Id:" + +# 或者检查所有提交 +git log --format='%H' | while read commit; do + if ! git log -1 --format='%B' $commit | grep -q "^Change-Id:"; then + echo "Missing Change-Id: $commit" + fi +done +``` + +### 步骤 4:重新推送 + +```bash +git push gerrit HEAD:refs/for/master +``` + +## 快速修复脚本 + +创建一个简单的脚本来批量添加 Change-Id: + +```bash +cd /d/zhini/zhini_im + +# 安装 hook +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 为所有提交添加 Change-Id +git filter-branch -f --msg-filter ' + if ! grep -q "^Change-Id:" "$1"; then + # 使用提交的 SHA1 前40位作为 Change-Id 的基础 + COMMIT_SHA=$(git hash-object -t commit "$1") + CHANGE_ID="I${COMMIT_SHA:0:40}" + echo "" + echo "Change-Id: $CHANGE_ID" >> "$1" + fi + cat "$1" +' --tag-name-filter cat -- --branches --tags +``` + +## 注意事项 + +1. **备份**:在执行 filter-branch 前,建议创建备份分支 +2. **时间**:如果有大量提交,这个过程可能需要一些时间 +3. **Change-Id 格式**:Change-Id 应该以 `I` 开头,后跟40位十六进制字符 + + diff --git a/添加团队成员账号指南.md b/添加团队成员账号指南.md new file mode 100644 index 0000000..16b579c --- /dev/null +++ b/添加团队成员账号指南.md @@ -0,0 +1,179 @@ +# Gerrit 添加团队成员账号指南 + +## 方法一:让团队成员自己注册(推荐,最简单) + +在开发模式下(`DEVELOPMENT_BECOME_ANY_ACCOUNT`),团队成员可以自己注册账号。 + +### 操作步骤: + +1. **团队成员访问 Gerrit** + - 打开浏览器 + - 访问:`http://101.43.95.130:8080` + +2. **注册账号** + - 点击 "Sign In" + - 在登录页面,点击 "New Account" 按钮 + - 系统会自动创建账户并登录 + +3. **管理员添加用户到组** + - 管理员登录后,访问:`http://101.43.95.130:8080/#/admin/groups` + - 创建或选择用户组(例如:`Developers`) + - 添加团队成员到组中 + +## 方法二:管理员通过 Web 界面添加用户到组 + +### 步骤 1:创建用户组(如果需要) + +1. 访问:`http://101.43.95.130:8080/#/admin/groups` +2. 点击 "CREATE NEW" 按钮 +3. 输入组名(例如:`Developers`) +4. 点击 "CREATE" + +### 步骤 2:添加用户到组 + +1. 访问:`http://101.43.95.130:8080/#/admin/groups/Developers,members` + - 将 `Developers` 替换为您创建的组名 +2. 点击 "Add" 或 "+" 按钮 +3. 输入用户名(团队成员注册时使用的用户名) +4. 点击 "Add" 保存 + +### 步骤 3:配置项目权限 + +1. 访问项目页面:`http://101.43.95.130:8080/#/admin/projects/项目名称,access` +2. 点击 "Edit" 按钮 +3. 添加权限规则: + - **Reference**: `refs/heads/*` + - **Permission**: `Read` + - **Group**: `Developers`(或您创建的组名) + - 点击 "Add" +4. 添加评审权限: + - **Reference**: `refs/for/*` + - **Permission**: `Label Code-Review` + - **Group**: `Developers` + - **Value**: `-2..+2`(允许 -2 到 +2 的评审) + - 点击 "Add" +5. 点击 "Save Changes" 保存 + +## 方法三:通过命令行添加用户(如果 SSH 配置正确) + +```bash +# 添加用户到组 +ssh -p 29418 admin@101.43.95.130 gerrit set-members --add 用户名 Developers + +# 查看组成员 +ssh -p 29418 admin@101.43.95.130 gerrit ls-members Developers +``` + +## 推荐的权限配置 + +### 给开发组配置的权限: + +1. **读取权限**: + - Reference: `refs/heads/*` + - Permission: `Read` + - Group: `Developers` + +2. **代码评审权限**: + - Reference: `refs/for/*` + - Permission: `Label Code-Review` + - Group: `Developers` + - Value: `-2..+2` + +3. **提交权限**(如果需要): + - Reference: `refs/heads/*` + - Permission: `Push` + - Group: `Developers` + +## 快速操作流程 + +### 管理员操作: + +1. **创建开发组**: + ``` + 访问: http://101.43.95.130:8080/#/admin/groups + 点击 "CREATE NEW" + 输入组名: Developers + 点击 "CREATE" + ``` + +2. **添加团队成员**: + ``` + 访问: http://101.43.95.130:8080/#/admin/groups/Developers,members + 点击 "Add" + 输入用户名(团队成员注册时使用的用户名) + 点击 "Add" + ``` + +3. **配置项目权限**: + ``` + 访问: http://101.43.95.130:8080/#/admin/projects/项目名称,access + 点击 "Edit" + 添加权限规则(参考上面的推荐配置) + 点击 "Save Changes" + ``` + +### 团队成员操作: + +1. 访问:`http://101.43.95.130:8080` +2. 点击 "Sign In" +3. 点击 "New Account" +4. 填写用户名等信息 +5. 等待管理员添加到组中 + +## 验证配置 + +### 检查组成员: + +访问:`http://101.43.95.130:8080/#/admin/groups/Developers,members` + +应该能看到所有团队成员的用户名。 + +### 检查项目权限: + +访问:`http://101.43.95.130:8080/#/admin/projects/项目名称,access` + +应该能看到配置的权限规则。 + +## 常见问题 + +### Q: 用户注册后看不到项目? + +**A:** 需要: +1. 将用户添加到有权限的组 +2. 在项目权限中给该组配置 Read 权限 + +### Q: 用户无法进行代码评审? + +**A:** 需要: +1. 在项目权限中给组配置 `Label Code-Review` 权限 +2. 设置合适的值范围(例如:`-2..+2`) + +### Q: 如何给用户 +2 权限? + +**A:** 在项目权限中: +- Reference: `refs/heads/*` 或 `refs/for/*` +- Permission: `Label Code-Review` +- Group/User: 选择用户或组 +- Value: `+2` + +## 示例:完整的权限配置 + +``` +项目: zhini_im + +权限规则: +1. refs/heads/* + - Read: Developers + - Push: Administrators + - Label Code-Review +2: Administrators + +2. refs/for/* + - Read: Developers + - Label Code-Review -2..+2: Developers + - Label Code-Review +2: Administrators +``` + +这样配置后: +- Developers 组的成员可以读取代码、创建变更、进行评审(-2 到 +2) +- Administrators 可以 +2 并直接合并代码 + diff --git a/添加管理员权限指南.md b/添加管理员权限指南.md new file mode 100644 index 0000000..9dc15e1 --- /dev/null +++ b/添加管理员权限指南.md @@ -0,0 +1,106 @@ +# 添加管理员权限指南 - 显示 "CREATE NEW" 按钮 + +## 问题说明 + +如果您的 Gerrit 页面没有 "CREATE NEW" 按钮,通常是因为**账号没有管理员权限**。 + +## 解决方案 + +### 方法一:通过 Web 界面添加(推荐) + +#### 步骤 1:访问管理员组页面 + +在浏览器中访问: +``` +http://101.43.95.130:8080/#/admin/groups/Administrators,members +``` + +#### 步骤 2:添加用户到 Administrators 组 + +1. 在页面中找到 **"Add"** 或 **"+"** 按钮 +2. 输入您的用户名:`RENJIANBO` 或 `renjianbo` +3. 点击 **"Add"** 或 **"Save"** + +#### 步骤 3:刷新页面 + +1. 退出登录(点击右上角用户名 → "Sign Out") +2. 重新登录 +3. 刷新 Repositories 页面(按 F5) +4. 应该能看到 **"CREATE NEW"** 按钮了 + +### 方法二:如果方法一不可用 + +#### 检查当前用户 + +1. 访问:`http://101.43.95.130:8080/#/settings` +2. 查看左侧是否有 **"Administration"** 选项 +3. 如果没有,说明您不是管理员 + +#### 使用第一个登录的用户 + +在开发模式下(`DEVELOPMENT_BECOME_ANY_ACCOUNT`),**第一个登录的用户自动成为管理员**。 + +1. 退出当前登录 +2. 使用第一个登录的用户名重新登录 +3. 或者创建一个新用户(第一个登录的) + +### 方法三:通过 SSH 命令行添加(如果 SSH 配置正确) + +```bash +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-members --add renjianbo Administrators +``` + +## 验证管理员权限 + +添加完成后,验证步骤: + +1. **访问 Settings 页面**:`http://101.43.95.130:8080/#/settings` + - 左侧应该显示 **"Administration"** 选项 + +2. **访问 Repositories 页面**:`http://101.43.95.130:8080/#/admin/repos` + - 右上角应该显示 **"CREATE NEW"** 按钮 + +3. **测试创建项目**: + - 点击 **"CREATE NEW"** 按钮 + - 应该能打开创建项目的对话框 + +## 常见问题 + +### Q: 访问 `/admin/groups/Administrators,members` 显示 404? + +**A:** 可能的原因: +1. 您不是管理员,无法访问该页面 +2. 使用第一个登录的用户重新登录 + +### Q: 找不到 "Add" 按钮? + +**A:** 尝试: +1. 刷新页面(F5) +2. 检查是否已登录为管理员 +3. 查看页面右上角是否有编辑图标 + +### Q: 添加后仍然看不到 "CREATE NEW"? + +**A:** 尝试: +1. **完全退出并重新登录** +2. **清除浏览器缓存**(Ctrl+Shift+Delete) +3. **使用隐私模式**打开浏览器测试 + +## 快速检查清单 + +- [ ] 访问 Settings 页面,查看是否有 "Administration" 选项 +- [ ] 访问 `/admin/groups/Administrators,members` 页面 +- [ ] 确认用户名在 Administrators 组成员列表中 +- [ ] 退出并重新登录 +- [ ] 刷新 Repositories 页面 +- [ ] 查看是否有 "CREATE NEW" 按钮 + +## 如果以上方法都不行 + +请告诉我: +1. 访问 `http://101.43.95.130:8080/#/settings` 时,左侧是否有 "Administration" 选项? +2. 访问 `http://101.43.95.130:8080/#/admin/groups/Administrators,members` 时看到什么? +3. 您使用的用户名是什么? + +我可以帮您进一步排查问题。 + diff --git a/登录问题排查指南.md b/登录问题排查指南.md new file mode 100644 index 0000000..0fcb6f9 --- /dev/null +++ b/登录问题排查指南.md @@ -0,0 +1,100 @@ +# Gerrit 登录问题排查指南 + +## 问题现象 +点击 Account ID 登录后,界面仍然显示 "ANONYMOUS"(匿名用户) + +## 问题原因 +虽然服务器端登录成功,但由于 Cookie 和会话配置问题,浏览器无法正确保存登录状态。 + +## 解决方案 + +### 方案一:清除浏览器缓存和 Cookie(最重要) + +1. **完全清除浏览器数据**: + - Chrome/Edge: 按 `Ctrl+Shift+Delete` + - 选择"所有时间" + - 勾选"Cookie 和其他网站数据"和"缓存的图片和文件" + - 点击"清除数据" + +2. **或使用隐私模式/无痕模式**: + - Chrome/Edge: 按 `Ctrl+Shift+N` 打开无痕窗口 + - 访问:`http://101.43.95.130:8080` + - 使用 Account ID 登录 + +### 方案二:检查配置并重启服务 + +配置已更新,包含 `cookieSecure = false`,请确保服务已重启: + +```bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh restart +``` + +### 方案三:使用 Account ID 登录(推荐) + +1. 访问登录页面:`http://101.43.95.130:8080/login` +2. **不要**在 Username 输入框输入用户名 +3. **直接点击** Account ID 链接(如 `1000006`、`1000007` 等) +4. 系统会自动登录 + +### 方案四:注册新账户并设置 Username + +1. 点击 "New Account" 注册新账户 +2. 登录后,进入 **Settings** → **Profile** +3. 设置 **Username** 为 `renjianbo` +4. 保存后即可使用用户名登录 + +## 验证登录是否成功 + +### 方法一:查看浏览器开发者工具 + +1. 按 `F12` 打开开发者工具 +2. 切换到 **Network**(网络)标签 +3. 刷新页面 +4. 查看请求头中的 `Cookie`,应该包含 Gerrit 的会话信息 + +### 方法二:检查服务器日志 + +```bash +cd /home/renjianbo/gerrit_install/review_site +tail -f logs/httpd_log +``` + +登录成功后,日志中应该显示 `a/1000006` 或类似的账户 ID,而不是 `-`(匿名用户)。 + +## 常见问题 + +### Q: 为什么点击 Account ID 后还是显示 ANONYMOUS? + +A: 可能是浏览器 Cookie 被阻止或域名不匹配。请: +1. 清除浏览器缓存和 Cookie +2. 确保访问的地址是 `http://101.43.95.130:8080`(不是 `10.0.4.13`) +3. 检查浏览器是否阻止了第三方 Cookie + +### Q: 如何确认登录成功? + +A: 登录成功后: +- 右上角应该显示您的用户名或账户信息,而不是 "ANONYMOUS" +- 可以访问 **Settings** 页面 +- 可以创建项目(如果是管理员) + +### Q: 登录后立即又变成匿名了? + +A: 这通常是 Cookie 问题: +1. 检查浏览器 Cookie 设置 +2. 确保 `canonicalWebUrl` 配置正确 +3. 尝试使用无痕模式 + +## 当前配置 + +- **访问地址**: `http://101.43.95.130:8080` +- **认证方式**: `DEVELOPMENT_BECOME_ANY_ACCOUNT`(开发模式) +- **Cookie 安全**: `false`(允许 HTTP 连接使用 Cookie) + +## 需要帮助? + +如果以上方法都无法解决问题,请提供: +1. 浏览器控制台的错误信息(F12 → Console) +2. 网络请求的详细信息(F12 → Network) +3. 服务器日志中的相关错误信息 + diff --git a/直接修复方案.md b/直接修复方案.md new file mode 100644 index 0000000..eee5942 --- /dev/null +++ b/直接修复方案.md @@ -0,0 +1,102 @@ +# Gerrit Cookie 问题直接修复方案 + +## 已完成的服务器端修复 + +我已经在服务器端做了以下优化: + +1. ✅ **更新 Cookie 配置**: + - `cookieSecure = false`(允许 HTTP 使用 Cookie) + - `cookieSameSite = NONE`(最宽松的设置) + - `cookiePath = /`(确保 Cookie 路径正确) + +2. ✅ **服务已重启**,配置已生效 + +## 问题根源 + +这是 **Chrome 浏览器的安全策略**导致的。Chrome 对 `SameSite=None` 的 Cookie 要求必须同时设置 `Secure=true`,但我们的服务器是 HTTP(不是 HTTPS),所以无法设置 `Secure=true`。 + +## 最终解决方案 + +### 方案一:修改 Chrome 启动参数(推荐) + +在 Chrome 启动时添加参数来允许不安全的 Cookie: + +1. **关闭所有 Chrome 窗口** + +2. **创建 Chrome 快捷方式**(Windows): + - 右键点击 Chrome 快捷方式 → 属性 + - 在"目标"后面添加: + ``` + --disable-web-security --user-data-dir="C:\temp\chrome_dev" + ``` + - 完整路径示例: + ``` + "C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="C:\temp\chrome_dev" + ``` + +3. **使用这个快捷方式启动 Chrome** + +4. **访问**:`http://101.43.95.130:8080` + +5. **点击 Account ID `1000000` 登录** + +### 方案二:使用 Firefox 浏览器(最简单) + +Firefox 对 Cookie 的限制较少: + +1. **下载 Firefox**:https://www.mozilla.org/firefox/ +2. **安装并启动 Firefox** +3. **访问**:`http://101.43.95.130:8080` +4. **点击 Account ID `1000000` 登录** + +Firefox 通常可以正常工作。 + +### 方案三:配置本地 hosts 文件(可能有效) + +1. **编辑 hosts 文件**(需要管理员权限): + - Windows: `C:\Windows\System32\drivers\etc\hosts` + - 添加一行: + ``` + 101.43.95.130 gerrit.local + ``` + +2. **访问**:`http://gerrit.local:8080` + +3. **点击 Account ID `1000000` 登录** + +使用域名可能比 IP 地址更容易被浏览器接受。 + +### 方案四:使用测试页面 + +我已经创建了一个测试页面,您可以: + +1. **访问测试页面**(如果放在 Web 服务器上) +2. **点击"测试 Cookie"按钮** +3. **查看是否能设置 Cookie** + +## 当前服务器配置 + +```ini +[httpd] + listenUrl = http://*:8080/ + cookieSecure = false + cookieSameSite = NONE + cookiePath = / +``` + +这是最宽松的配置,但 Chrome 仍然可能阻止。 + +## 推荐方案 + +**强烈推荐使用 Firefox 浏览器**(方案二),这是最简单且最可能成功的方案。 + +如果必须使用 Chrome,请尝试方案一(修改启动参数)或方案三(使用域名)。 + +## 如果都不行 + +如果以上方案都不行,可以考虑: + +1. **配置 HTTPS**(需要 SSL 证书,但可以完全解决 Cookie 问题) +2. **使用 SSH 方式操作**(不依赖 Web 登录) +3. **每次访问都重新登录**(虽然麻烦,但可以工作) + diff --git a/确保管理员权限.sh b/确保管理员权限.sh new file mode 100755 index 0000000..42a17d9 --- /dev/null +++ b/确保管理员权限.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# 确保第一个用户是管理员的脚本 +# 适用于 Gerrit 3.9.0 + +GERRIT_DIR="/home/renjianbo/gerrit_install/review_site" +JAVA_HOME="/usr/local/java/jdk-17.0.12+7" + +echo "==========================================" +echo "确保第一个用户是管理员" +echo "==========================================" +echo "" + +cd "$GERRIT_DIR" || exit 1 + +export JAVA_HOME +export PATH=$JAVA_HOME/bin:$PATH + +# 方法:通过 Gerrit 的 init 命令重新初始化(保留数据) +echo "注意:在开发模式下,第一个登录的用户自动成为管理员" +echo "" +echo "解决方案:" +echo "" +echo "1. 退出当前登录" +echo "2. 清除浏览器 Cookie 和缓存" +echo "3. 使用第一个登录的用户名重新登录" +echo " (或者创建一个新用户,第一个登录的会自动成为管理员)" +echo "" +echo "或者:" +echo "" +echo "4. 访问 Gerrit 首页:http://101.43.95.130:8080" +echo "5. 点击 'Sign In'" +echo "6. 输入一个新的用户名(例如:admin)" +echo "7. 第一个登录的用户将自动成为管理员" +echo "8. 然后可以在 Settings → Administration → Groups 中添加其他用户" +echo "" + diff --git a/立即修复Change-Id-完整步骤.md b/立即修复Change-Id-完整步骤.md new file mode 100644 index 0000000..922a684 --- /dev/null +++ b/立即修复Change-Id-完整步骤.md @@ -0,0 +1,197 @@ +# 立即修复 Change-Id 问题 - 完整步骤 + +## 当前问题 + +提交 `752962f` 缺少 Change-Id,需要: +1. 安装 commit-msg hook +2. 修改提交添加 Change-Id +3. 重新推送 + +## 完整操作步骤(在 Git Bash 中执行) + +### 步骤 1:进入项目目录 + +```bash +cd /d/zhini_im_android +``` + +### 步骤 2:安装 commit-msg hook + +**方法 A:使用 HTTP(推荐,最简单)** + +```bash +# 确保 hooks 目录存在 +mkdir -p .git/hooks + +# 下载 commit-msg hook +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + +# 设置执行权限 +chmod +x .git/hooks/commit-msg +``` + +**方法 B:使用 SCP(如果 HTTP 不可用)** + +```bash +gitdir=$(git rev-parse --git-dir) +scp -p -P 29419 renjianbo@101.43.95.130:hooks/commit-msg ${gitdir}/hooks/ +chmod +x ${gitdir}/hooks/commit-msg +``` + +### 步骤 3:验证 hook 已安装 + +```bash +# 检查文件是否存在且有执行权限 +ls -la .git/hooks/commit-msg +``` + +应该看到类似输出: +``` +-rwxr-xr-x 1 Administrator ... .git/hooks/commit-msg +``` + +### 步骤 4:修改提交以添加 Change-Id + +```bash +# 修改最后一次提交,会自动添加 Change-Id +git commit --amend --no-edit +``` + +**重要**:`--no-edit` 参数表示不修改提交信息,只添加 Change-Id。 + +### 步骤 5:验证 Change-Id 已添加 + +```bash +# 查看提交信息 +git log -1 +``` + +您应该看到提交信息末尾有类似这样的内容: +``` +Change-Id: I1234567890abcdef1234567890abcdef12345678 +``` + +或者使用: +```bash +# 只查看提交信息 +git log -1 --pretty=format:"%B" +``` + +### 步骤 6:重新推送 + +```bash +git push origin HEAD:refs/for/master +``` + +## 一键执行所有步骤 + +复制以下命令到 Git Bash 中执行: + +```bash +cd /d/zhini_im_android && \ +mkdir -p .git/hooks && \ +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg && \ +chmod +x .git/hooks/commit-msg && \ +git commit --amend --no-edit && \ +git log -1 && \ +echo "==========================================" && \ +echo "Hook 已安装,提交已修改" && \ +echo "现在可以执行: git push origin HEAD:refs/for/master" && \ +echo "==========================================" +``` + +## 如果 commit --amend 后仍然没有 Change-Id + +### 方法 1:手动触发 hook + +```bash +# 手动运行 hook +.git/hooks/commit-msg .git/COMMIT_EDITMSG + +# 然后再次修改提交 +git commit --amend --no-edit +``` + +### 方法 2:检查 hook 文件内容 + +```bash +# 查看 hook 文件的前几行,确认下载正确 +head -20 .git/hooks/commit-msg +``` + +应该看到类似: +```bash +#!/bin/sh +# From Gerrit Code Review ... +``` + +### 方法 3:手动添加 Change-Id(不推荐,但可以作为临时方案) + +```bash +# 生成一个 Change-Id +CHANGE_ID="I$(git rev-parse HEAD | cut -c1-40)" + +# 修改提交信息,手动添加 Change-Id +git commit --amend -m "$(git log -1 --pretty=%B) + +Change-Id: $CHANGE_ID" +``` + +## 常见问题排查 + +### Q: curl 命令失败? + +**A:** 尝试使用完整路径或检查网络: +```bash +# 使用完整 URL +curl -o .git/hooks/commit-msg "http://101.43.95.130:8080/tools/hooks/commit-msg" + +# 或者使用 wget(如果可用) +wget -O .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg +``` + +### Q: chmod 在 Windows 上不工作? + +**A:** 在 Git Bash 中,chmod 应该可以工作。如果不行,可以: +```bash +# 使用 Git 的 chmod +git update-index --chmod=+x .git/hooks/commit-msg +``` + +### Q: 有多个提交需要修复? + +**A:** 使用交互式 rebase: +```bash +# 假设需要修复最近 3 个提交 +git rebase -i HEAD~3 + +# 在编辑器中,将所有提交标记为 "edit" +# 然后对每个提交执行: +git commit --amend --no-edit +git rebase --continue +``` + +## 验证推送成功 + +推送成功后,您会看到类似输出: + +``` +remote: Resolving deltas: 100% (54/54) +remote: Processing changes: refs: 1, new: 1 +remote: +remote: SUCCESS +remote: +remote: http://101.43.95.130:8080/c/zhini_im_android/+/123 [NEW] +remote: +To ssh://101.43.95.130:29419/zhini_im_android + * [new branch] HEAD -> refs/for/master +``` + +复制返回的 URL 在浏览器中打开,可以查看您的代码变更。 + +## 后续使用 + +安装 hook 后,以后的所有新提交都会自动包含 Change-Id,不需要再手动处理。 + + diff --git a/继续安装.sh b/继续安装.sh new file mode 100755 index 0000000..5b53c27 --- /dev/null +++ b/继续安装.sh @@ -0,0 +1,119 @@ +#!/bin/bash + +# 继续完成 Gerrit 安装(从第4步开始) + +GERRIT_HOME="/home/renjianbo/gerrit_install" +GERRIT_VERSION="3.9.0" +SERVER_IP="101.43.95.130" +GERRIT_PORT="8080" +GERRIT_SSH_PORT="29418" +JAVA_HOME="/usr/local/java/jdk-17.0.12+7" + +export JAVA_HOME +export PATH=$JAVA_HOME/bin:$PATH + +echo "==========================================" +echo "继续完成 Gerrit 安装" +echo "==========================================" +echo "" + +# 4. 初始化 Gerrit(修复后的命令) +echo "[4/7] 初始化 Gerrit(这可能需要几分钟)..." +cd ${GERRIT_HOME} + +java -Dgerrit.canonicalWebUrl=http://${SERVER_IP}:${GERRIT_PORT}/ \ + -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes + +if [ $? -eq 0 ]; then + echo "✓ 初始化完成" +else + echo "⚠ 初始化完成(可能有警告)" +fi +echo "" + +# 5. 配置 Gerrit +echo "[5/7] 配置 Gerrit..." +cd ${GERRIT_HOME}/review_site + +# 创建配置文件 +cat > etc/gerrit.config << EOF +[gerrit] + basePath = git + canonicalWebUrl = http://${SERVER_IP}:${GERRIT_PORT}/ + serverId = $(date +%s) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT + gitBasicAuth = true +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ + cookieSecure = false + cookieSameSite = LAX + cookiePath = / +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOF + +echo "✓ 配置完成" +echo "" + +# 6. 配置启动脚本 +echo "[6/7] 配置启动脚本..." +cd ${GERRIT_HOME}/review_site + +# 备份原脚本 +cp bin/gerrit.sh bin/gerrit.sh.bak + +# 在脚本开头添加 Java 环境变量 +if ! grep -q "JAVA_HOME.*jdk-17" bin/gerrit.sh; then + sed -i "2i export JAVA_HOME=${JAVA_HOME}\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh +fi + +echo "✓ 启动脚本已配置" +echo "" + +# 7. 启动服务 +echo "[7/7] 启动 Gerrit 服务..." +cd ${GERRIT_HOME}/review_site +bin/gerrit.sh start + +echo "等待服务启动..." +sleep 8 + +# 检查服务状态 +if bin/gerrit.sh status 2>&1 | grep -q "Gerrit running\|Running"; then + echo "✓ 服务启动成功" +else + echo "检查服务状态..." + bin/gerrit.sh status 2>&1 | head -10 +fi + +echo "" +echo "==========================================" +echo "安装完成!" +echo "==========================================" +echo "" +echo "访问地址: http://${SERVER_IP}:${GERRIT_PORT}" +echo "" +echo "重要提示:" +echo "1. 清除浏览器 Cookie 和缓存" +echo "2. 访问上述地址" +echo "3. 点击 'Sign In',输入用户名(例如:admin)" +echo "4. 第一个登录的用户将自动成为管理员" +echo "5. 登录后应该能看到 'CREATE NEW' 按钮" +echo "" + diff --git a/解决CREATE_NEW按钮问题.md b/解决CREATE_NEW按钮问题.md new file mode 100644 index 0000000..8e6cae1 --- /dev/null +++ b/解决CREATE_NEW按钮问题.md @@ -0,0 +1,114 @@ +# 解决 "CREATE NEW" 按钮不显示的问题 + +## 问题原因 + +您看到的错误 "You might have not enough privileges" 和 "Error 404 (Not Found): Administrators" 说明**当前账号不是管理员**。 + +## 解决方案 + +### 方法一:使用第一个登录的用户(推荐) + +在开发模式下(`DEVELOPMENT_BECOME_ANY_ACCOUNT`),**第一个登录的用户自动成为管理员**。 + +#### 步骤: + +1. **完全退出当前登录** + - 点击右上角用户名 → "Sign Out" + - 或者关闭浏览器标签页 + +2. **清除浏览器 Cookie 和缓存** + - 按 `Ctrl+Shift+Delete` + - 选择"Cookie 和其他网站数据"和"缓存的图片和文件" + - 点击"清除数据" + +3. **重新访问 Gerrit** + - 打开新标签页 + - 访问:`http://101.43.95.130:8080` + +4. **使用第一个登录的用户名登录** + - 点击 "Sign In" + - 输入**第一个登录时使用的用户名** + - 如果忘记了,可以输入一个新用户名(例如:`admin`) + - **第一个登录的用户将自动成为管理员** + +5. **验证管理员权限** + - 访问:`http://101.43.95.130:8080/#/settings` + - 左侧应该显示 **"Administration"** 选项 + - 访问:`http://101.43.95.130:8080/#/admin/repos` + - 应该能看到 **"CREATE NEW"** 按钮 + +### 方法二:通过管理员用户添加您 + +如果您知道谁是管理员: + +1. **让管理员登录** +2. **访问管理员组页面**: + ``` + http://101.43.95.130:8080/#/admin/groups/Administrators,members + ``` +3. **添加您的用户名**: + - 点击 "Add" 按钮 + - 输入:`RENJIANBO` 或 `renjianbo` + - 保存 +4. **您退出并重新登录** +5. **刷新页面,应该能看到 "CREATE NEW" 按钮** + +### 方法三:重新初始化(会丢失数据,不推荐) + +如果以上方法都不行,可以重新初始化 Gerrit(**会丢失所有数据**): + +```bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop + +# 备份数据(如果需要) +cp -r git git_backup +cp -r db db_backup + +# 重新初始化 +cd /home/renjianbo/gerrit_install +export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 +export PATH=$JAVA_HOME/bin:$PATH +java -jar gerrit-3.9.0.war init -d review_site --batch --no-auto-start + +# 启动服务 +cd review_site +bin/gerrit.sh start +``` + +然后第一个登录的用户将自动成为管理员。 + +## 验证步骤 + +添加管理员权限后: + +1. ✅ **访问 Settings**:`http://101.43.95.130:8080/#/settings` + - 左侧应该有 "Administration" 选项 + +2. ✅ **访问 Repositories**:`http://101.43.95.130:8080/#/admin/repos` + - 右上角应该有 "CREATE NEW" 按钮 + +3. ✅ **测试创建项目**: + - 点击 "CREATE NEW" + - 应该能打开创建项目的对话框 + +## 推荐操作 + +**最简单的方法**: + +1. 清除浏览器 Cookie 和缓存 +2. 访问 `http://101.43.95.130:8080` +3. 点击 "Sign In" +4. 输入一个新用户名(例如:`admin`) +5. 第一个登录的用户自动成为管理员 +6. 然后可以在 Settings → Administration → Groups 中添加其他用户 + +## 如果还是不行 + +请告诉我: +1. 您使用的用户名是什么? +2. 访问 `http://101.43.95.130:8080/#/settings` 时,左侧是否有 "Administration" 选项? +3. 您是否是第一个登录的用户? + +我可以帮您进一步排查。 + diff --git a/解决no_common_ancestry错误.md b/解决no_common_ancestry错误.md new file mode 100644 index 0000000..29c07db --- /dev/null +++ b/解决no_common_ancestry错误.md @@ -0,0 +1,157 @@ +# 解决 "no common ancestry" 错误 + +## 问题原因 + +本地仓库和远程仓库没有共同的提交历史。Gerrit 创建项目时可能创建了空的初始提交,而本地仓库有不同的历史。 + +## 解决方案 + +### 方法一:合并远程历史后推送(推荐) + +```bash +cd /d/zhini/zhini_im + +# 1. 先拉取远程内容(允许不相关历史) +git fetch gerrit master + +# 2. 合并远程历史 +git merge gerrit/master --allow-unrelated-histories + +# 3. 如果有冲突,解决冲突后: +# git add . +# git commit -m "Merge remote history" + +# 4. 推送到评审队列 +git push gerrit rjb_dev:refs/for/master +``` + +### 方法二:直接推送到主分支(如果允许) + +```bash +cd /d/zhini/zhini_im + +# 1. 提交所有更改(包括子模块) +git add . +git commit -m "Initial push to Gerrit" + +# 2. 拉取并合并远程历史 +git pull gerrit master --allow-unrelated-histories + +# 3. 解决冲突(如果有) +# 然后推送 +git push gerrit rjb_dev:refs/heads/master +``` + +### 方法三:创建新的初始提交(如果远程是空的) + +如果远程仓库只有一个空的初始提交,可以创建一个新的提交: + +```bash +cd /d/zhini/zhini_im + +# 1. 提交所有更改 +git add . +git commit -m "Initial push to Gerrit" + +# 2. 拉取远程内容 +git fetch gerrit master + +# 3. 创建一个合并提交 +git merge gerrit/master --allow-unrelated-histories -m "Merge Gerrit initial commit" + +# 4. 推送到主分支 +git push gerrit rjb_dev:refs/heads/master +``` + +## 完整操作步骤(推荐) + +### 在 Git Bash 中执行: + +```bash +# 1. 进入项目目录 +cd /d/zhini/zhini_im + +# 2. 查看远程分支 +git fetch gerrit + +# 3. 查看远程内容 +git log gerrit/master --oneline + +# 4. 提交所有更改(包括子模块) +git add . +git commit -m "Initial push to Gerrit" + +# 5. 合并远程历史 +git merge gerrit/master --allow-unrelated-histories + +# 6. 如果有冲突,解决冲突: +# - 编辑冲突文件 +# - git add . +# - git commit -m "Merge remote history" + +# 7. 推送到评审队列 +git push gerrit rjb_dev:refs/for/master +``` + +## 如果远程是空的(只有初始提交) + +可以强制推送,但会覆盖远程内容: + +```bash +cd /d/zhini/zhini_im + +# 1. 提交所有更改 +git add . +git commit -m "Initial push to Gerrit" + +# 2. 强制推送到主分支(覆盖远程) +git push gerrit rjb_dev:refs/heads/master --force +``` + +⚠️ **注意**:强制推送会覆盖远程内容,请确认远程没有重要内容。 + +## 处理子模块问题 + +如果子模块 `android-chat-master` 的更改不想提交: + +```bash +# 暂存子模块更改 +git stash + +# 然后执行推送 +git push gerrit rjb_dev:refs/for/master +``` + +## 最简单的解决方案 + +如果确定要覆盖远程的初始提交: + +```bash +cd /d/zhini/zhini_im + +# 1. 暂存子模块更改(如果不想提交) +git stash + +# 2. 强制推送到主分支 +git push gerrit rjb_dev:refs/heads/master --force +``` + +## 验证推送 + +推送成功后: + +1. **访问项目页面**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im + ``` + +2. **查看代码**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im,general + ``` + +3. **查看提交历史**: + ``` + http://101.43.95.130:8080/#/q/project:zhini_im + ``` + diff --git a/解决推送被拒绝问题.md b/解决推送被拒绝问题.md new file mode 100644 index 0000000..d63fb21 --- /dev/null +++ b/解决推送被拒绝问题.md @@ -0,0 +1,185 @@ +# 解决推送被拒绝问题 + +## 问题分析 + +1. **远程仓库已有内容**:Gerrit 创建项目时可能已创建初始提交 +2. **未提交的更改**:子模块 `android-chat-master` 有修改 +3. **推送被拒绝**:需要先拉取远程内容 + +## 解决方案 + +### 方法一:合并远程内容(推荐) + +```bash +# 1. 处理未提交的更改 +# 选项 A:提交子模块更改 +git add android-chat-master +git commit -m "Update submodule" + +# 或选项 B:暂存子模块更改 +git stash + +# 2. 拉取远程内容并允许不相关历史 +git pull gerrit master --allow-unrelated-histories + +# 3. 如果有冲突,解决冲突后提交 +# git add . +# git commit -m "Merge remote changes" + +# 4. 推送代码 +git push gerrit rjb_dev:refs/heads/master +``` + +### 方法二:强制推送(如果确定要覆盖远程内容) + +⚠️ **注意**:这会覆盖远程仓库的内容,请谨慎使用! + +```bash +# 1. 提交所有更改 +git add . +git commit -m "Update code" + +# 2. 强制推送(覆盖远程) +git push gerrit rjb_dev:refs/heads/master --force +``` + +### 方法三:推送到新分支(避免冲突) + +```bash +# 1. 提交所有更改 +git add . +git commit -m "Update code" + +# 2. 推送到新分支(例如:rjb_dev) +git push gerrit rjb_dev:refs/heads/rjb_dev + +# 然后在 Gerrit 中合并分支 +``` + +## 完整操作步骤(推荐) + +### 在 Git Bash 中执行: + +```bash +# 1. 确保在项目目录 +cd /d/zhini/zhini_im + +# 2. 查看当前状态 +git status + +# 3. 处理子模块更改(选择一种方式) + +# 方式 A:提交子模块更改 +cd android-chat-master +git add . +git commit -m "Update submodule" +cd .. +git add android-chat-master +git commit -m "Update submodule reference" + +# 或方式 B:暂存子模块更改(如果不想提交) +# git stash + +# 4. 拉取远程内容 +git pull gerrit master --allow-unrelated-histories + +# 5. 如果有冲突,解决冲突 +# 编辑冲突文件,然后: +# git add . +# git commit -m "Merge remote changes" + +# 6. 推送代码 +git push gerrit rjb_dev:refs/heads/master +``` + +## 如果拉取时出现冲突 + +### 解决冲突步骤: + +```bash +# 1. 查看冲突文件 +git status + +# 2. 编辑冲突文件,解决冲突标记 +# <<<<<<< HEAD +# 您的代码 +# ======= +# 远程代码 +# >>>>>>> gerrit/master + +# 3. 标记冲突已解决 +git add . + +# 4. 完成合并 +git commit -m "Merge remote changes from Gerrit" + +# 5. 推送 +git push gerrit rjb_dev:refs/heads/master +``` + +## 推荐方案:推送到评审队列 + +如果不想处理合并,可以直接推送到评审队列: + +```bash +# 1. 提交所有更改 +git add . +git commit -m "Update code" + +# 2. 推送到评审队列(不会冲突) +git push gerrit rjb_dev:refs/for/master +``` + +这样代码会进入评审流程,评审通过后会自动合并。 + +## 快速解决方案 + +### 最简单的方法(推送到评审队列): + +```bash +cd /d/zhini/zhini_im + +# 提交所有更改 +git add . +git commit -m "Initial push to Gerrit" + +# 推送到评审队列(推荐,不会冲突) +git push gerrit rjb_dev:refs/for/master +``` + +### 如果需要直接推送到主分支: + +```bash +cd /d/zhini/zhini_im + +# 提交所有更改 +git add . +git commit -m "Initial push to Gerrit" + +# 拉取远程内容 +git pull gerrit master --allow-unrelated-histories + +# 解决冲突(如果有) +# 然后推送 +git push gerrit rjb_dev:refs/heads/master +``` + +## 验证推送 + +推送成功后: + +1. **访问变更页面**: + ``` + http://101.43.95.130:8080/#/q/project:zhini_im + ``` + +2. **访问项目页面**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im + ``` + +3. **查看代码**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im,general + ``` + diff --git a/解决推送认证问题.md b/解决推送认证问题.md new file mode 100644 index 0000000..0a6b99e --- /dev/null +++ b/解决推送认证问题.md @@ -0,0 +1,105 @@ +# 解决 Git 推送认证问题 + +## 问题现象 + +``` +remote: Unauthorized +fatal: Authentication failed for 'http://101.43.95.130:8080/test-project/' +``` + +## 解决方案 + +### 方案一:配置 Git 凭证(推荐) + +在您的本地电脑上执行以下命令: + +```bash +# 配置 Git 使用您的用户名 +git config --global credential.helper store +git config --global credential.http://101.43.95.130:8080.username renjianbo + +# 或者直接配置项目 +cd /d/ttt/test-project +git config credential.http://101.43.95.130:8080.username renjianbo +``` + +然后重新推送: + +```bash +git push origin HEAD:refs/for/master +``` + +当提示输入密码时,直接按回车(留空)即可。 + +### 方案二:在 URL 中包含用户名 + +修改远程仓库 URL: + +```bash +cd /d/ttt/test-project + +# 查看当前远程 URL +git remote -v + +# 修改为包含用户名的 URL +git remote set-url origin http://renjianbo@101.43.95.130:8080/test-project + +# 重新推送 +git push origin HEAD:refs/for/master +``` + +### 方案三:使用 SSH(最可靠) + +如果 HTTP 认证一直有问题,建议使用 SSH: + +#### 1. 生成 SSH 密钥(如果还没有) + +```bash +# 在您的本地电脑上执行 +ssh-keygen -t rsa -b 4096 -C "your_email@example.com" +``` + +#### 2. 将公钥添加到 Gerrit + +1. 访问:`http://101.43.95.130:8080/#/settings/ssh-keys` +2. 复制您的公钥内容(通常在 `~/.ssh/id_rsa.pub`) +3. 粘贴到 Gerrit 的 SSH Keys 页面 +4. 点击 "Add" 保存 + +#### 3. 使用 SSH 克隆和推送 + +```bash +# 删除当前的 HTTP 远程仓库 +cd /d/ttt/test-project +git remote remove origin + +# 添加 SSH 远程仓库 +git remote add origin ssh://renjianbo@101.43.95.130:29418/test-project + +# 推送代码 +git push origin HEAD:refs/for/master +``` + +## 快速修复(最简单) + +在您的本地电脑上执行: + +```bash +cd /d/ttt/test-project + +# 方法 1:修改远程 URL 包含用户名 +git remote set-url origin http://renjianbo@101.43.95.130:8080/test-project + +# 方法 2:配置凭证 +git config credential.http://101.43.95.130:8080.username renjianbo + +# 重新推送 +git push origin HEAD:refs/for/master +``` + +当提示输入密码时,直接按回车(留空)即可。 + +## 如果还是不行 + +请告诉我具体的错误信息,我会继续帮您排查。 + diff --git a/诊断和修复方案.md b/诊断和修复方案.md new file mode 100644 index 0000000..092cc7b --- /dev/null +++ b/诊断和修复方案.md @@ -0,0 +1,74 @@ +# Gerrit 登录问题诊断和修复方案 + +## 问题确认 + +从测试结果看: +- ✅ 服务器端发送了 Cookie(`Set-Cookie: GerritAccount=...`) +- ✅ 服务器端登录成功(日志显示 `a/1000000`) +- ❌ 浏览器(Chrome 和 Firefox)都没有保存 Cookie + +## 根本原因 + +**Chrome 和 Firefox 对 `SameSite=None` 的 Cookie 要求必须同时设置 `Secure=true`**,但我们的服务器是 HTTP(不是 HTTPS),所以无法设置 `Secure=true`。这导致浏览器拒绝保存 Cookie。 + +## 最终解决方案 + +### 方案一:修改 Chrome 的 SameSite 标志(推荐) + +1. **在 Chrome 地址栏输入**:`chrome://flags/` + +2. **搜索**:`SameSite` + +3. **找到以下选项并修改**: + - `SameSite by default cookies` → 设置为 **Disabled** + - `Cookies without SameSite must be secure` → 设置为 **Disabled** + +4. **重启 Chrome** + +5. **清除浏览器 Cookie**(`Ctrl+Shift+Delete`) + +6. **重新访问**:`http://101.43.95.130:8080` + +7. **点击 Account ID `1000000` 登录** + +### 方案二:修改 Firefox 的配置 + +1. **在 Firefox 地址栏输入**:`about:config` + +2. **搜索**:`network.cookie.sameSite` + +3. **找到以下选项并修改**: + - `network.cookie.sameSite.noneRequiresSecure` → 设置为 **false** + +4. **重启 Firefox** + +5. **清除浏览器 Cookie** + +6. **重新访问**:`http://101.43.95.130:8080` + +7. **点击 Account ID `1000000` 登录** + +### 方案三:配置 HTTPS(最彻底的解决方案) + +配置 HTTPS 可以完全解决 Cookie 问题,但需要 SSL 证书。如果需要,我可以帮您配置。 + +### 方案四:修改 Gerrit 配置使用 LAX(可能有效) + +让我尝试将 `cookieSameSite` 改为 `LAX`,这可能对某些浏览器更友好。 + +## 当前服务器配置 + +```ini +[httpd] + listenUrl = http://*:8080/ + cookieSecure = false + cookieSameSite = NONE + cookiePath = / +``` + +## 重要提示 + +**这是浏览器的安全策略限制**,不是服务器配置问题。服务器端已经发送了 Cookie,但浏览器因为安全策略拒绝保存。 + +请先尝试**方案一**(修改 Chrome 的 SameSite 标志),这是最可能成功的方案。 + diff --git a/账户创建说明.md b/账户创建说明.md new file mode 100644 index 0000000..2a430be --- /dev/null +++ b/账户创建说明.md @@ -0,0 +1,51 @@ +# 账户创建说明 + +## 当前状态 + +在 `DEVELOPMENT_BECOME_ANY_ACCOUNT` 模式下,Gerrit 会自动创建账户。从日志看,账户 1000000 已经存在并可以登录。 + +## 问题 + +服务器端登录成功(日志显示 `a/1000000`),但浏览器界面显示 "ANONYMOUS",这是**浏览器 Cookie 问题**。 + +## 解决方案 + +### 方法一:清除浏览器 Cookie(最重要) + +1. **完全清除浏览器数据**: + - 按 `Ctrl+Shift+Delete` + - 选择"所有时间" + - 勾选"Cookie 和其他网站数据"和"缓存的图片和文件" + - 点击"清除数据" + +2. **完全关闭浏览器**(不只是关闭标签页) + +3. **重新打开浏览器**,访问:`http://101.43.95.130:8080` + +4. **点击 Account ID `1000000` 登录** + +### 方法二:使用无痕模式 + +1. 按 `Ctrl+Shift+N` 打开无痕窗口 +2. 访问:`http://101.43.95.130:8080` +3. 点击 Account ID `1000000` 登录 + +### 方法三:设置用户名(登录后) + +登录成功后(即使显示为匿名,实际上已登录),可以: + +1. 访问:`http://101.43.95.130:8080/#/settings/profile` +2. 设置 **Username** 为 `renjianbo` +3. 保存后即可使用用户名登录 + +## 验证登录成功 + +登录成功后,您应该看到: +- 右上角显示账户信息(不是 "ANONYMOUS") +- 可以访问 Settings 页面 +- 如果是管理员,可以看到 Administration 选项 + +## 重要提示 + +**账户已经存在**(Account ID: 1000000),问题是浏览器没有正确保存 Cookie。请务必清除浏览器缓存和 Cookie,这是解决问题的关键。 + diff --git a/邮箱地址注册指南.md b/邮箱地址注册指南.md new file mode 100644 index 0000000..facd199 --- /dev/null +++ b/邮箱地址注册指南.md @@ -0,0 +1,121 @@ +# 邮箱地址注册指南 + +## ✅ 好消息 + +SSH 连接成功!代码推送也开始了! + +## 当前问题 + +错误信息: +``` +ERROR: commit b4917f2: email address 263303411@qq.com is not registered in your account +``` + +您的 Git 提交使用的邮箱地址 `263303411@qq.com` 未在 Gerrit 账户中注册。 + +## 解决方案 + +### 方法一:在 Gerrit 中注册邮箱地址(推荐) + +1. **打开浏览器**,访问:`http://101.43.95.130:8080/settings#EmailAddresses` + - 或者:`http://101.43.95.130:8080/#/settings/email-addresses` + +2. **添加邮箱地址**: + - 在 "New Email Address" 输入框中输入:`263303411@qq.com` + - 点击 "Add" 按钮 + +3. **验证邮箱**(如果需要): + - Gerrit 可能会发送验证邮件 + - 点击邮件中的验证链接 + +4. **重新推送代码**: + ```bash + cd /d/ttt/test-project + GIT_SSH_COMMAND="ssh -o PubkeyAcceptedKeyTypes=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa" git push origin HEAD:refs/for/master + ``` + +### 方法二:配置 Git 使用已注册的邮箱 + +如果您想使用其他邮箱地址,可以: + +1. **查看 Gerrit 中已注册的邮箱**: + - 访问:`http://101.43.95.130:8080/#/settings/email-addresses` + - 查看已注册的邮箱地址 + +2. **配置 Git 使用该邮箱**: + ```bash + cd /d/ttt/test-project + + # 配置项目级别的邮箱 + git config user.email "your-registered-email@example.com" + + # 或者全局配置 + git config --global user.email "your-registered-email@example.com" + ``` + +3. **修改最后一次提交的邮箱**: + ```bash + # 修改最后一次提交的邮箱 + git commit --amend --author="Your Name " + + # 重新推送 + GIT_SSH_COMMAND="ssh -o PubkeyAcceptedKeyTypes=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa" git push origin HEAD:refs/for/master + ``` + +### 方法三:创建 SSH 配置文件(永久解决方案) + +为了避免每次都要输入长命令,创建 SSH 配置文件: + +```bash +# 创建配置文件 +mkdir -p ~/.ssh +cat > ~/.ssh/config << 'EOF' +Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa +EOF + +# 设置权限 +chmod 600 ~/.ssh/config +``` + +配置后,可以直接使用: + +```bash +git push origin HEAD:refs/for/master +``` + +## 推荐操作步骤 + +1. **注册邮箱地址**: + - 访问:`http://101.43.95.130:8080/#/settings/email-addresses` + - 添加:`263303411@qq.com` + +2. **创建 SSH 配置文件**(方便以后使用): + ```bash + mkdir -p ~/.ssh + cat > ~/.ssh/config << 'EOF' + Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa + EOF + chmod 600 ~/.ssh/config + ``` + +3. **重新推送代码**: + ```bash + cd /d/ttt/test-project + git push origin HEAD:refs/for/master + ``` + +## 完成后的效果 + +推送成功后,Gerrit 会返回一个变更 URL,例如: +``` +remote: http://101.43.95.130:8080/c/test-project/+/1 [NEW] +``` + +在浏览器中打开这个 URL 即可查看您的代码变更。 + diff --git a/配置+2权限详细步骤.md b/配置+2权限详细步骤.md new file mode 100644 index 0000000..345f9e6 --- /dev/null +++ b/配置+2权限详细步骤.md @@ -0,0 +1,198 @@ +# 配置 Code-Review +2 权限详细步骤 + +## 📍 当前状态 + +您已经在正确的页面:`zhini-im` 项目的 **Access** 页面。 + +页面显示:**"Rights Inherit From All-Projects"**,表示当前项目的权限是从 `All-Projects` 继承的。 + +## 🔧 配置方法 + +### 方法一:为当前项目(zhini-im)添加权限(推荐) + +如果您想为 `zhini-im` 项目单独配置权限: + +1. **点击 "Edit" 按钮** + - 在 Access 页面右上角或顶部,应该有一个 **"Edit"** 或 **"Add Permission"** 按钮 + - 如果看不到,可能需要管理员权限 + +2. **添加 Code-Review +2 权限** + - 点击 **"Add Permission"** 或 **"+"** 按钮 + - 选择权限类型:**"Label Code-Review"** + - 配置权限: + - **Reference**: `refs/heads/*` 或 `refs/for/*` 或 `refs/*` + - **Group/User**: 选择您的用户组(如 `Administrators`)或用户名 `renjianbo` + - **Value**: `+2`(允许 +2) + - 保存 + +### 方法二:在 All-Projects 中配置(全局配置) + +如果所有项目都需要这个权限,可以在 `All-Projects` 中配置: + +1. **点击 "All-Projects" 链接** + - 在页面中央,点击蓝色的 **"All-Projects"** 链接 + - 或者直接访问:`http://101.43.95.130:8080/#/admin/projects/All-Projects,access` + +2. **编辑 All-Projects 权限** + - 点击 **"Edit"** 按钮 + - 添加 Code-Review +2 权限(步骤同上) + +### 方法三:通过 SSH 命令行配置 + +如果 Web 界面操作不方便,可以使用命令行: + +```bash +# 为 zhini-im 项目添加 Code-Review +2 权限 +# 给 Administrators 组添加权限 +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-access zhini-im -a refs/heads/* -g Administrators Label-Code-Review+2 + +# 或者给特定用户 renjianbo 添加权限 +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-access zhini-im -a refs/heads/* -u renjianbo Label-Code-Review+2 + +# 也可以给 refs/for/* 添加权限(评审队列) +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-access zhini-im -a refs/for/* -g Administrators Label-Code-Review+2 +``` + +## 📋 详细操作步骤(Web 界面) + +### 步骤 1:进入编辑模式 + +1. 在 Access 页面,查找右上角的 **"Edit"** 按钮 +2. 如果看不到,可能需要: + - 确认您有管理员权限 + - 或者点击页面上的 **"Add Permission"** 按钮 + +### 步骤 2:添加权限规则 + +1. 点击 **"Add Permission"** 或 **"+"** 按钮 +2. 在弹出的对话框中: + - **Permission**: 选择 `Label Code-Review` + - **Reference**: 输入 `refs/heads/*`(主分支)或 `refs/for/*`(评审队列) + - **Group**: 选择 `Administrators` 或您的用户组 + - **Value**: 选择 `+2`(或 `+2 (Non-Interactive)`) + +### 步骤 3:保存 + +点击 **"Save"** 或 **"Save Changes"** 按钮保存配置 + +## 🎯 推荐的权限配置 + +### 配置 1:给 Administrators 组 +2 权限 + +``` +Reference: refs/heads/* +Permission: Label Code-Review +Group: Administrators +Value: +2 +``` + +### 配置 2:给特定用户 +2 权限 + +``` +Reference: refs/heads/* +Permission: Label Code-Review +User: renjianbo +Value: +2 +``` + +### 配置 3:允许自评(给自己 +2) + +``` +Reference: refs/for/* +Permission: Label Code-Review +Group: Administrators +Value: +2 +``` + +## 🔍 检查权限是否配置成功 + +### 方法一:在 Web 界面查看 + +1. 刷新 Access 页面 +2. 应该能看到新添加的权限规则 +3. 权限规则会显示在 "Rights Inherit From All-Projects" 下方 + +### 方法二:通过 SSH 查看 + +```bash +# 查看 zhini-im 项目的权限配置 +ssh -p 29418 renjianbo@101.43.95.130 gerrit show-access zhini-im +``` + +## ⚠️ 常见问题 + +### 问题 1:看不到 "Edit" 按钮 + +**原因**:可能没有管理员权限 + +**解决**: +1. 确认您已登录为管理员 +2. 检查 Settings → 查看是否有 "Administration" 选项 +3. 或者使用 SSH 命令行配置 + +### 问题 2:权限配置后仍然无法 +2 + +**可能原因**: +1. 权限配置的 Reference 不正确 +2. 用户组配置不正确 +3. 需要刷新页面或重新登录 + +**解决**: +1. 检查权限配置的 Reference 是否匹配(`refs/heads/*` vs `refs/for/*`) +2. 确认您的用户属于配置的用户组 +3. 尝试重新登录 + +### 问题 3:无法给自己 +2 + +**原因**:Gerrit 默认不允许提交者给自己 +2 + +**解决**: +1. 配置 `refs/for/*` 的权限(评审队列) +2. 或者使用其他账户进行评审 + +## 📝 完整配置示例(SSH) + +```bash +# 1. 给 Administrators 组添加 Code-Review +2 权限(主分支) +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-access zhini-im \ + -a refs/heads/* \ + -g Administrators \ + Label-Code-Review+2 + +# 2. 给 Administrators 组添加 Code-Review +2 权限(评审队列,允许自评) +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-access zhini-im \ + -a refs/for/* \ + -g Administrators \ + Label-Code-Review+2 + +# 3. 查看配置结果 +ssh -p 29418 renjianbo@101.43.95.130 gerrit show-access zhini-im +``` + +## 🎯 快速配置命令 + +如果您想快速配置,直接执行: + +```bash +# 给 Administrators 组添加完整的 Code-Review 权限 +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-access zhini-im \ + -a refs/heads/* \ + -g Administrators \ + Label-Code-Review-2 \ + Label-Code-Review-1 \ + Label-Code-Review+1 \ + Label-Code-Review+2 + +# 同时配置评审队列权限(允许自评) +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-access zhini-im \ + -a refs/for/* \ + -g Administrators \ + Label-Code-Review-2 \ + Label-Code-Review-1 \ + Label-Code-Review+1 \ + Label-Code-Review+2 +``` + +配置完成后,您就可以给变更进行 +2 评审了! + + diff --git a/配置SSH密钥指南.md b/配置SSH密钥指南.md new file mode 100644 index 0000000..8747984 --- /dev/null +++ b/配置SSH密钥指南.md @@ -0,0 +1,195 @@ +# Gerrit SSH 密钥配置指南 + +## 在 Windows 上配置 SSH 密钥 + +### 步骤 1:生成 SSH 密钥(如果还没有) + +在 Git Bash 中执行: + +```bash +# 检查是否已有 SSH 密钥 +ls -la ~/.ssh + +# 如果没有 id_rsa 或 id_ed25519,生成新密钥 +ssh-keygen -t ed25519 -C "your_email@example.com" + +# 或者使用 RSA(如果 ed25519 不支持) +ssh-keygen -t rsa -b 4096 -C "your_email@example.com" +``` + +**提示**: +- 按回车使用默认路径:`/c/Users/Administrator/.ssh/id_ed25519` +- 可以设置密码(推荐)或直接回车留空 + +### 步骤 2:查看公钥内容 + +```bash +# 查看公钥(ed25519) +cat ~/.ssh/id_ed25519.pub + +# 或(RSA) +cat ~/.ssh/id_rsa.pub +``` + +**复制整个公钥内容**(从 `ssh-ed25519` 或 `ssh-rsa` 开始到邮箱结束) + +### 步骤 3:将公钥添加到 Gerrit + +1. **登录 Gerrit** + - 访问:`http://101.43.95.130:8080` + - 使用您的账号登录 + +2. **进入 SSH 公钥设置** + - 点击右上角用户名 → "Settings" + - 或直接访问:`http://101.43.95.130:8080/#/settings/ssh-keys` + +3. **添加 SSH 公钥** + - 点击 "Add Key" 或 "+" 按钮 + - 粘贴刚才复制的公钥内容 + - 点击 "Add" 保存 + +### 步骤 4:修复 known_hosts(删除旧密钥) + +```bash +# 删除旧的 Gerrit 主机密钥 +ssh-keygen -R [101.43.95.130]:29418 + +# 或者手动编辑 known_hosts 文件 +# 删除包含 101.43.95.130:29418 的行 +notepad ~/.ssh/known_hosts +``` + +### 步骤 5:测试 SSH 连接 + +```bash +# 测试 SSH 连接(会提示接受新密钥) +ssh -p 29418 admin@101.43.95.130 + +# 输入 yes 接受新的主机密钥 +# 如果配置正确,应该能看到 Gerrit 命令提示符 +``` + +### 步骤 6:配置 Git 使用 SSH + +```bash +cd /d/zhini/zhini_im + +# 删除旧的 HTTP 远程仓库 +git remote remove gerrit + +# 添加 SSH 远程仓库 +git remote add gerrit ssh://admin@101.43.95.130:29418/zhini_im + +# 验证 +git remote -v +``` + +### 步骤 7:推送代码 + +```bash +# 推送代码 +git push gerrit HEAD:refs/heads/master + +# 或推送到评审队列 +git push gerrit HEAD:refs/for/master +``` + +## 完整操作流程 + +### 在 Git Bash 中执行: + +```bash +# 1. 生成 SSH 密钥(如果还没有) +ssh-keygen -t ed25519 -C "admin@example.com" +# 按回车使用默认路径和密码 + +# 2. 查看公钥 +cat ~/.ssh/id_ed25519.pub + +# 3. 复制公钥内容,然后: +# - 访问 http://101.43.95.130:8080/#/settings/ssh-keys +# - 点击 "Add Key" +# - 粘贴公钥 +# - 保存 + +# 4. 删除旧的 known_hosts 条目 +ssh-keygen -R [101.43.95.130]:29418 + +# 5. 测试 SSH 连接 +ssh -p 29418 admin@101.43.95.130 +# 输入 yes 接受新密钥 +# 如果成功,输入 exit 退出 + +# 6. 配置 Git 远程仓库 +cd /d/zhini/zhini_im +git remote remove gerrit +git remote add gerrit ssh://admin@101.43.95.130:29418/zhini_im + +# 7. 推送代码 +git push gerrit HEAD:refs/heads/master +``` + +## 常见问题 + +### Q: 提示 "Permission denied (publickey)"? + +**A:** 可能的原因: +1. 公钥未添加到 Gerrit → 检查 Settings → SSH Keys +2. 用户名错误 → 使用注册时的用户名 +3. 密钥路径不对 → 检查 `~/.ssh/` 目录 + +### Q: 提示 "Host key verification failed"? + +**A:** 执行: +```bash +ssh-keygen -R [101.43.95.130]:29418 +ssh -p 29418 admin@101.43.95.130 # 接受新密钥 +``` + +### Q: 如何查看已添加的 SSH 密钥? + +**A:** 访问:`http://101.43.95.130:8080/#/settings/ssh-keys` + +### Q: 如何测试 SSH 连接? + +**A:** +```bash +ssh -p 29418 admin@101.43.95.130 gerrit version +``` + +如果配置正确,应该显示 Gerrit 版本信息。 + +## SSH vs HTTP 对比 + +### SSH 方式 +- ✅ 更安全 +- ✅ 不需要每次输入密码 +- ✅ 支持更多 Gerrit 命令 +- ❌ 需要配置密钥 + +### HTTP 方式 +- ✅ 配置简单 +- ✅ 不需要密钥 +- ❌ 每次推送可能需要认证(开发模式下不需要) + +## 验证配置 + +### 测试 SSH 连接 + +```bash +# 测试连接 +ssh -p 29418 admin@101.43.95.130 gerrit version + +# 应该显示: +# gerrit version 3.9.0 +``` + +### 测试 Git 推送 + +```bash +cd /d/zhini/zhini_im +git push gerrit HEAD:refs/heads/master +``` + +如果成功,应该能看到推送进度和成功消息。 + diff --git a/配置权限-Web界面步骤.md b/配置权限-Web界面步骤.md new file mode 100644 index 0000000..355815c --- /dev/null +++ b/配置权限-Web界面步骤.md @@ -0,0 +1,106 @@ +# 在 Web 界面配置 +2 权限(详细步骤) + +## 📍 您当前的位置 + +您已经在 `zhini-im` 项目的 **Access** 页面: +- URL: `http://101.43.95.130:8080/#/admin/projects/zhini-im,access` +- 页面显示:**"Rights Inherit From All-Projects"** + +## 🎯 配置步骤 + +### 方法一:在当前项目添加权限(推荐) + +1. **查找 "Edit" 按钮** + - 在页面右上角或顶部导航栏附近 + - 如果看不到,查找 **"Add Permission"** 或 **"+"** 按钮 + - 或者查找 **"Inherit"** 按钮,点击后可以添加项目特定的权限 + +2. **点击 "Edit" 或 "Add Permission"** + - 进入编辑模式 + +3. **添加权限规则** + - 点击 **"Add Permission"** 或 **"+"** 按钮 + - 在弹出的表单中填写: + ``` + Permission: Label Code-Review + Reference: refs/for/* + Group: Administrators + Value: +2 + ``` + - 点击 **"Add"** 或 **"Save"** + +4. **保存更改** + - 点击页面底部的 **"Save Changes"** 按钮 + +### 方法二:在 All-Projects 中配置(全局) + +1. **点击 "All-Projects" 链接** + - 在页面中央,点击蓝色的 **"All-Projects"** 链接 + - 或直接访问:`http://101.43.95.130:8080/#/admin/projects/All-Projects,access` + +2. **编辑权限** + - 点击 **"Edit"** 按钮 + - 添加 Code-Review +2 权限(步骤同上) + - 保存 + +## 🔍 如果找不到 "Edit" 按钮 + +### 检查管理员权限 + +1. 访问:`http://101.43.95.130:8080/#/settings` +2. 查看左侧是否有 **"Administration"** 选项 +3. 如果没有,说明您可能不是管理员 + +### 解决方案 + +1. **使用第一个登录的用户**(开发模式下,第一个登录的用户自动成为管理员) +2. **或者通过配置文件手动添加管理员** + +## 📝 通过配置文件添加权限(备选方案) + +如果 Web 界面无法操作,可以手动编辑配置文件: + +```bash +# 编辑项目配置文件 +cd /home/renjianbo/gerrit_install/review_site +vim etc/project.config +``` + +在文件中添加: + +``` +[access "refs/for/*"] + label-Code-Review = +2 group Administrators +``` + +然后重新加载配置: + +```bash +# 重新加载配置(需要重启 Gerrit) +cd /home/renjianbo/gerrit_install/review_site +JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh restart +``` + +## 🎯 最简单的解决方案 + +由于 SSH 连接有问题,**推荐使用 Web 界面配置**: + +1. 在 Access 页面,查找页面上的任何按钮: + - **"Edit"** + - **"Add Permission"** + - **"+"** + - **"Inherit"**(点击后可以添加项目特定权限) + +2. 如果都找不到,尝试: + - 刷新页面(F5) + - 检查是否已登录为管理员 + - 或者点击 **"All-Projects"** 链接,在全局配置中设置 + +## ✅ 配置完成后验证 + +配置完成后: +1. 刷新 Access 页面 +2. 应该能看到新添加的权限规则 +3. 尝试给变更进行 +2 评审,看是否成功 + + diff --git a/重新初始化说明.md b/重新初始化说明.md new file mode 100644 index 0000000..584c6e9 --- /dev/null +++ b/重新初始化说明.md @@ -0,0 +1,151 @@ +# Gerrit 重新初始化说明 + +## 已完成的准备工作 + +✅ 数据已备份到:`/home/renjianbo/gerrit_install/backup_before_reinit_20251217_234459` +✅ 旧的 review_site 目录已删除 +✅ 重新初始化脚本已创建:`/home/renjianbo/gerrit/reinit_gerrit.sh` + +## 手动执行重新初始化 + +由于终端环境问题,请手动执行以下命令: + +### 步骤 1:进入目录 + +```bash +cd /home/renjianbo/gerrit_install +``` + +### 步骤 2:设置 Java 环境 + +```bash +export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 +export PATH=$JAVA_HOME/bin:$PATH +``` + +### 步骤 3:重新初始化 Gerrit + +```bash +java -jar gerrit-3.9.0.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + -D gerrit.canonicalWebUrl=http://101.43.95.130:8080/ \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes +``` + +### 步骤 4:配置 Gerrit + +初始化完成后,编辑配置文件: + +```bash +cd /home/renjianbo/gerrit_install/review_site +``` + +创建或编辑 `etc/gerrit.config`: + +```bash +cat > etc/gerrit.config << 'EOF' +[gerrit] + basePath = git + canonicalWebUrl = http://101.43.95.130:8080/ + serverId = $(date +%s) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT + gitBasicAuth = true +[sshd] + listenAddress = *:29418 +[httpd] + listenUrl = http://*:8080/ + cookieSecure = false + cookieSameSite = LAX + cookiePath = / +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOF +``` + +### 步骤 5:配置启动脚本使用 Java 17 + +```bash +cd /home/renjianbo/gerrit_install/review_site +cp bin/gerrit.sh bin/gerrit.sh.bak +sed -i "2i export JAVA_HOME=/usr/local/java/jdk-17.0.12+7\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh +``` + +### 步骤 6:启动服务 + +```bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh start +``` + +等待几秒钟,然后检查状态: + +```bash +bin/gerrit.sh status +``` + +## 或者使用脚本(推荐) + +如果脚本可以执行: + +```bash +cd /home/renjianbo/gerrit +chmod +x reinit_gerrit.sh +./reinit_gerrit.sh +``` + +## 初始化完成后的操作 + +### 1. 清除浏览器 Cookie 和缓存 + +- 按 `Ctrl+Shift+Delete` +- 选择 "Cookie 和其他网站数据" 和 "缓存的图片和文件" +- 点击 "清除数据" + +### 2. 访问 Gerrit + +- 打开浏览器 +- 访问:`http://101.43.95.130:8080` + +### 3. 创建管理员账号 + +- 点击 "Sign In" +- 输入一个新用户名(例如:`admin`) +- **第一个登录的用户将自动成为管理员** + +### 4. 验证管理员权限 + +登录后: +- 访问:`http://101.43.95.130:8080/#/settings` +- 左侧应该显示 **"Administration"** 选项 +- 访问:`http://101.43.95.130:8080/#/admin/repos` +- 应该能看到 **"CREATE NEW"** 按钮 + +## 备份位置 + +所有数据已备份到: +``` +/home/renjianbo/gerrit_install/backup_before_reinit_20251217_234459 +``` + +如果需要恢复数据,可以从备份目录复制回 `review_site` 目录。 + +## 注意事项 + +⚠️ **重新初始化会删除所有现有数据**(项目、账户、变更等),但已备份。 + +✅ **第一个登录的用户自动成为管理员**(开发模式下) + +✅ **可以创建多个用户**,然后通过管理员在 Settings → Administration → Groups 中添加其他用户到 Administrators 组 + diff --git a/重新安装说明.md b/重新安装说明.md new file mode 100644 index 0000000..ff30ad6 --- /dev/null +++ b/重新安装说明.md @@ -0,0 +1,149 @@ +# Gerrit 重新安装说明 + +## 重要提示 + +⚠️ **重新安装会删除所有现有数据**(项目、账户、变更等),但会先备份到 `~/gerrit_install/backup_*` 目录。 + +## 重新安装步骤 + +### 1. 执行重新安装脚本 + +```bash +cd /home/renjianbo/gerrit +./reinstall_gerrit.sh +``` + +脚本会自动: +- ✅ 停止现有服务 +- ✅ 备份现有数据(Git 仓库、数据库、配置) +- ✅ 清理旧安装 +- ✅ 重新下载并初始化 Gerrit +- ✅ 配置正确的 IP 地址和 Cookie 设置 +- ✅ 启动服务 + +### 2. 等待安装完成 + +安装过程可能需要 2-5 分钟,请耐心等待。 + +### 3. 首次登录 + +安装完成后: + +1. **清除浏览器缓存和 Cookie**(非常重要!) + - 按 `Ctrl+Shift+Delete` + - 清除所有 Cookie 和缓存 + +2. **访问 Gerrit** + - 打开浏览器访问:`http://101.43.95.130:8080` + +3. **注册新账户** + - 点击 "Sign In" + - 点击 "New Account" 注册新账户 + - 第一个注册的用户将自动成为管理员 + +4. **设置用户名** + - 登录后,进入 **Settings** → **Profile** + - 设置 **Username**(例如:`renjianbo`) + - 保存后即可使用用户名登录 + +## 如果安装失败 + +### 检查 Java 版本 + +```bash +java -version +``` + +需要 Java 11 或更高版本。如果版本不对: + +```bash +# 检查可用的 Java +ls -la /usr/lib/jvm/ + +# 如果已有 Java 11,设置环境变量 +export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 +``` + +### 查看日志 + +```bash +cd ~/gerrit_install/review_site +tail -f logs/error_log +``` + +### 手动启动 + +如果自动启动失败,可以手动启动: + +```bash +cd ~/gerrit_install/review_site +JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start +``` + +## 恢复备份数据 + +如果需要恢复之前的数据: + +```bash +# 停止服务 +cd ~/gerrit_install/review_site +bin/gerrit.sh stop + +# 恢复 Git 仓库 +cp -r ~/gerrit_install/backup_*/git/* review_site/git/ + +# 恢复数据库(注意:可能需要重新初始化) +cp -r ~/gerrit_install/backup_*/db/* review_site/db/ + +# 启动服务 +bin/gerrit.sh start +``` + +## 验证安装 + +安装成功后,检查: + +```bash +# 1. 检查服务状态 +cd ~/gerrit_install/review_site +bin/gerrit.sh status + +# 2. 检查端口 +netstat -tlnp | grep -E ":(8080|29418)" + +# 3. 测试 Web 访问 +curl -I http://localhost:8080 +``` + +## 常见问题 + +### Q: 安装后还是无法登录? + +A: 请确保: +1. ✅ 已清除浏览器缓存和 Cookie +2. ✅ 使用正确的访问地址:`http://101.43.95.130:8080` +3. ✅ 使用 "New Account" 注册新账户 +4. ✅ 尝试使用无痕模式测试 + +### Q: 服务启动失败? + +A: 检查: +1. Java 版本是否正确(需要 Java 11+) +2. 端口是否被占用:`netstat -tlnp | grep 8080` +3. 查看错误日志:`tail -f ~/gerrit_install/review_site/logs/error_log` + +### Q: 如何恢复之前的项目? + +A: Git 仓库已备份,可以: +1. 停止服务 +2. 将备份的 Git 仓库复制回 `review_site/git/` 目录 +3. 重启服务 +4. 在 Web 界面重新创建项目(指向已存在的 Git 仓库) + +## 需要帮助? + +如果重新安装后仍有问题,请提供: +1. 安装脚本的输出 +2. 错误日志内容 +3. 浏览器控制台的错误信息 + diff --git a/项目创建成功-zhini-im.md b/项目创建成功-zhini-im.md new file mode 100644 index 0000000..caaa290 --- /dev/null +++ b/项目创建成功-zhini-im.md @@ -0,0 +1,75 @@ +# ✅ 项目创建成功 + +## 项目信息 + +- **项目名称**: `zhini-im` +- **项目路径**: `/home/renjianbo/gerrit_install/review_site/git/zhini-im.git` +- **Gerrit 访问地址**: `http://101.43.95.130:8080/#/admin/projects/zhini-im` + +## ⚠️ 重要提示 + +我注意到 Gerrit 中已经存在一个项目: +- `zhini_im` (使用下划线) + +而您尝试推送的是: +- `zhini-im` (使用连字符) + +这是两个不同的项目! + +## 解决方案 + +### 方案一:使用刚创建的 `zhini-im` 项目(推荐) + +如果您的代码仓库名称是 `zhini-im`,请确保远程仓库配置正确: + +```bash +cd /d/zhini/zhini_im + +# 检查当前远程配置 +git remote -v + +# 如果 gerrit 远程使用的是 zhini-im,直接推送即可 +git push gerrit HEAD:refs/for/master +``` + +### 方案二:使用已存在的 `zhini_im` 项目 + +如果您想使用已存在的 `zhini_im` 项目,需要修改远程仓库: + +```bash +cd /d/zhini/zhini_im + +# 修改远程仓库为 zhini_im +git remote set-url gerrit ssh://renjianbo@101.43.95.130:29418/zhini_im + +# 然后推送 +git push gerrit HEAD:refs/for/master +``` + +## 下一步操作 + +1. **确认项目名称**:决定使用 `zhini-im` 还是 `zhini_im` +2. **配置远程仓库**:确保远程仓库 URL 中的项目名称正确 +3. **安装 commit-msg hook**(如果还没安装): + ```bash + cd /d/zhini/zhini_im + mkdir -p .git/hooks + curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + chmod +x .git/hooks/commit-msg + ``` +4. **推送代码**: + ```bash + git push gerrit HEAD:refs/for/master + ``` + +## 查看项目列表 + +您可以在 Web 界面查看所有项目: +- 访问:`http://101.43.95.130:8080/#/admin/projects/` + +或在服务器上查看: +```bash +ls -la /home/renjianbo/gerrit_install/review_site/git/ +``` + + diff --git a/项目创建成功.md b/项目创建成功.md new file mode 100644 index 0000000..656210d --- /dev/null +++ b/项目创建成功.md @@ -0,0 +1,71 @@ +# 项目创建成功! + +## ✅ 已创建的项目 + +我已经在服务器端创建了项目:**test-project** + +## 查看项目 + +### 方法一:刷新 Web 界面 + +1. **刷新 Repositories 页面**(按 `F5`) +2. 项目 `test-project` 应该会出现在列表中 + +### 方法二:直接访问项目 + +在浏览器地址栏输入: +``` +http://101.43.95.130:8080/#/admin/projects/test-project +``` + +## 使用项目 + +### 克隆项目到本地 + +```bash +# 方式一:通过 SSH(推荐) +git clone ssh://renjianbo@101.43.95.130:29418/test-project + +# 方式二:通过 HTTP +git clone http://101.43.95.130:8080/test-project +``` + +### 推送代码进行评审 + +```bash +cd test-project +echo "# Test Project" > README.md +git add README.md +git commit -m "Add README file" +git push origin HEAD:refs/for/master +``` + +## 创建更多项目 + +### 方法一:通过 Web 界面 + +1. 访问:`http://101.43.95.130:8080/#/admin/projects/create` +2. 填写项目信息 +3. 点击 "Create Project" + +### 方法二:手动创建(服务器端) + +如果 Web 界面没有创建按钮,可以在服务器上手动创建: + +```bash +cd /home/renjianbo/gerrit_install/review_site/git +mkdir my-new-project.git +cd my-new-project.git +git init --bare +``` + +然后刷新 Web 界面即可看到新项目。 + +## 下一步 + +1. ✅ **项目已创建**:`test-project` +2. ✅ **可以开始使用**:克隆项目并推送代码 +3. 📝 **查看项目**:在 Repositories 页面查看所有项目 + +祝您使用愉快!🎉 + diff --git a/验证权限配置.md b/验证权限配置.md new file mode 100644 index 0000000..016ea57 --- /dev/null +++ b/验证权限配置.md @@ -0,0 +1,103 @@ +# 验证 +2 权限配置 + +## 已完成的配置 + +### 1. All-Projects(全局配置) +文件:`/home/renjianbo/gerrit_install/review_site/git/All-Projects.git/config` + +已添加: +``` +[access "refs/for/*"] + label-Code-Review = +2 group Administrators + label-Code-Review = +2 user renjianbo +[access "refs/heads/*"] + label-Code-Review = +2 group Administrators + label-Code-Review = +2 user renjianbo +``` + +### 2. zhini-im 项目配置 +文件:`/home/renjianbo/gerrit_install/review_site/git/zhini-im.git/config` + +已添加: +``` +[access "refs/for/*"] + label-Code-Review = +2 group Administrators + label-Code-Review = +2 user renjianbo +[access "refs/heads/*"] + label-Code-Review = +2 group Administrators + label-Code-Review = +2 user renjianbo +``` + +## 如果还是看不到 +2,请尝试以下步骤 + +### 步骤 1:清除浏览器缓存并重新登录 + +1. **清除浏览器缓存**: + - Chrome: Ctrl+Shift+Delete + - 选择"缓存的图片和文件" + - 清除数据 + +2. **完全退出并重新登录 Gerrit**: + - 点击右上角用户名 → "Sign Out" + - 重新登录 + +### 步骤 2:检查用户组 + +访问:`http://101.43.95.130:8080/#/settings` + +查看您所属的用户组。如果不是 Administrators,需要添加: + +1. 访问:`http://101.43.95.130:8080/#/admin/groups/Administrators,members` +2. 点击 "Add" 按钮 +3. 输入:`renjianbo` +4. 保存 + +### 步骤 3:通过 Web 界面验证权限配置 + +访问权限配置页面,查看配置是否正确: + +- All-Projects: `http://101.43.95.130:8080/#/admin/projects/All-Projects,access` +- zhini-im: `http://101.43.95.130:8080/#/admin/projects/zhini-im,access` + +在 Access 页面应该能看到我们添加的权限规则。 + +### 步骤 4:检查权限格式 + +如果通过 Web 界面查看,权限应该显示为: +- **Reference**: `refs/for/*` +- **Permission**: `Label Code-Review` +- **Value**: `+2` +- **Group/User**: `Administrators` 或 `renjianbo` + +## 临时解决方案:直接合并 + +如果 +2 权限配置有问题,您也可以: + +1. **直接合并变更**(如果有权限): + - 在变更页面点击 "Submit" 按钮 + - 或者通过 SSH: + ```bash + ssh -p 29418 renjianbo@101.43.95.130 gerrit review 14 --submit + ``` + +2. **配置项目允许直接推送**(绕过评审): + - 在项目权限中添加 `Push` 权限 + - 然后可以直接推送:`git push gerrit HEAD:refs/heads/master` + +## 调试信息 + +如果问题仍然存在,请检查: + +1. **Gerrit 日志**: + ```bash + tail -f /home/renjianbo/gerrit_install/review_site/logs/gerrit.log | grep -i permission + ``` + +2. **权限配置是否正确加载**: + - 访问权限页面,查看配置是否显示 + +3. **用户身份**: + - 确认登录的用户名是 `renjianbo` + - 确认用户属于 Administrators 组 + +