鏇存柊鏂囨。
This commit is contained in:
@@ -1,424 +1,424 @@
|
||||
# gerrit上传代码详细指南
|
||||
|
||||
# **Gerrit 代码上传详细指南**
|
||||
|
||||
## **一、Gerrit 工作流程概述**
|
||||
|
||||
```
|
||||
开发者 → 本地开发 → 推送代码审查 → Gerrit 评审 → 评审通过 → 合并代码
|
||||
↑ ↓
|
||||
└─────────────── 需要修改 ← 评审不通过 ←───────────────┘
|
||||
```
|
||||
|
||||
## **二、环境准备**
|
||||
|
||||
### **1. 安装必要的工具**
|
||||
|
||||
```bash
|
||||
# 安装 Git
|
||||
sudo apt-get install git # Ubuntu/Debian
|
||||
brew install git # macOS
|
||||
|
||||
# 安装 commit-msg 钩子(关键步骤)
|
||||
curl -Lo .git/hooks/commit-msg http://YOUR_GERRIT:8080/tools/hooks/commit-msg
|
||||
chmod +x .git/hooks/commit-msg
|
||||
```
|
||||
|
||||
### **2. 配置 Git 用户信息**
|
||||
|
||||
```bash
|
||||
git config --global user.name "你的姓名"
|
||||
git config --global user.email "你的邮箱@company.com"
|
||||
git config --global core.autocrlf input # Windows 用户重要!
|
||||
git config --global core.safecrlf warn
|
||||
```
|
||||
|
||||
### **3. 配置 SSH 密钥**
|
||||
|
||||
```bash
|
||||
# 生成 SSH 密钥
|
||||
ssh-keygen -t ed25519 -C "your_email@company.com"
|
||||
|
||||
# 查看公钥
|
||||
cat ~/.ssh/id_ed25519.pub
|
||||
|
||||
# 将公钥添加到 Gerrit: Settings → SSH Keys
|
||||
```
|
||||
|
||||
## **三、日常开发流程**
|
||||
|
||||
### **1. 克隆项目**
|
||||
|
||||
```bash
|
||||
# 方式1:通过 SSH(推荐)
|
||||
git clone ssh://username@gerrit-server:29418/project-name
|
||||
|
||||
# 方式2:通过 HTTP
|
||||
git clone http://gerrit-server:8080/project-name
|
||||
```
|
||||
|
||||
### **2. 创建开发分支**
|
||||
|
||||
```bash
|
||||
# 从 master 创建功能分支
|
||||
git checkout master
|
||||
git pull origin master
|
||||
git checkout -b feature/your-feature-name
|
||||
|
||||
# 或者从特定版本创建
|
||||
git checkout -b feature/xxx release-1.0
|
||||
```
|
||||
|
||||
### **3. 进行开发**
|
||||
|
||||
```bash
|
||||
# 修改文件
|
||||
git add .
|
||||
git status # 查看状态
|
||||
|
||||
# 提交代码(commit-msg 钩子会自动添加 Change-Id)
|
||||
git commit -m "功能描述
|
||||
|
||||
详细描述:
|
||||
1. 做了什么修改
|
||||
2. 为什么修改
|
||||
3. 测试情况
|
||||
|
||||
Bug: BUG-12345 # 如果有 Bug 编号
|
||||
Feature: FEAT-6789 # 如果有需求编号
|
||||
|
||||
Change-Id: I自动生成"
|
||||
```
|
||||
|
||||
### **4. 推送代码审查**
|
||||
|
||||
```bash
|
||||
# 标准推送方式(创建/更新代码审查)
|
||||
git push origin HEAD:refs/for/目标分支
|
||||
|
||||
# 示例:
|
||||
git push origin HEAD:refs/for/master # 推送到 master 评审
|
||||
git push origin HEAD:refs/for/release-1.0 # 推送到 release 分支评审
|
||||
git push origin HEAD:refs/for/feature/xxx # 推送到功能分支评审
|
||||
```
|
||||
|
||||
## **四、推送参数详解**
|
||||
|
||||
### **1. 普通推送**
|
||||
|
||||
```bash
|
||||
# 创建新的代码审查
|
||||
git push origin HEAD:refs/for/master
|
||||
|
||||
# 创建草稿代码审查
|
||||
git push origin HEAD:refs/drafts/master
|
||||
```
|
||||
|
||||
### **2. 推送并设置评审人**
|
||||
|
||||
```bash
|
||||
# 推送并添加 Reviewer
|
||||
git push origin HEAD:refs/for/master%r=reviewer1@company.com,r=reviewer2@company.com
|
||||
|
||||
# 推送并添加 CC
|
||||
git push origin HEAD:refs/for/master%cc=manager@company.com
|
||||
|
||||
# 推送并设置 Topic
|
||||
git push origin HEAD:refs/for/master%topic=feature/login
|
||||
```
|
||||
|
||||
### **3. 推送选项组合**
|
||||
|
||||
```bash
|
||||
# 完整示例
|
||||
git push origin HEAD:refs/for/master%\
|
||||
r=alice@company.com,\
|
||||
r=bob@company.com,\
|
||||
cc=manager@company.com,\
|
||||
topic=feature/login,\
|
||||
l=Code-Review+2,\
|
||||
l=Verified+1
|
||||
```
|
||||
|
||||
## **五、更新已有的代码审查**
|
||||
|
||||
### **1. 修改后更新**
|
||||
|
||||
```bash
|
||||
# 修改代码后
|
||||
git add .
|
||||
git commit --amend # 重要:必须使用 --amend 保留 Change-Id
|
||||
|
||||
# 重新推送(会自动更新原有代码审查)
|
||||
git push origin HEAD:refs/for/master
|
||||
```
|
||||
|
||||
### **2. 基于评审意见修改**
|
||||
|
||||
```bash
|
||||
# 查看评审意见后修改
|
||||
git fetch origin refs/changes/XX/YYYY/Z && git checkout FETCH_HEAD
|
||||
# 或者
|
||||
git review -d 12345 # 如果安装了 git-review
|
||||
|
||||
# 修改代码
|
||||
git add .
|
||||
git commit --amend
|
||||
|
||||
# 重新推送
|
||||
git push origin HEAD:refs/for/master
|
||||
```
|
||||
|
||||
### **3. 创建新的 Patch Set**
|
||||
|
||||
```bash
|
||||
# 每次 git commit --amend 后推送都会创建新的 Patch Set
|
||||
git log --oneline -1 # 确认 Change-Id 存在
|
||||
git push origin HEAD:refs/for/master
|
||||
```
|
||||
|
||||
## **六、解决常见问题**
|
||||
|
||||
### **问题1:缺少 Change-Id**
|
||||
|
||||
```bash
|
||||
# 安装 commit-msg 钩子
|
||||
curl -Lo .git/hooks/commit-msg http://gerrit:8080/tools/hooks/commit-msg
|
||||
chmod +x .git/hooks/commit-msg
|
||||
|
||||
# 为现有提交添加 Change-Id
|
||||
git commit --amend --no-edit # 重新提交,钩子会自动添加
|
||||
|
||||
# 或者手动添加
|
||||
git commit --amend -m "原提交信息
|
||||
|
||||
Change-Id: I旧的ChangeId" # 从 Gerrit 界面复制
|
||||
```
|
||||
|
||||
### **问题2:权限拒绝**
|
||||
|
||||
```bash
|
||||
# 检查 SSH 配置
|
||||
ssh -p 29418 username@gerrit-server
|
||||
|
||||
# 检查公钥是否添加
|
||||
cat ~/.ssh/id_ed25519.pub
|
||||
|
||||
# 检查项目权限
|
||||
# 联系管理员或查看 Gerrit Web 界面
|
||||
```
|
||||
|
||||
### **问题3:冲突无法推送**
|
||||
|
||||
```bash
|
||||
# 拉取最新代码
|
||||
git fetch origin
|
||||
git rebase origin/master # 或者 git merge origin/master
|
||||
|
||||
# 解决冲突
|
||||
git mergetool # 或手动解决
|
||||
git add .
|
||||
git rebase --continue # 如果使用 rebase
|
||||
|
||||
# 重新推送
|
||||
git push origin HEAD:refs/for/master
|
||||
```
|
||||
|
||||
### **问题4:错误的分支目标**
|
||||
|
||||
```bash
|
||||
# 查看当前分支
|
||||
git branch -a
|
||||
|
||||
# 查看远程分支
|
||||
git branch -r
|
||||
|
||||
# 推送到正确的分支
|
||||
git push origin HEAD:refs/for/正确的分支名
|
||||
```
|
||||
|
||||
## **七、高级操作**
|
||||
|
||||
### **1. 提交多个相关修改**
|
||||
|
||||
```bash
|
||||
# 创建多个提交
|
||||
git add file1
|
||||
git commit -m "修改1: 功能A"
|
||||
git add file2
|
||||
git commit -m "修改2: 功能B"
|
||||
|
||||
# 推送到同一个 Topic
|
||||
git push origin HEAD~2:refs/for/master%topic=feature/xxx
|
||||
```
|
||||
|
||||
### **2. 依赖链提交**
|
||||
|
||||
```bash
|
||||
# 第一个提交
|
||||
git commit -m "基础修改"
|
||||
|
||||
# 第二个提交依赖第一个
|
||||
git commit -m "依赖修改"
|
||||
|
||||
# 推送到 Gerrit 时保持依赖关系
|
||||
git push origin HEAD~1:refs/for/master
|
||||
git push origin HEAD:refs/for/master%depends=第一个提交的Change-Id
|
||||
```
|
||||
|
||||
### **3. 使用 git-review 工具**
|
||||
|
||||
```bash
|
||||
# 安装
|
||||
pip install git-review
|
||||
|
||||
# 初始化
|
||||
git review -s
|
||||
|
||||
# 提交代码审查
|
||||
git review
|
||||
|
||||
# 下载代码审查
|
||||
git review -d 12345 # Change-Number
|
||||
```
|
||||
|
||||
## **八、Gerrit Web 界面操作**
|
||||
|
||||
### **1. 查看代码审查**
|
||||
|
||||
- 访问:`http://gerrit:8080`
|
||||
- 登录 → Dashboard → 查看你的代码审查
|
||||
- 点击 Change-Number 进入详情
|
||||
|
||||
### **2. 评审操作**
|
||||
|
||||
- **+1 / -1**:代码风格、建议性意见
|
||||
- **+2 / -2**:代码评审通过/拒绝(需要权限)
|
||||
- **Submit**:合并代码(需要权限)
|
||||
- **Abandon**:放弃代码审查
|
||||
- **Rebase**:重新基于最新代码
|
||||
- **Cherry Pick**:应用到其他分支
|
||||
|
||||
### **3. 查看差异**
|
||||
|
||||
- **Side-by-Side**:并排对比
|
||||
- **Unified Diff**:统一差异
|
||||
- **Patch Set**:切换不同版本
|
||||
|
||||
## **九、最佳实践**
|
||||
|
||||
### **1. 提交信息规范**
|
||||
|
||||
```
|
||||
一句话摘要(50字以内)
|
||||
|
||||
详细描述:
|
||||
• 做了什么修改
|
||||
• 为什么修改
|
||||
• 如何测试
|
||||
• 可能的影响
|
||||
|
||||
Bug: BUG-12345
|
||||
Feature: FEAT-6789
|
||||
Test: 通过单元测试/集成测试
|
||||
|
||||
Change-Id: I自动生成
|
||||
```
|
||||
|
||||
### **2. 代码审查前自查**
|
||||
|
||||
```bash
|
||||
# 1. 运行代码检查
|
||||
git diff --check # 检查空白字符
|
||||
|
||||
# 2. 运行测试
|
||||
npm test # 或 mvn test, pytest 等
|
||||
|
||||
# 3. 检查提交信息
|
||||
git log --oneline -1
|
||||
|
||||
# 4. 确保 Change-Id 存在
|
||||
git log -1 | grep Change-Id
|
||||
```
|
||||
|
||||
### **3. 每日工作流程**
|
||||
|
||||
```bash
|
||||
# 早上
|
||||
git fetch origin
|
||||
git rebase origin/master # 更新本地代码
|
||||
|
||||
# 开发中
|
||||
git add .
|
||||
git commit -m "..."
|
||||
|
||||
# 推送前
|
||||
git pull --rebase origin master # 再次更新
|
||||
解决冲突(如果有)
|
||||
git push origin HEAD:refs/for/master
|
||||
|
||||
# 查看 Gerrit 反馈
|
||||
# 根据评审意见修改
|
||||
```
|
||||
|
||||
## **十、常用命令速查**
|
||||
|
||||
```bash
|
||||
# 初始化
|
||||
git clone ssh://user@gerrit:29418/project
|
||||
scp -p -P 29418 user@gerrit:hooks/commit-msg .git/hooks/
|
||||
|
||||
# 日常开发
|
||||
git checkout -b feature/xxx
|
||||
git add .
|
||||
git commit -m "..."
|
||||
git push origin HEAD:refs/for/master
|
||||
|
||||
# 更新
|
||||
git commit --amend
|
||||
git push origin HEAD:refs/for/master
|
||||
|
||||
# 查看
|
||||
git log --oneline -5
|
||||
git status
|
||||
git diff
|
||||
|
||||
# 解决冲突
|
||||
git fetch origin
|
||||
git rebase origin/master
|
||||
解决冲突 → git add → git rebase --continue
|
||||
```
|
||||
|
||||
## **十一、故障排除**
|
||||
|
||||
| 问题 | 解决方案 |
|
||||
| ------------- | ----------------- |
|
||||
| 403 Forbidden | 检查 SSH 密钥/HTTP 密码 |
|
||||
| 缺少 Change-Id | 安装 commit-msg 钩子 |
|
||||
| 分支不存在 | 先创建分支或确认分支名 |
|
||||
| 冲突无法推送 | rebase 解决冲突 |
|
||||
| 权限不足 | 联系管理员添加权限 |
|
||||
| 推送被拒绝 | 检查目标分支是否正确 |
|
||||
|
||||
## **十二、快速参考卡片**
|
||||
|
||||
```
|
||||
✅ 正确流程:
|
||||
1. git clone
|
||||
2. 安装 commit-msg 钩子
|
||||
3. git checkout -b feature/xxx
|
||||
4. 开发并提交
|
||||
5. git push origin HEAD:refs/for/目标分支
|
||||
|
||||
✅ 更新流程:
|
||||
1. git commit --amend # 必须!
|
||||
2. git push origin HEAD:refs/for/目标分支
|
||||
|
||||
✅ 关键要点:
|
||||
• 每次提交都必须有 Change-Id
|
||||
• 更新必须用 --amend
|
||||
• 只能推送到 refs/for/
|
||||
• 在 Gerrit Web 界面查看结果
|
||||
```
|
||||
|
||||
需要我详细解释哪个部分吗?
|
||||
# gerrit上传代码详细指南
|
||||
|
||||
# **Gerrit 代码上传详细指南**
|
||||
|
||||
## **一、Gerrit 工作流程概述**
|
||||
|
||||
```
|
||||
开发者 → 本地开发 → 推送代码审查 → Gerrit 评审 → 评审通过 → 合并代码
|
||||
↑ ↓
|
||||
└─────────────── 需要修改 ← 评审不通过 ←───────────────┘
|
||||
```
|
||||
|
||||
## **二、环境准备**
|
||||
|
||||
### **1. 安装必要的工具**
|
||||
|
||||
```bash
|
||||
# 安装 Git
|
||||
sudo apt-get install git # Ubuntu/Debian
|
||||
brew install git # macOS
|
||||
|
||||
# 安装 commit-msg 钩子(关键步骤)
|
||||
curl -Lo .git/hooks/commit-msg http://YOUR_GERRIT:8080/tools/hooks/commit-msg
|
||||
chmod +x .git/hooks/commit-msg
|
||||
```
|
||||
|
||||
### **2. 配置 Git 用户信息**
|
||||
|
||||
```bash
|
||||
git config --global user.name "你的姓名"
|
||||
git config --global user.email "你的邮箱@company.com"
|
||||
git config --global core.autocrlf input # Windows 用户重要!
|
||||
git config --global core.safecrlf warn
|
||||
```
|
||||
|
||||
### **3. 配置 SSH 密钥**
|
||||
|
||||
```bash
|
||||
# 生成 SSH 密钥
|
||||
ssh-keygen -t ed25519 -C "your_email@company.com"
|
||||
|
||||
# 查看公钥
|
||||
cat ~/.ssh/id_ed25519.pub
|
||||
|
||||
# 将公钥添加到 Gerrit: Settings → SSH Keys
|
||||
```
|
||||
|
||||
## **三、日常开发流程**
|
||||
|
||||
### **1. 克隆项目**
|
||||
|
||||
```bash
|
||||
# 方式1:通过 SSH(推荐)
|
||||
git clone ssh://username@gerrit-server:29418/project-name
|
||||
|
||||
# 方式2:通过 HTTP
|
||||
git clone http://gerrit-server:8080/project-name
|
||||
```
|
||||
|
||||
### **2. 创建开发分支**
|
||||
|
||||
```bash
|
||||
# 从 master 创建功能分支
|
||||
git checkout master
|
||||
git pull origin master
|
||||
git checkout -b feature/your-feature-name
|
||||
|
||||
# 或者从特定版本创建
|
||||
git checkout -b feature/xxx release-1.0
|
||||
```
|
||||
|
||||
### **3. 进行开发**
|
||||
|
||||
```bash
|
||||
# 修改文件
|
||||
git add .
|
||||
git status # 查看状态
|
||||
|
||||
# 提交代码(commit-msg 钩子会自动添加 Change-Id)
|
||||
git commit -m "功能描述
|
||||
|
||||
详细描述:
|
||||
1. 做了什么修改
|
||||
2. 为什么修改
|
||||
3. 测试情况
|
||||
|
||||
Bug: BUG-12345 # 如果有 Bug 编号
|
||||
Feature: FEAT-6789 # 如果有需求编号
|
||||
|
||||
Change-Id: I自动生成"
|
||||
```
|
||||
|
||||
### **4. 推送代码审查**
|
||||
|
||||
```bash
|
||||
# 标准推送方式(创建/更新代码审查)
|
||||
git push origin HEAD:refs/for/目标分支
|
||||
|
||||
# 示例:
|
||||
git push origin HEAD:refs/for/master # 推送到 master 评审
|
||||
git push origin HEAD:refs/for/release-1.0 # 推送到 release 分支评审
|
||||
git push origin HEAD:refs/for/feature/xxx # 推送到功能分支评审
|
||||
```
|
||||
|
||||
## **四、推送参数详解**
|
||||
|
||||
### **1. 普通推送**
|
||||
|
||||
```bash
|
||||
# 创建新的代码审查
|
||||
git push origin HEAD:refs/for/master
|
||||
|
||||
# 创建草稿代码审查
|
||||
git push origin HEAD:refs/drafts/master
|
||||
```
|
||||
|
||||
### **2. 推送并设置评审人**
|
||||
|
||||
```bash
|
||||
# 推送并添加 Reviewer
|
||||
git push origin HEAD:refs/for/master%r=reviewer1@company.com,r=reviewer2@company.com
|
||||
|
||||
# 推送并添加 CC
|
||||
git push origin HEAD:refs/for/master%cc=manager@company.com
|
||||
|
||||
# 推送并设置 Topic
|
||||
git push origin HEAD:refs/for/master%topic=feature/login
|
||||
```
|
||||
|
||||
### **3. 推送选项组合**
|
||||
|
||||
```bash
|
||||
# 完整示例
|
||||
git push origin HEAD:refs/for/master%\
|
||||
r=alice@company.com,\
|
||||
r=bob@company.com,\
|
||||
cc=manager@company.com,\
|
||||
topic=feature/login,\
|
||||
l=Code-Review+2,\
|
||||
l=Verified+1
|
||||
```
|
||||
|
||||
## **五、更新已有的代码审查**
|
||||
|
||||
### **1. 修改后更新**
|
||||
|
||||
```bash
|
||||
# 修改代码后
|
||||
git add .
|
||||
git commit --amend # 重要:必须使用 --amend 保留 Change-Id
|
||||
|
||||
# 重新推送(会自动更新原有代码审查)
|
||||
git push origin HEAD:refs/for/master
|
||||
```
|
||||
|
||||
### **2. 基于评审意见修改**
|
||||
|
||||
```bash
|
||||
# 查看评审意见后修改
|
||||
git fetch origin refs/changes/XX/YYYY/Z && git checkout FETCH_HEAD
|
||||
# 或者
|
||||
git review -d 12345 # 如果安装了 git-review
|
||||
|
||||
# 修改代码
|
||||
git add .
|
||||
git commit --amend
|
||||
|
||||
# 重新推送
|
||||
git push origin HEAD:refs/for/master
|
||||
```
|
||||
|
||||
### **3. 创建新的 Patch Set**
|
||||
|
||||
```bash
|
||||
# 每次 git commit --amend 后推送都会创建新的 Patch Set
|
||||
git log --oneline -1 # 确认 Change-Id 存在
|
||||
git push origin HEAD:refs/for/master
|
||||
```
|
||||
|
||||
## **六、解决常见问题**
|
||||
|
||||
### **问题1:缺少 Change-Id**
|
||||
|
||||
```bash
|
||||
# 安装 commit-msg 钩子
|
||||
curl -Lo .git/hooks/commit-msg http://gerrit:8080/tools/hooks/commit-msg
|
||||
chmod +x .git/hooks/commit-msg
|
||||
|
||||
# 为现有提交添加 Change-Id
|
||||
git commit --amend --no-edit # 重新提交,钩子会自动添加
|
||||
|
||||
# 或者手动添加
|
||||
git commit --amend -m "原提交信息
|
||||
|
||||
Change-Id: I旧的ChangeId" # 从 Gerrit 界面复制
|
||||
```
|
||||
|
||||
### **问题2:权限拒绝**
|
||||
|
||||
```bash
|
||||
# 检查 SSH 配置
|
||||
ssh -p 29418 username@gerrit-server
|
||||
|
||||
# 检查公钥是否添加
|
||||
cat ~/.ssh/id_ed25519.pub
|
||||
|
||||
# 检查项目权限
|
||||
# 联系管理员或查看 Gerrit Web 界面
|
||||
```
|
||||
|
||||
### **问题3:冲突无法推送**
|
||||
|
||||
```bash
|
||||
# 拉取最新代码
|
||||
git fetch origin
|
||||
git rebase origin/master # 或者 git merge origin/master
|
||||
|
||||
# 解决冲突
|
||||
git mergetool # 或手动解决
|
||||
git add .
|
||||
git rebase --continue # 如果使用 rebase
|
||||
|
||||
# 重新推送
|
||||
git push origin HEAD:refs/for/master
|
||||
```
|
||||
|
||||
### **问题4:错误的分支目标**
|
||||
|
||||
```bash
|
||||
# 查看当前分支
|
||||
git branch -a
|
||||
|
||||
# 查看远程分支
|
||||
git branch -r
|
||||
|
||||
# 推送到正确的分支
|
||||
git push origin HEAD:refs/for/正确的分支名
|
||||
```
|
||||
|
||||
## **七、高级操作**
|
||||
|
||||
### **1. 提交多个相关修改**
|
||||
|
||||
```bash
|
||||
# 创建多个提交
|
||||
git add file1
|
||||
git commit -m "修改1: 功能A"
|
||||
git add file2
|
||||
git commit -m "修改2: 功能B"
|
||||
|
||||
# 推送到同一个 Topic
|
||||
git push origin HEAD~2:refs/for/master%topic=feature/xxx
|
||||
```
|
||||
|
||||
### **2. 依赖链提交**
|
||||
|
||||
```bash
|
||||
# 第一个提交
|
||||
git commit -m "基础修改"
|
||||
|
||||
# 第二个提交依赖第一个
|
||||
git commit -m "依赖修改"
|
||||
|
||||
# 推送到 Gerrit 时保持依赖关系
|
||||
git push origin HEAD~1:refs/for/master
|
||||
git push origin HEAD:refs/for/master%depends=第一个提交的Change-Id
|
||||
```
|
||||
|
||||
### **3. 使用 git-review 工具**
|
||||
|
||||
```bash
|
||||
# 安装
|
||||
pip install git-review
|
||||
|
||||
# 初始化
|
||||
git review -s
|
||||
|
||||
# 提交代码审查
|
||||
git review
|
||||
|
||||
# 下载代码审查
|
||||
git review -d 12345 # Change-Number
|
||||
```
|
||||
|
||||
## **八、Gerrit Web 界面操作**
|
||||
|
||||
### **1. 查看代码审查**
|
||||
|
||||
- 访问:`http://gerrit:8080`
|
||||
- 登录 → Dashboard → 查看你的代码审查
|
||||
- 点击 Change-Number 进入详情
|
||||
|
||||
### **2. 评审操作**
|
||||
|
||||
- **+1 / -1**:代码风格、建议性意见
|
||||
- **+2 / -2**:代码评审通过/拒绝(需要权限)
|
||||
- **Submit**:合并代码(需要权限)
|
||||
- **Abandon**:放弃代码审查
|
||||
- **Rebase**:重新基于最新代码
|
||||
- **Cherry Pick**:应用到其他分支
|
||||
|
||||
### **3. 查看差异**
|
||||
|
||||
- **Side-by-Side**:并排对比
|
||||
- **Unified Diff**:统一差异
|
||||
- **Patch Set**:切换不同版本
|
||||
|
||||
## **九、最佳实践**
|
||||
|
||||
### **1. 提交信息规范**
|
||||
|
||||
```
|
||||
一句话摘要(50字以内)
|
||||
|
||||
详细描述:
|
||||
• 做了什么修改
|
||||
• 为什么修改
|
||||
• 如何测试
|
||||
• 可能的影响
|
||||
|
||||
Bug: BUG-12345
|
||||
Feature: FEAT-6789
|
||||
Test: 通过单元测试/集成测试
|
||||
|
||||
Change-Id: I自动生成
|
||||
```
|
||||
|
||||
### **2. 代码审查前自查**
|
||||
|
||||
```bash
|
||||
# 1. 运行代码检查
|
||||
git diff --check # 检查空白字符
|
||||
|
||||
# 2. 运行测试
|
||||
npm test # 或 mvn test, pytest 等
|
||||
|
||||
# 3. 检查提交信息
|
||||
git log --oneline -1
|
||||
|
||||
# 4. 确保 Change-Id 存在
|
||||
git log -1 | grep Change-Id
|
||||
```
|
||||
|
||||
### **3. 每日工作流程**
|
||||
|
||||
```bash
|
||||
# 早上
|
||||
git fetch origin
|
||||
git rebase origin/master # 更新本地代码
|
||||
|
||||
# 开发中
|
||||
git add .
|
||||
git commit -m "..."
|
||||
|
||||
# 推送前
|
||||
git pull --rebase origin master # 再次更新
|
||||
解决冲突(如果有)
|
||||
git push origin HEAD:refs/for/master
|
||||
|
||||
# 查看 Gerrit 反馈
|
||||
# 根据评审意见修改
|
||||
```
|
||||
|
||||
## **十、常用命令速查**
|
||||
|
||||
```bash
|
||||
# 初始化
|
||||
git clone ssh://user@gerrit:29418/project
|
||||
scp -p -P 29418 user@gerrit:hooks/commit-msg .git/hooks/
|
||||
|
||||
# 日常开发
|
||||
git checkout -b feature/xxx
|
||||
git add .
|
||||
git commit -m "..."
|
||||
git push origin HEAD:refs/for/master
|
||||
|
||||
# 更新
|
||||
git commit --amend
|
||||
git push origin HEAD:refs/for/master
|
||||
|
||||
# 查看
|
||||
git log --oneline -5
|
||||
git status
|
||||
git diff
|
||||
|
||||
# 解决冲突
|
||||
git fetch origin
|
||||
git rebase origin/master
|
||||
解决冲突 → git add → git rebase --continue
|
||||
```
|
||||
|
||||
## **十一、故障排除**
|
||||
|
||||
| 问题 | 解决方案 |
|
||||
| ------------- | ----------------- |
|
||||
| 403 Forbidden | 检查 SSH 密钥/HTTP 密码 |
|
||||
| 缺少 Change-Id | 安装 commit-msg 钩子 |
|
||||
| 分支不存在 | 先创建分支或确认分支名 |
|
||||
| 冲突无法推送 | rebase 解决冲突 |
|
||||
| 权限不足 | 联系管理员添加权限 |
|
||||
| 推送被拒绝 | 检查目标分支是否正确 |
|
||||
|
||||
## **十二、快速参考卡片**
|
||||
|
||||
```
|
||||
✅ 正确流程:
|
||||
1. git clone
|
||||
2. 安装 commit-msg 钩子
|
||||
3. git checkout -b feature/xxx
|
||||
4. 开发并提交
|
||||
5. git push origin HEAD:refs/for/目标分支
|
||||
|
||||
✅ 更新流程:
|
||||
1. git commit --amend # 必须!
|
||||
2. git push origin HEAD:refs/for/目标分支
|
||||
|
||||
✅ 关键要点:
|
||||
• 每次提交都必须有 Change-Id
|
||||
• 更新必须用 --amend
|
||||
• 只能推送到 refs/for/
|
||||
• 在 Gerrit Web 界面查看结果
|
||||
```
|
||||
|
||||
需要我详细解释哪个部分吗?
|
||||
50
docs/gerrit/gerrit提交代码时遇到钩子问题的解决办法.md
Normal file
50
docs/gerrit/gerrit提交代码时遇到钩子问题的解决办法.md
Normal file
@@ -0,0 +1,50 @@
|
||||
你遇到的问题是在向 Gerrit 代码审核平台推送代码时,因为提交信息(commit message)的末尾缺少 `Change-Id` 标识,导致推送被拒绝了。这是 Gerrit 的强制要求,用于追踪和管理代码评审。
|
||||
|
||||
### 解决方案
|
||||
我会一步步教你解决这个问题,整个过程分为两步:安装 commit-msg 钩子、补全 Change-Id 并重新推送。
|
||||
|
||||
#### 步骤 1:安装 Gerrit 的 commit-msg 钩子
|
||||
这个钩子的作用是在你每次提交代码时,自动在提交信息末尾生成 `Change-Id`。
|
||||
|
||||
根据你的报错信息,执行对应的命令(二选一即可):
|
||||
|
||||
**方式 1:使用 SSH(推荐)**
|
||||
```bash
|
||||
# 获取 git 目录路径并安装钩子
|
||||
gitdir=$(git rev-parse --git-dir); scp -p -P 29418 renjianbo@101.43.95.130:hooks/commit-msg ${gitdir}/hooks/
|
||||
|
||||
# 如果你的 OpenSSH 版本 >= 9.0,需要加 -O 参数
|
||||
gitdir=$(git rev-parse --git-dir); scp -O -p -P 29418 renjianbo@101.43.95.130:hooks/commit-msg ${gitdir}/hooks/
|
||||
```
|
||||
|
||||
**方式 2:使用 HTTP/HTTPS**
|
||||
```bash
|
||||
# 下载钩子文件并赋予执行权限
|
||||
f="$(git rev-parse --git-dir)/hooks/commit-msg"; curl -o "$f" http://101.43.95.130:8082/tools/hooks/commit-msg ; chmod +x "$f"
|
||||
```
|
||||
|
||||
#### 步骤 2:为已有提交补充 Change-Id 并重新推送
|
||||
钩子安装完成后,需要为刚才失败的提交补充 `Change-Id`:
|
||||
```bash
|
||||
# 修正最近一次提交,自动添加 Change-Id(--no-edit 表示不修改提交信息内容)
|
||||
git commit --amend --no-edit
|
||||
|
||||
# 重新推送代码到 Gerrit
|
||||
git push origin HEAD:refs/for/master
|
||||
```
|
||||
|
||||
#### 验证
|
||||
执行完上述命令后,如果没有报错,且终端输出类似以下内容,说明推送成功:
|
||||
```
|
||||
Enumerating objects: xxx, done.
|
||||
Counting objects: 100% (xxx/xxx), done.
|
||||
...
|
||||
remote: Processing changes: new: 1, done
|
||||
To ssh://101.43.95.130:29418/zhini_im
|
||||
* [new reference] HEAD -> refs/for/master
|
||||
```
|
||||
|
||||
### 总结
|
||||
1. **核心原因**:Gerrit 要求所有提交必须包含 `Change-Id` 用于代码评审追踪,你的提交缺少该标识导致推送失败。
|
||||
2. **关键操作**:先安装 `commit-msg` 钩子(自动生成 Change-Id),再用 `git commit --amend --no-edit` 补全已有提交的 Change-Id,最后重新推送。
|
||||
3. **后续预防**:安装钩子后,后续所有新提交都会自动生成 Change-Id,不会再出现此错误。
|
||||
Reference in New Issue
Block a user