Git/Gerrit平台

--- Git比svn好用

--- Gerrit一款开源免费的代码评审平台,基于GIT的版本控制系统,目前国内大多数公式均采用Gerrit平台进行代码评审/review管控。 ==> 项目主要使用该平台进行Merge审核。

Gerrit添加账号和密钥

image-20231120145012193

  • Gerrit的版本有时候不支持常用的RSA加密方式 --- 如在使用WSL2时,github可以正常拉取代码,gerrit会显示不识别,此时换一种更先进的加密方式,如ed25519格式的密钥,可以使得gerrit正常

Gerrit添加仓库和分支

1:联系管理员添加分支

2:添加仓库到manifest

  • 拉manifest image-20231120145347570

3:修改相应分支仓库

  • manifest\rk_manifests\include\rk_modules_repository_maiyun.xml image-20231120145927797

4:提交merge后,需重新init该仓库所在项目,而后再提交相关代码


Gerrit拉取代码

--- Gerrit拉取代码和github差不多

  • 拉取代码

    image-20231120150539929

git clone "ssh链接"即可

  • repo init

    repo init --repo-url=ssh://替换成自己@10.110.1.100:29418/repo --no-repo-verify --repo-branch=reponew -u ssh://替换成自己@10.110.1.100:29418/manifest.git -m rk_3568_manifests/rk3568_linux_bu16.xml
    

    出现and try again是正常的;

  • repo sync 即可


Gerrit 基线-同步/编译/提交/撤销/回退

  • 同步代码

    repo sync -c --no-tags     -j32  
    //**--no-tags** don't fetch tags.该选项指定不获取服务器上的tag信息
    
  • 清除、重置(丢弃分支)、同步

    repo forall -c git clean -fd && repo forall -c git reset --hard && repo sync -c --no-tags
    
    # 解决repo问题
    .repo/repo/repo forall -c git clean -fd && .repo/repo/repo forall -c git reset --hard && .repo/repo/repo sync -c --no-tags
    
  • 编译

    //编译
    source build/envsetup.sh
    lunch 40
    ./build.sh -AUCKu
    
  • 提交

    //代码提交
    # 添加这两个文件
    git add 文件名1 文件名2
    
    # 添加所有文件
    git add . 
    
    # 添加已跟踪文件
    git add -u .
    
    # 添加已跟踪和未跟踪的文件
    git add -A .
    
    # 取消添加该文件
    git reset HEAD+文件名         
    
    //example
    # 添加所有changes文件
    git add .
    git commit -m "[Project][Module]Add for xxx by xxx"
    
    # 查看分支
    git branch -a
    * (HEAD detached from 984f637aa77e)
      remotes/m/master -> origin/a1
      remotes/origin/a1
      remotes/origin/master
    
    # 推送至a1分支上
    git push origin HEAD:refs/for/a1
    
  • 撤销

    git reset --hard HEAD (撤销最新的提交) 
    git reset --hard HEAD^ (撤销上一次提交) 
    git reset --hard HEAD^^ (撤销上上一次提交) 
    git reset --hard commit ID (commit ID指的是通过git log看到的commit后面的一长串ID的前7位)
    
  • 回退/恢复

    git log
    git checkout -f 487de35b82fd72b78058b7c5efa34e9a59e0bb87 
    
    git reset --hard "xxxxxxxx"
    

Gerrit-本地分支-查看/创建/切换/重命名/删除

  • 查看

    # 查看本地分支
    git branch
    
    # 查看远程分支
    git branch -r
    
    # 查看所有分支
    git branch -a
    
  • 创建

    # 仅创建
    git branch name(分支名)
    
    # 创建并直接切换至该分支
    git checkout -b name(分支名)
    
  • 切换

    git checkout name(分支名)
    
  • 重命名

    # 重命名本地分支
    git branch -m old_name new_name
    
  • 删除

    # 删除本地分支
    git branch -d name
    
    # 删除远程分支(小卡拉米用不到的)
    git push origin -delete :name 
    

Gerrit-本地远程仓库对比

  • 更新本地远程分支后与本地分支进行对比

    # 更新本地远程分支
    git fetch origin
    
    # 对比
    git diff 本地分支 origin/xxx //只能看到diff内容
    
    # 通过log查看区别
    git log
    git log origin/xxxx 
    

Git-切换分支同步修改

  • 将当前分支修改放入一个新的Git分支

    # 暂存
    git stash
        
    # 创建新的分支
    git checkout -b new-feature
        
    # 将暂存拉到新的分支
    git stash apply
    

Git-解除本地分支冲突

  • 保存修改文件和记录修改内容

  • 通过git stash 解决冲突

    # 暂存
    git stash
        
    # pull 更新
    git pull <remote> <branch>
    //这里可以检查下是否是最新的,可能要拉取下远程分支
    
    # 还原暂存
    git stash pop
    

Git stash的用法

  • git stash 暂存本地修改至缓存区

  • Git-stash pop 和 Git-stash apply的区别

    # 查看保存的信息和标记
    git stash list
    
    # 拉取方式
    git stash pop 	//拉取最新的暂存区同时删除对应的stash list
    git stash apply	//不删除对应的stash list
    
    # 删除多的list
    git stash drop	//删除最新的list
    git stash claer	//清除全部的stash
    
  • 指定stash list

    # git stash list
    
    # git stash xxxx stash@{x}
    

Git-patch 打包/应用

  • 打包

    # 打包最近的一个log
    git format-patch -1
    # 打包最近的两个log
    git format-patch -2
    # 同理打包最近的n个log
    git format-patch -n
    
    # 打包n1、n2版本间的patch
    git format-patch -n1 -n2
    
    # 打包从根到指定log的所有patch
    git format-patch --root 6a99bdd14b66de695519cca7a72d9b652e9bfdc7
    
    # 将patch输出到指定文件
    git format-patch xxx --stdout > xxx.patch ==> git format-patch -4 --stdout > 1.patch
    
  • 应用

    # 合并指定log
    git am xxx.patch
    

Git-Fork/上传

  • Fork

    git clone xxxx(ssh)
    
  • 上传自己本地仓库

    rm -r .git //删除原有git信息
    git init
    git add .
    git commit -m "xxxx"
    //提前在git官网新建repository
    git remote add origin 远程库地址(如:git push --set-upstream origin master)  
    git push --set-upstream origin master
    

gitignore

  • 忽视如out等文件 --- 在.git同目录下

    touch .gitignore //生成gitignore文件
    vim .gitignore   //改下需要忽略的文件
    
    .gitignore 文件本身可以忽略
    
  • 权限引起的git status未显示变化,但是vscode等ide显示changes --- 忽略权限即可

    项目修改:git config core.filemode false
    全局修改:git config --global core.filemode false
    

Git/Gerrit/Repo-error

  • error: failed to push some refs to

    # 本质是第一次提交缺失Readme文件,第一次初始提交问题,按照出错提示即可
    example:
    gitdir=$(git rev-parse --git-dir); scp -p -P 29418 xxxx@10.110.1.100:hooks/commit-msg ${gitdir}/hooks/
    git commit --amend --no-edit
    
  • invalid syntax 使用项目自带的repo即可:.repo/repo/repo syncu

    # 普通用户repo失效
    mkdir -p ~/.bin
    PATH="${HOME}/.bin:${PATH}"
    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
    chmod a+rx ~/.bin/repo
    
  • python版本错误

    //2.0/3.0 pyhton版本的老问题了
    # 查看当前默认python版本
    python --version
    
    # 查看python3位置
    whereis python3
    
    # 删除原有python2软链接
    rm /usr/bin/python
    
    # 链接3.x版本的软链接
    ln -s /usr/bin/python3.x /usr/bin/python
    
    # 重新检查当前python版本
    
  • git status未显示改动,但是VSCODE显示changes --- 文件权限导致changes提升 = =》忽视文件权限即可

    项目修改:git config core.filemode false
    全局修改:git config --global core.filemode false