美文网首页Code-Review
Gerrit-使用指南

Gerrit-使用指南

作者: tufatao | 来源:发表于2019-12-17 20:40 被阅读0次

    涉及到的基本操作

    1. 登录 gerrit
    2. 激活邮箱
    3. 获取 http Credentials
    4. 拉取代码
    5. 提交代码
    6. Review & Verify & Submit

    初次使用

    登录 gerrit -> 激活邮箱 -> 获取并保存 http credentials(提交时要用)

    激活邮箱

    后续 Push, Review, Verify, Submit, 接收通知 等都需要邮箱的支持。

    1. 登录 -> 进入 Settings -> Email Addresses;
    2. 输入邮箱地址 xxx@xxx.com, Click “Send VERIFICATION” button 发送验证邮件;
    3. 接收邮件 访问 验证链接;
    4. done.
    Settings_Gerrit_email png.png

    获取 Http credentials

    http 方式 Pull, Push 时用。

    1. 登录 gerrit -> 进入 Settings -> HTTP Credentials;
    2. 点击 "GENERATE NEW PASSWORD" Button 获取 password;
    3. done.


      gerrit_http_credentials.png

    开发

    Pull -> Commit -> Push(带上Change-Id)

    拉取代码

    BROWSE -> Repositories。

    仓库地址在仓库详情页。

    Attention

    Pull 时选择 "Clone with commit-msg hook" 方式以便 拿到 commit-msg (.git/hooks/commit-msg) 。

    • Http 方式;
    • ssh 方式;

    提交代码

    确保 commit footer 有 Change-Id 信息。

    Change-Id 可从通过 commit-msg (.git/hooks/commit-msg) 生成。

    Strongly recommended:
    只需确保项目目录(.git/hooks/)下有 commit-msg 脚本,再配合对应 的 gerrit 插件即可在 Commit 时完成 Change-Id 的自动生成。

    Idea, Eclipse 都有相应的 gerrit 插件。

    Change-Id

    用于标识 commit。

    Have a look

    Parent:     65c50d48 (Update Dockerfile base image to 0.1.2)
    Author:     xxxx <xxxxx@qq.com>
    AuthorDate: 2019-12-12 17:41:51 +0800
    Commit:     xxxx <xxxxx@qq.com>
    CommitDate: 2019-12-12 17:41:51 +0800
    
    add readme.md;
    
    Change-Id: Iba58fbc6a1a440a9d3e2e48bbd72f898ba3cabc0
    

    Review

    Review & Verify & Submit

    YOUR -> Changes -> 选择对应的 Change -> REPLY;

    gerrit_reply.png
    1. 添加接收者,抄送者,评论,并对 Code-Review, Verified(若有权限) 打分。

    2. 若 Code-Review Verified 对应的分数均符合 Sumbmit 要求,
      则 当前Change 状态变为 Ready to submit, 放出 Sumbim 按钮。

    3. 点击 Submit 按钮 完成 变更往 gerrit 仓库 master 分支的提交。

    Git 知识准备

    对于一些进阶操作或部分问题的处理,要求对 git 有一定的程度的深入了解。

    rebase & merge

    rebase(变基), merge

    • 共同点:都有整合代码的功能
    • 异同:merge操作会生成一个新的节点(commit)来承载这次整合,之前的提交分开显示。而rebase操作不会生成新的节点(整合在原有的commit 上完成),是将两个分支融合成一个线性的提交。

    git commit --amend

    对前一次 commit 进行微调(打补丁),不产生新的 Commit。

    git commit –amend [options]
    

    fetch vs pull

    可简单理解为: pull = fetch + merge

    git reset

    • reset --soft

      Does not touch the index file or the working tree at all (but resets the head to <commit>, just like all modes do). This leaves all your changed files "Changes to be committed", as git status would put it.

      重置 HEAD 和 branch 时,保留工作目录和暂存区中的内容,并把重置 HEAD 所带来的新的差异放进暂存区。

    • reset --mixed

      Resets the index but not the working tree (i.e., the changed files are preserved but not marked for commit) and reports what has not been updated. This is the default action.

      reset 默认参数 mixed。重置 HEAD 和branch的同时,保留工作目录,并且清空暂存区,并把重置 HEAD 所带来的新的差异放在工作目录。

    • reset --hard

      Resets the index and working tree. Any changes to tracked files in the working tree since <commit> are discarded.

      重置 HEAD 和branch的同时,重置stage区和工作目录里的内容

    参考文档 git reset

    Caution

    • 应总是确保 Commit 有对应的 Change-Id
    • 尽量采用 rebase 方式合并代码, 而非 merge 方式

    Problems

    一些常见的问题及对应的解决方案。

    初次使用 Push 时遇到 鉴权失败

    1. 首先应确保 gerrit 账户名无误;
    2. 检查 Push 密码 是否为 Http Credentials;

    初次使用 Push 时遇到 remote rejected

    此种情况多是由于 本地 git 配置 name, email 与 gerrit 账户名, 注册邮箱不符。

    解决方案:查看并修改 git 配置属性 name, email

    # 查看 git 配置
    git config --list
    # 修改 name 属性
    git config -- global user.name '<gerrit_user_name>'
    # 修改 email 属性
    git config -- global user.email '<gerrit_registered_email>'
    # 两次检查 git 配置... done.
    git config --list
    

    ref update failed: REJECTED_OTHER_REASON no new changes

    问题分析

    这个提示表示没有新的提交。Gerrit审核根据commit
    id和changeId来判断是否是新的提交。

    情况一:如果确实需要提交,比如在初次建立新的分支的时候,两个分支的内容完全一模一样

    解决办法:
    通过git commit –amend生成新的changeId。

    情况二: 合并时,合并的那些历史的 commit 节点,在 gerrit 上都已经评审过了,都是已有的 change 单,所以 gerrit 认为没有新的提交,就不让你提交评审。

    解决办法:
    在 git merge 的时候,加上 --no-ff 参数,是为了让它生成一个新的 commit,这样就可以提交了~(不过生成的 gerrit change 是看不到改动信息的

    结合 Idea gerrit 插件的使用:

    1. 合并时勾选 "No fast forward" 选项;
    2. Push 时,不勾选 "Push to Gerrit" 选项;
    Select-No-fast-forward.png No-Push-to-Gerrit.png

    because ref update failed: REJECTED_OTHER_REASON commit ff9671c: missing Change-Id in message footer

    解决办法:

    1. 通过git commit –amend 生成新的changeId (推荐);
    2. reset 到上一次 Commit, 生成新的changeId,重新提交;

    One or more refs/for/ names blocks change upload The remote end hung up unexpectedly

    问题描述:相应分支挂起(可简单理解为分支状态异常)

    解决方案:

    在对应仓库下执行以下命令

    git for-each-ref refs/for
    # 如果第一条命令执行完后有输出,再执行下面的命令。
    for n in $(git for-each-ref --format='%(refname)' refs/for);do git update-ref -d $n; done
    

    ! [remote rejected] master -> refs/for/master (you are not allowed to upload merges)

    git stash
    # 每次 push 前通过 rebase 方式拉代码
    git pull --rebase
    git push
    git stash pop
    

    Gerrit 提示冲突,不能合并代码(git解决远程冲突)

    1. 将存在冲突的 Change Abandon(丢弃)
    2. 在本地处理好冲突(rebase/merge)再提交

    以下是 rebase 方式(推荐)

    ## rebase 方式
    git branch   #查看分支情况
    git checkout master  #选择分支
    git fetch origin  #fetch与pull的区别,自己再搜吧~
    git rebase origin/master  #查看有“CONFLICT (content): ”的地方,手工解决冲突后,下一步
    git add dev/controller/web/index.php #这只是一个举例,即要先add操作
    git rebase --continue
    git push origin HEAD:refs/for/master    #OK了
    

    项目管理

    迁移旧项目

    以 gitlab 为例。

    以管理员身份登录 gerrit -> 创建项目仓库 repo_demo -> 进入 gerrit_home/<git_dir> 以 gitlab 中同名项目覆盖之(即删除 repo_demo
    -> 再从 gitlab 克隆同名项目)

    # 删除 repo_demo
    rm -rf repo_demo
    # 从 git 仓库全量克隆同名项目
    git clone --mirror <repo_url>
    # 若 gitlab 仓库代码有更新则 再全量拉取一次 即可
    git fetch --all
    

    相关文章

      网友评论

        本文标题:Gerrit-使用指南

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