repo 工具安装和使用教程(windows+gitee)

repo是什么

       官方的定义:Repo是谷歌用python脚本写的调用git的一个脚本,可以实现管理多个git库。

Android的源代码使用Repo 命令行工具来管理多个git仓库,大概有百多个。要想克隆和管理百多个 Git 仓库,不是一件简单的事情。Repo 命令行工具对 Git 部分命令如clone、pull,push,分支切换等众多命令和操作动作进行封装,将百多个 Git 库有效的进行组织。

Linux下安装Repo 

linux下的Repo安装稍简单些,兼容性较好。

curl http://android.git.kernel.org/repo >~/bin/repo

chmod a+x ~/bin/repo

export PATH=$PATH:~/bin

Windows下Repo安装

repo原本是谷歌搞的一个方便下载AOSP的工具基于git,但由于种种原因不能直接在Windows上使用,如果按照网上搜到的方法,安装会遇到不少问题。

repo安装失败

方法一(不成功):

mkdir ~/bin
curl https://raw.githubusercontent.com/esrlabs/git-repo/stable/repo > ~/bin/repo
curl https://raw.githubusercontent.com/esrlabs/git-repo/stable/repo.cmd > ~/bin/repo.cmd
chmod a+rx ~/bin/repo

方法二(不成功):使用的是国内清华镜像

mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo

下载完整的Repo文件:

git clone https://mirrors.tuna.tsinghua.edu.cn/git/git-repo

 方法三(不成功):

打开github上的git-repo仓库,把仓库代码clone或者zip包下载下来:

https://github.com/esrlabs/git-repo

 下载后的目录路径添加至环境变量,使用bash命令查看版本:

repo --version  是可以查看成功的;

但是使用repo init -u 功能就各种报错了:

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-10.0.0_r25

 

repo成功安装步骤

使用的是gitee网站的repo开源代码,步骤如下:

1.打开git bash,创建一个环境路径(并把该路径加到windows的环境变量中去):

mkdir ~/bin

2.配置环境变量

通过命令:curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > ~/bin/repo;下载引导脚本生产引导文件repo;该文件放置C:\Users\ZPC18-121\bin,所以环境变量是该路径;

3.Repo 引导命令安装:

(1)执行如下引导命令:

# python3 版本向下兼容,注意这里应该下载是 repo-py3,而不是 repo
# PS: 这里下载的 repo 只是一个引导脚本,需要后续 repo init 后才有完整功能
curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > ~/bin/repo
# 赋予脚本可执行权限
chmod a+x ~/bin/repo

 

(2)查看源码的方法(可以克隆到其它路径查看源码,不然和引导文件名冲突了)

git clone https://gitee.com/oschina/repo.git

 

源码也有repo-py3(实测是不能直接使用的,还是要使用:curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/ 的方式生产引导文件)

 

4. 测试repo 是否下载配置成功:

命令:repo --version

 

5.安装 requests 依赖

# 安装 requests 依赖,如果跳过这一步,后续执行命令时会自动提示安装(不安装repo init会有问题)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

到此,repo工具安装配置成功!!!

项目清单库 manifest创建

1.创建名为 manifest 的仓库(该仓库用于Repo 初始化与所有要管理的git仓库初次同步),并在仓库中创建一个 default.xml 文件作为 repo 初始化的依据 ;default.xml文件用例:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote  name="gitee"
           fetch="git@gitee.com:{namespace}"
           autodotgit="true" /> <!--fetch=".." 代表使用 repo init -u 指定的相对路径 也可用完整路径,example:https://gitee.com/MarineJ/manifest_example/blob/master/default.xml-->
  <default revision="master"
           remote="gitee" /><!--revision 为默认的拉取分支,后续提 pr 也以 revision 为默认目标分支-->

  <project path="repo_test1" name="repo_test1" />  <!--git@gitee.com:{namespace}/{name}.git name 与 clone 的 url 相关-->
  <project path="repo_test2" name="repo_test2" />
</manifest>

以下为 repo init 初始化命令, 需要用 -u 参数来指定 manifest 的远程仓库地址:

repo init -u git@gitee.com:{namespace}/manifest.git

如我配置的manifest仓库及default.xml内容是:

【1】意思1:我的git服务器是地址是:"https://gitee.com/monkeyqiyu"

【2】意思2:通过 manifest 的git仓库:https://gitee.com/monkeyqiyu/manifest.git 中的default.xml引导文件来管理同服务器的两个git仓库(可以继续按格式添加其它名字的仓库):

https://gitee.com/monkeyqiyu/git_test.git

https://gitee.com/monkeyqiyu/git_test1.git

default.xml内容:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote  name="gitee"
           fetch="https://gitee.com/monkeyqiyu"
           autodotgit="true" /> <!--fetch=".." 代表使用 repo init -u 指定的相对路径 也可用完整路径,example:https://gitee.com/MarineJ/manifest_example/blob/master/default.xml-->
  <default revision="master"
           remote="gitee" /><!--revision 为默认的拉取分支,后续提 pr 也以 revision 为默认目标分支-->

  <project path="git_test" name="git_test" />  <!--git@gitee.com:{namespace}/{name}.git name 与 clone 的 url 相关-->
  <project path="git_test1" name="git_test1" />
</manifest>

先remote部分:

fetch是服务器地址,可以用“..”来代替;name是默认的remote name,就是git push origin里面那个origin;review是gerrit地址 (这点是我猜的,不确定)

name: 远程git服务器的名字,直接用于git fetch, git remote 等操作
alias: 远程git服务器的别名,如果指定了,则会覆盖name的设定。在一个manifest(可以理解为default.xml)中, name不能重名,但alias可以重名。
fetch: 所有projects的git URL 前缀
review: 指定Gerrit的服务器名,用于repo upload操作。如果没有指定,则repo upload没有效果。

default部分:

里面定义了默认的remote和revision。revision是指下载下来的代码要checkout到哪个revision上,这里的revision可以是commit id、branch name、tag name,反正本质上都是commit id。default.xml中通常用branch name做revision。而commit id和tag name就是固定的某个commit了。

default 元素中指定的属性:

revision:Git 分支的名字。如果 project 元素没有指定 revision 属性,那么就使用 default 元素的该属性。revision 属性的值可以是一个 git branch,git tag,也可以是一个 commit id。
sync-j:sync 的时候,并行工作的任务数。
sync-c:如果设置为 true,则在同步代码的时候,将只会同步 project 元素中 revision 属性中指定的分支。如果 project 元素没有指定 revision 属性,则使用 default 元素的 revision 属性。
sync_s: 如果设置为true,则会同步git的子项目
remote: 之前定义的某一个remote元素中name属性值,用于指定使用哪一个远程git服务器。

project部分:

这部分定义了整包代码由哪些git组成。name是git在服务器上的相对路径,path是把代码下载下来后在本地的相对路径,path是可以省略的,如果省略那么就认为path和name一样;

经常使用的属性:

name: 唯一的名字标识project,同时也用于生成git仓库的URL。格式如下:
r e m o t e f e t c h / {remote_fetch}/ remotef​etch/{project_name}.git
path:可选的路径,该 指定git clone出来的代码存放在本地的子目录。如果没有指定,则以name作为子目录名。
remote: 指定之前在某个remote元素中的name。
revision:指定需要获取的git提交点,可以是master, refs/heads/master, tag或者SHA-1值。如果不设置的话,默认下载当前project,当前分支上的最新代码。
sync_c: 如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容。
sync_s: 如果设置为true,则会同步git的子项目。
groups: 列出project所属的组,以空格或者逗号分隔多个组名。
upstream: 在哪个git分支可以找到一个SHA1。用于同步revision锁定的manifest(-c 模式)。该模式可以避免同步整个ref空间。
annotation: 可以有多个annotation,格式为name-value pair。在repo forall 命令中这些值会导入到环境变量中。
remove-project: 从内部的manifest表中删除指定的project。经常用于本地的manifest文件,用户可以替换一个project的定义

git服务器的manifest仓库:

 Repo 初始化与仓库初次同步

通过repo拉取多个仓库到本地

1.创建一个本地文件夹作为工程目录,并进入该目录,执行repo初始化和仓库初次同步

mkdir your_project && cd your_project
repo init -u git@gitee.com:{namespace}/manifest.git
repo sync

执行:

mkdir myrepo&& cd myrepo

repo init -u https://gitee.com/monkeyqiyu/manifest.git

repo sync

提示报错需要管理员权限:

bash安装路径在:C:\Program Files\Git\bin

  关闭bash,让后用管理员权限打开git bash,进入工程目录再次执行命令:

repo init -u https://gitee.com/monkeyqiyu/manifest.git

然后执行同步,即可拉取要管理的git 仓库:

repo sync

 

project path创建本地工程结构

正常设计是多个git仓库,组成一个大的可以编译的总工程。

1.修改上面的default.xml,如下,其中wifi_sdk可以视为总的工程顶层目录,下面的app,driver层通过子仓库分别管理代码;可以通过repo命令一次性拉取各个子仓库代码到本地。

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote  name="gitee"
           fetch="https://gitee.com/monkeyqiyu"
           autodotgit="true" /> <!--fetch=".." 代表使用 repo init -u 指定的相对路径 也可用完整路径,example:https://gitee.com/MarineJ/manifest_example/blob/master/default.xml-->
  <default revision="master"
           remote="gitee" /><!--revision 为默认的拉取分支,后续提 pr 也以 revision 为默认目标分支-->

  <project path="wifi_sdk" name="git_test" />  <!--git@gitee.com:{namespace}/{name}.git name 与 clone 的 url 相关-->
  <project path="wifi_sdk/app" name="git_demo" />
  <project path="wifi_sdk/driver" name="git_test1" />
</manifest>

2. 执行:

mkdir remo_test && cd repo_test

repo init -u https://gitee.com/monkeyqiyu/manifest.git

repo sync

 拉取的目录层级结构变为:

 

可见default.xml的project部分:name是git在服务器上的相对路径,path是把代码下载下来后在本地的相对路径,path是可以省略的,如果省略那么就认为path和name一样!

项目清单库介绍

repo脚本库(.repo/repo)

repo对git命令进行了封装,提供了一套repo的命令集(包括init, sync等),所有repo管理的自动化实现也都包含在这个git库中。 在第一次初始化的时候,repo会从远程把这个git库下载到本地。

仓库目录和工作目录

仓库目录保存的是历史信息和修改记录,工作目录保存的是当前版本的信息。一般来说,一个项目的Git仓库目录(默认为.git目录)是位于工作目录下面的,但是Git支持将一个项目的Git仓库目录和工作目录分开来存放。 对于repo管理而言,既有分开存放,也有位于工作目录存放的:

  • manifests: 仓库目录有两份拷贝,一份位于工作目录(.repo/manifests)的.git目录下,另一份独立存放于.repo/manifests.git
  • repo:仓库目录位于工作目录(.repo/repo)的.git目录下,repo的源码,这个仓库我们不用管。
  • project:所有被管理git库的仓库目录都是分开存放的,位于.repo/projects目录下。同时,也会保留工作目录的.git,但里面所有的文件都是到.repo的链接。这样,即做到了分开存放,也兼容了在工作目录下的所有git命令

既然.repo目录下保存了项目的所有信息,所有要拷贝一个项目时,只是需要拷贝这个目录就可以了。repo支持从本地已有的.repo中恢复原有的项目。

➤➤➤ tree -L 1
.
├── manifests
├── manifests.git
├── manifest.xml -> manifests/default.xml
├── project.list
├── projects
└── repo

4 directories, 2 files

当执行 repo init 命令来初始化仓库的时候首先执行的就是 Repo 的引导脚本,该脚本会到我们指定的地方去下载 Manifest 仓库,以及 Repo 命令主体部分。下载好之后就放在当前目录下面的**.repo**目录下,其中:

文件夹  用途
manifests清单文件的仓库
manifests.git 清单文件的 Git 裸仓库,不带工作区
manifest.xml  这是一个链接文件,指向你的用于初始化工作区的清单文件,即manifests/default.xml
project.list 一个文本文件,里面包含所有项目名字的列表
projects该文件夹下包含所有 git project 的裸仓库,文件夹的层次结构跟工作区的布局一样
repo 这是 repo 命令的主体,其中也包含最新的 repo 命令,推荐使用这里面的 repo 命令

repo常见命令使用

命令格式和使用流程

1. repo命令的使用格式如下所示

$ repo <COMMAND> <OPTIONS>

 命令格式使用和说明:

(1)repo init (下载repo并克隆manifest)

格式:

repo init –u URL [OPTIONS]

示例:

repo init  -u git://172.16.1.31/manifest.git

repo  init  -u git://172.16.1.31/manifest.git –m android.xml
选择的是android.xml里面的配置,.repo/manifest.xml便指向.repo/manifests/android.xml

解释:

Options:

1.  -u:指定一个URL,其连接到一个maniest仓库
2.   -m:在manifest仓库中选择一个xml文件
3.   -b:选择一个maniest仓库中的一个特殊的分支
命令repo init 要完成如下操作:
1.     完成repo工具的完整下载,执行的repo脚本只是引导程序
2.    克隆清单库manifest.git (地址来自于-u 参数)
3.  克隆的清单库位于manifest.git中,克隆到本地.repo/manifests.清单.repo/manifest.xml只是符号链接,它指向.repo/manifests/default.xml
4.   如果manifests中有多个xml文件,repo init 可以任意选择其中一个,默认选择是default.xml

(2)repo sync(下载代码)

格式:

repo sync [<project>…]

示例:

repo sync

repo sync platform/build    选择克隆其中的一个项目:

解释:

用于参照清单文件.repo/manifest.xml克隆并同步版本库。如果某个项目版本库尚不存在,则执行repo sync 命令相当于执行git clone,如果项目版本库已经存在,则相当于执行下面的两条指令:

 git remote update           相当于对每一个remote源执行了fetch操作
git rebase origin/branch   针对当前分支的跟踪分支执行rebase操作。

(3)repo start(创建并切换分支)

格式:

repo start  <newbranchname> [--all | <project>…]

示例:

repo start  stable  --all

假设清单文件中设定的分支是gingerbread-exdroid-stable,那么执行以上指令就是对所有项目,在gingerbread-exdroid-stable的基础上创建特性分支stable。

repo start  stable  platform/build platform/bionic
假设清单文件中设定的分支是gingerbread-exdroid-stable,那么执行以上指令就是对platform/build、platform/bionic项目,在gingerbread-exdroid-stable的基础上创建特性分支stable

解释:

    刚克隆下来的代码是没有分支的,repo start实际是对git checkout –b 命令的封装。为指定的项目或所有项目(若使用—all参数),以清单文件中为设定的分支,创建特性分支。这条指令与git checkout –b 还是有很大的区别的,git checkout –b 是在当前所在的分支的基础上创建特性分支,而repo start是在清单文件设定分支的基础上创建特性分支。

(4)repo checkout(切换分支)

格式:

repo checkout <branchname>  [<project>…]

示例:

repo checkout crane-dev 
repo checkout crane-dev  platform/build  platform/bionic

解释:

实际上是对git checkout 命令的封装,但不能带-b参数,所以不能用此命令来创建特性分支。

(5)repo branches(查看分支)

格式:

repo branches [<project>…]

示例:

repo branches 
repo branches platform/build platform/bionic

(6)repo diff(查看工作区文件差异)

格式:

repo diff [<project>…]    ;实际是对git diff 命令的封装,用于分别显示各个项目工作区下的文件差异。

示例:

repo diff                            ---查看所有项目
repo diff platform/build platform/bionic  ---只查看其中两个项目

(7)repo stage(把文件添加到index表中)

格式:

repo stage -i [<project>…]   ; 实际是对git add --interactive命令的封装、用于挑选各个项目工作区中的改动以加入暂存区。    -i代表git add --interactive命令中的--interactive,给出个界面供用户选

示例:

repo diff                            ---查看所有项目
repo diff platform/build platform/bionic  ---只查看其中两个项目

(8)其它

repo status(查看文件状态)
实际上是对git diff-index、git diff-filse命令的封装,同时显示暂存区的状态和本地文件修改的状态
$repo/repo status platform/bionic

repo abandon(删除指定分支)
   实际上是对git branch –D 命令的封装,用法如下:
repo abandon <branchname> [<project>…]

repo prune(删除已经合并分支)
   实际上是对git branch –d命令的封装,该命令用于扫面项目的各个分支,并删除已经合并的分支,用法如下:
repo prune [<project>…]

2. 项目开发流程是:

  1. repo init初始化工程,指定待下载的分支
  2. repo sync下载代码
  3. repo start将本地git库切换到开发分支(TOPIC BRANCH)
  4. 在本地进行修改,验证后,提交到本地
  5. repo upload上传到服务器,等待review

Repo + Gitee 本地开发流程

repo start {branch} --all # 切换开发分支,当对部分仓库进行指定时,会触发仓库的预先fork
repo forall -c git add ./ git add / repo stage  # 批量加入暂存区或者单独加入
repo forall -c git commit / git commit  # 批量进行提交或者单独提交
repo config --global repo.token {TOKEN} # 进行 gitee access_token 配置, access_token 获取连接 https://gitee.com/profile/personal_access_tokens
repo config repo.pullrequest {True/False} # 对是否触发PR进行配置
repo push --br={BRANCH} --d={DEST_BRANCH}  # 进行推送并生成PR和审查,执行后会展示出可进行推送的项目,去掉注释的分支会进行后续推送
repo gitee-pr --br={BRANCH} # 获取项目推送后的指定分支的PR列表

3.常用命令和开发流程命令执行

1.repo常用命令

1.repo init –u URL [OPTIONS] //检出清单版本库
    options:
        -u:指定一个URL,其连接到一个maniest仓库
        -m:在manifest仓库中选择一个xml文件
        -b:选择一个maniest仓库中的一个特殊的分支
    例:repo init -u 172.16.16.121:manifest -b msm8909 -m qcom_msm8909.xml
2.repo sync //同步版本库,如果版本库不存在,则相当于执行git clone;

如果版本库已经存在,则相当于执行:
git remote update   #对每个remote源进行fetch操作
git rebase/origin/branch   #针对当前分支的跟踪分支进行rebase操作


3.repo start  <newbranchname> [--all | <project>…]  //创建并切换分支。刚克隆下来的代码是没有分支的,repo start实际是对git checkout -b命令的封装。
4.repo checkout     //切换分支,但不能带-b参数,所以不能用此命令来创建特性分支。
5.repo branches     //查看分支
6.repo diff         //查看工作区文件差异  repo diff platform/build platform/bionic  ---只查看其中两个项目
7.repo stage        //把文件添加到index表中
8.repo status       //查看文件状态

9. repo forall -p -c git merge topic 把所有项目都切换到master分支,执行上述指令将topic分支合并到master分支。加上-p选项,会在输出每个项目的命令之前显示该项目的头部信息,这有助于你更好地理解每个项目正在执行的操作‌

2.repo常用操作流程

    repo init -u gitserver:manifests.git -m xxx.xml (xxx.xml文件决定初始化的项目)
    repo sync
    repo start xxx --all //创建xxx项目对应的分支 (--all意为将所有模块都归为当前xxx分支下)
    git add xxx
    git commit -m "xxx"
    repo upload

3.repo切换分支

    cd .repo/manifests
    ls //查看xxx.xml文件
    cd .. //回到上级目录
    ln -s  manifest.xml manifests/QK_CM298_EXER.xml //更换manifest.xml的软连接
    cd ..
    repo sync //同步代码
    repo start xxx--all//建立本地分支

 4. 其它

repo upload  上传本地提交至服务器(仅是上传到gerrit,还需要进行review后才会在代码库中体现);类似git push,但是使用repo upload需要搭建gerrit环境,并且在manifest文件remote元素中添加review属性
repo push <remotename> [--all |<project>…]   向服务器提交代码,repo会自己查询需要向服务器提交的项目并提示用户


repo forall –p –c git merge topic 把所有项目多切换到master分支,执行以下指令将topic分支合并到master分支

repo forall  [<project>...] –c git tag crane-stable-1.6 为单个项目下打标签

repo forall –c git tag crane-stable-1.6  在所有项目下打标签

repo list   查看本地repo管理的所有projects

repo selfupdate   repo自身的更新

repo prune [<project>...]  删除已经合并分支。实际上是对git branch -d 命令的封装,该命令用于扫描项目的各个分支,并删除已经合并的分支

repo abandon <branchname> [<rpoject>...] 删除指定分支。实际是对git brance -D命令的封装

repo forall [<project>...] -c <command>

-c 后面所带的参数是shell指令,即执行命令和参数
-p 在shell指令输出之前列出项目名称,即在指定命令的输出前显示项目标题;加上-p选项,会在输出每个项目的命令之前显示该项目的头部信息,这有助于你更好地理解每个项目正在执行的操。如repo forall -p -c "git checkout branch_name"
-v 列出执行shell指令输出的错误信息,即显示命令写到 sterr 的信息。

附加环境变量:
REPO_PROJECT 指定项目的名称
REPO_PATH 指定项目在工作区的相对路径
REPO_REMOTE 指定项目远程仓库的名称
REPO_LREV 指定项目最后一次提交服务器仓库对应的哈希值
REPO_RREV 指定项目在克隆时的指定分支,manifest里的revision属性

如:
repo forall -c 'echo $REPO_PROJECT'
repo forall -c 'echo $REPO_PATH'

4. 以下列表整理了常用命令,结尾会有详细的命令以供查询:

repo init: 初始化 repo 工具

    -u URL: 指定上游 manifest 的 Git 仓库 URL
    -m NAME: 指定 manifest 文件
    -b NAME: 指定分支名称
    -q: 安静模式,减少输出信息

repo sync: 同步所有项目到最新的修订版本

    -d: 切换到 manifest 中指定的修订版本
    -f: 强制同步,即使有错误也会继续
    -p: 只同步项目中已存在的分支
    -s: 同步到清单服务器指定的稳定修订版本

repo upload: 上传提交到 Gerrit 代码审查系统

    -a: 上传所有可上传的提交
    -c: 上传特定更改
    -j: 允许在上传过程中跳过钩子

repo diff: 显示本地更改与最后一次同步的远程分支的差异
repo download: 从 Gerrit 下载指定的更改
repo forall: 在所有项目或指定的项目上执行命令

    -c CMD: 在每个项目上执行 CMD 命令
    -e: 如果命令失败,则继续执行下一个项目
    -p: 打印项目名称

repo prune: 移除已合并的主题分支
repo status: 显示当前工作目录的状态
repo start: 从 manifest 中指定的修订版本开始一个新的主题分支

    -b NAME: 使用 NAME 作为新分支的名称

repo abandon: 放弃一个正在进行的主题分支
repo branch: 显示或创建分支
repo help: 显示帮助信息或特定命令的帮助

    <COMMAND>: 显示特定命令的帮助信息

命令选项附录
指令共有选项

    -h, --help: 显示帮助信息并退出
    -v, --verbose: 显示所有输出
    -q, --quiet: 仅显示错误

平行作业选项

    -j JOBS, --jobs=JOBS: 并行运行作业的数量(默认值根据命令和CPU核心数变化)

多清单选项

    --outer-manifest: 从最外层清单开始操作
    --no-outer-manifest: 不对外部清单进行操作
    --this-manifest-only: 仅对此(子)清单进行操作
    --no-this-manifest-only, --all-manifests: 对此清单及其子清单进行操作

repo init 特有选项

    -u URL, --manifest-url=URL: 指定清单代码库的 URL
    -b REVISION, --manifest-branch=REVISION: 指定清单分支或修订版本
    -m NAME.xml, --manifest-name=NAME.xml: 选择清单文件
    -g GROUP, --groups=GROUP: 限制清单项目到指定组
    -p PLATFORM, --platform=PLATFORM: 限制清单项目到指定平台组

repo sync 特有选项

    -f, --force-sync: 覆盖需要时的不同对象目录
    --force-checkout: 强制检出,可能丢弃未提交更改
    --force-remove-dirty: 强制删除具有未提交更改的项目

repo upload 特有选项

repo upload [--re --cc] [<project>]...: 上传更改到代码审查系统

    -t, --topic-branch: 将主题设置为本地分支名称
    --topic=TOPIC: 设置更改的主题
    --re=REVIEWERS, --reviewers=REVIEWERS: 请求这些人审查
    --cc=CC: 同时向这些电子邮件地址发送电子邮件
    -w, --wip: 将更改作为进行中的工作上传

repo diff 特有选项

- `-u, --absolute`: 生成的 diff 输出中文件路径相对于仓库根目录

repo download 特有选项

- `-b BRANCH, --branch=BRANCH`: 首先创建一个新的分支
- `-c, --cherry-pick`: 执行 Cherry-pick 而不是检出

repo forall 特有选项

- `-r, --regex`: 根据正则或通配符表达式在项目上执行命令
- `-i, --inverse-regex`: 根据反向正则或通配符表达式在项目上执行命令
- `-g GROUPS, --groups=GROUPS`: 仅在与指定组匹配的项目上执行命令
- `-c, --command`: 要执行的命令(及参数)

repo prune 特有选项

此命令没有特有选项,只包含共有选项和多清单选项
repo status 特有选项

- `-o, --orphans`: 包括工作目录中 repo 项目之外的对象

repo start 特有选项

- `--all`: 在所有项目中开始新分支
- `-r REVISION, --rev=REVISION, --revision=REVISION`: 指定起始修订版本
- `--head, --HEAD`: 使用 HEAD 作为起始修订版本

repo abandon 特有选项

- `--all`: 删除所有分支

repo branch 特有选项

此命令没有特有选项,只包含共有选项
repo help 特有选项

此命令没有特有选项,只包含共有选项,并且用于显示其他命令的帮助信

实用命令介绍

1.下载代码

# repo sync相当于git clone会把repository中的所有内容拷贝到本地,非首次运行repo sync相当于更新和合并.
# repo sync会更新.repo下面的文件,如果在merge的过程中出现冲突,这需要手动运行git rebase --continue.

repo init -u manifest仓库地址 -b branch_name
repo sync # 检出所有分支代码,如果只想检出当前分支代码可以使用“repo sync -c”命令

repo start master --all # 创建新分支

2.分支操作

repo branch # 查看分支
repo abandon <branch_name>  # 删除不用的本地分支

repo abandon master # 放弃master分支

3.在每个仓库下执行shell命令

repo forall -c 'commands' #在每个仓库下执行命令,比如:repo forall -c 'pwd && git pull'

命令示例:

repo forall -c 'pwd && git checkout -t sunniwell/develop'  # 在每个git仓库下常见本地develop分支来跟踪远程develop分
repo forall -c 'pwd && git pull'  # 更新所有git仓库

repo forall -c pwd  查看所有本地git仓库的绝对路径!

4.查看最近更新的仓库

repo forall -cp 'git log --since="2017-02-23" --until="2017-02-26" --oneline --pretty="%ci|%s|%h"'

5.版本根据日期回退

repo forall -c 'commitID=`git log --before "2017-03-17 07:00" -1 --pretty=format:"%H"`; git reset --hard $commitID'

其它命令:

repo init -u ssh://xxx/manifest

ssh://xxx/manifest 是一个git仓库,这个仓库有1个xml文件,这个文件记录了要管理的git仓库路径

repo sync     #clone所有git仓库

repo start master --all  //所有git仓库创建master分支

 repo forall –c git xxx      #对所有git仓库执行git命令

repo sync #(除非明确让你用,否则不要用) 更新所有仓库的代码

repo forall –c git pull --rebase

#提交所有仓库的commit到远程服务器

repo upload (不稳定,有时处理不了中文)

repo forall –c git push origin HEAD:refs/for/master

repo命令等同git命令备注
repo init -u初始化
repo syncgit pull同步代码
repo uploadgit push上传代码
repo forall多仓
repo startgit checkout -b创建并切换分支
repo checkoutgit checkout切换分支
repo statusgit status状态查询
repo branchesgit branch分支查询
repo diffgit diff文件对比
repo prune删除合并分支
repo stage –igit add --interactive添加文件到暂存区
repo abandongit branch -D删除分支
repo version查看版本号

多仓执行且分支
repo forall -c "git checkout xxx"
repo forall -c "git branch -D yyy"
repo forall -c "git checkout xxx"
repo forall -c "git status"

repo status
repo status -i "指定目录下.git仓库"

repo 代码库全部回滚到某一日期 

 repo forall -c 'commitID=$(git log --before "2024-06-24 24:00" -1 --pretty=format:"%H") && git reset --hard  $commitID'

repo 查看清单库分支

在使用repo工具时,如果你想查看清单库(manifest repository)的分支,你可以按照以下步骤操作:

  1. 确定你当前所在的清单库目录。

  2. 使用git branch命令查看当前分支。

  3. 使用git branch -r查看远程跟踪分支。

  4. 使用git branch -a查看所有分支(包括本地和远程)。

cd .repo/manifests  # 进入清单库目录
git branch  # 查看当前分支
git branch -r  # 查看远程跟踪分支
git branch -a  # 查看所有分支

repo 拉取清单库分支:

# 更新repo工具
repo init -u <清单库URL> -b <分支名>
 
# 同步代码库
repo sync 

常用git命令

分支命令:

查看
1.查看本地分支
git branch
2.查看远程分支
git branch -r

git remote -v #  参看远程仓库

git branch -vv # 查看当前git分支所属


3.查看所有分支
git branch -a
创建分支
1.创建本地分支
git branch dev  ;新建并切换分支   git checkout -b 分支名
2.切换到新创建的分支
git checkout dev
3.将新分支push到github
git push origin dev


删除本地分支:
git branch -d 【分支名称】(分支被合并后才允许删除)(-D 强制删除)

删除远程分支:

git branch   -r  -d  origin/branch-name

git push origin:branch-name

合并某分支到当前分支:
git merge 【分支名称】

 如果远程新建了一个分支,本地没有该分支

可以利用 git checkout --track origin/branch_name ,这时本地会新建一个分支名叫 branch_name ,会自动跟踪远程的同名分支 branch_name。

git checkout --track origin/branch_name

如果本地新建了一个分支 branch_name,但是在远程没有

这时候 push 和 pull 指令就无法确定该跟踪谁,一般来说我们都会使其跟踪远程同名分支,所以可以利用 git push --set-upstream origin branch_name ,这样就可以自动在远程创建一个 branch_name 分支,然后本地分支会 track 该分支。后面再对该分支使用 push 和 pull 就自动同步。

git push --set-upstream origin branch_name

提交删除:

如果你本地新增或者修改的文件没有被git 监管到,或者想提交被忽略的文件  可以使用git add -f 文件  进行强制提交
git add -A  提交所有变化
git add -u  提交被修改和被删除文件,不包括新文件
git add .    提交新文件和被修改文件,不包括被删除文件

对修改的文件进行强制删除 可以用git rm -r -f 文件

1.git diff方法
git diff > name.patch 生成patch
git diff --cached > name.patch
git diff branch-name --cached > name.patch
git apply name.patch 应用patch

2.git format-patch
git format-patch -M master 生成patch
git am ***.patch 应用patch
 

repo案列使用说明

1. repo 类似一个脚本,拉取所有子仓库到本地;根据default.xml组成一个可以编译的工程

2. default.xml单独存在于一个仓库;用这个仓库脚本批量管理操作其它仓库。这个仓库也是可以有分支的,拉取分:repo init -u <清单库URL> -b <分支名>

3. 可以单独克隆repo 中default.xml管理的仓库:git clone ssh://mengqiyu@192.168.8.212:29418/wifisdk/cpu.git;(.git后缀可以不用也能克隆)按单个仓库执行提交和拉取代码等操作即可;

其中,remote部分的fetch是所有projects的git URL 前缀,加上project部分的name组成URL,即:f​etch/{name}.git

4. repo拉取仓库后,可以进去进入各个仓库路径;单独操作该仓库git命令(不需要repo前缀)

5.可以进入各个仓库切换分支,然后通过repo branches可以显示对应仓库的分支情况

➤➤➤ repo branches
*  702sdk                    | in wifi_sdk/cpu
*  stable                    | in all projects
   wifi_vd                   | in all projects

6.  repo start 和仓库分支名称关系

命令:

repo init -u gitosis@XXXXroid.git.xxxxxxxxxx.com.cn:android/platform/manifest.git -b XXXXroid4.1 --repo-url=gitosis@XXXXroid.git.xxxxxxxxxx.com.cn:tools/repo.git

说明:

(1)上面这个命令在repo init 的时候选择了manifest.xml的分支为XXXXroid4.1。但这并不能保证在你repo sync 过后,接下来可以将所有的仓库全部切换到XXXXroid4.1分支。因为并不是每个仓库都有这个分支!!!!

(2)容易犯的错误,认为所有的仓库都有同样个数的对应名字的分支!所以我每次在repo sync完成后总是喜欢用如下命令,来基于manifest.xml文件遍历所有的仓库,将分支切换到同一个。
git checkout --track remotes/korg/XXXXroid4.1 -b XXXXroid4.1 

这样容易问题。原因就是有的仓库在远程根本就没有你要的分支。也就是:不是每个仓库都需要切换到同样的分支名。

(3)对于一个工程而言,repo允许它的每个仓库所跟踪的远程仓库的分支名不完全统一!至于一个仓库到底在一个工程中使用那个对应的分支,在manifest.xml中会去指定!

看一个manifest.xml的例子:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>

  <remote  name="korg"
           fetch="gitosis@XXXXroid.git.xxxxxxxxxx.com.cn:android/"
           review="review.source.xxxxxxxxxx.com/gerrit/" />
  <default revision="XXXXroid4.1"    这里指定默认的分支名
           remote="korg"
           sync-j="4" />

  <project path="build" name="platform/build" >  
    <copyfile src="core/root.mk" dest="Makefile" />
  </project>
  <project path="abi/cpp" name="platform/abi/cpp" />
  <project path="bionic" name="platform/bionic" />
  <project path="bootable/bootloader/legacy" name="platform/bootable/bootloader/legacy" />
  <project path="bootable/diskinstaller" name="platform/bootable/diskinstaller" />
  <project path="bootable/recovery" name="platform/bootable/recovery" />
  <project path="cts" name="platform/cts" />

以上几个工程都是一致的:path指定本地仓库位置,name指定远程的仓库位置,本地仓库将默认跟踪远程的XXXXroid4.1分支。

再来看几个:(和上面的出自同一个manifest.xml中):

  <project path="packages/apps/10086cn" name="platform/packages/apps/10086cn" revision="XXXXroid_own_copyright" />
  <project path="packages/apps/AppBackup" name="platform/packages/apps/AppBackup" revision="XXXXroid_own_copyright" />
  <project path="packages/apps/AudioProfile" name="platform/packages/apps/AudioProfile" revision="XXXXroid_own_copyright" />
  <project path="packages/apps/Monternet" name="platform/packages/apps/Monternet" revision="XXXXroid_own_copyright" />
  <project path="packages/apps/MyFavorites" name="platform/packages/apps/MyFavorites" revision="XXXXroid_own_copyright" />
  <project path="packages/apps/XXXXNote" name="platform/packages/apps/XXXXNote" revision="XXXXroid_own_copyright" />
  <project path="packages/apps/ValidationTools" name="platform/packages/apps/ValidationTools" revision="XXXXroid_own_copyright" /> 

这几个工程除了指定name 和path外,还指定了revision。这个revision就是这些仓库在sync完成后的默认状态,即,跟踪的是远程仓库的XXXXroid_own_copyright分支。不指定就用最前面说的default分支名:XXXXroid4.1    指定了就用指定的。

可以通过如下命令拉取代码:
 

repo init -b XXXXroid4.1  将manifest切换到你要的分支
repo sync -j4 -q  同步代码

repo start local-0113 --all  基于manifest.xml创建分支

接下来用repo start来在每个仓库建立分支,并保证每个分支跟到远程的对应分支上,不要像我前面的用repo forall 来折腾了。我已经验证了,repo start真的可以根据manifest.xml中的信息来让本地分支跟到不同的远程分支!下面是我的验证。

进入具体的仓库目录查看config文件内容:

apuser@YaochuanLiubt:~/mywork/403-akm$ repo start local-0113 --all
Starting local-0113: 100% (248/248), done.  
apuser@YaochuanLiubt:~/mywork/403-akm$ cd kernel/
apuser@YaochuanLiubt:~/mywork/403-akm/kernel$ git branch
* local-0113
apuser@YaochuanLiubt:~/mywork/403-akm/kernel$ cat .git/config 
[core]
repositoryformatversion = 0
filemode = true
[remote "korg"]
url = gitosis@XXXXroid.git.xxxxxxxxxx.com.cn:android/kernel/common.git
review = review.source.xxxxxxxxxx.com/gerrit/
projectname = kernel/common
fetch = +refs/heads/*:refs/remotes/korg/*
[branch "local-0113"]
remote = korg
merge = XXXXroid4.0.3_vlx_3.0 /看,这里跟的是这个/ 
apuser@YaochuanLiubt:~/mywork/403-akm/packages/apps/10086cn$ git branch
* local-0113
apuser@YaochuanLiubt:~/mywork/403-akm/packages/apps/10086cn$ cat .git/config 
[core]
repositoryformatversion = 0
filemode = true
[remote "korg"]
url = gitosis@XXXXroid.git.xxxxxxxxxx.com.cn:android/platform/packages/apps/10086cn.git
review = review.source.xxxxxxxxxx.com/gerrit/
projectname = platform/packages/apps/10086cn
fetch = +refs/heads/*:refs/remotes/korg/*
[branch "local-0113"]
remote = korg
merge = XXXXroid_own_copyright /看,这里跟的是另一个!/
apuser@YaochuanLiubt:~/mywork/403-akm/packages/apps/10086cn$ 
apuser@YaochuanLiubt:~/mywork/403-akm/packages/apps/10086cn$

所以,以后就不要在用repo forall 这种方式来建立分支了! 

另外,在用git checkout --track remotes/korg/XXXXroid4.1 -b XXXXroid4.1 创建一个本地分支的时候,会指定其跟踪的远程分支,如果你在本地commit新的change后,执行git status时会显示你的本地分支和你所跟踪的远程分支在commit个数上的异同,但是如果用repo start搞的本地分支的话,虽然也是跟踪到了一个具体的远程分支,但是当我用git status的时候却不显示本地和远程的异同,这个不爽的很。因为我总有一种需要就是在工程的根目录执行repo forall -p -c git status来遍历整个工程的所有仓库,来找到我在那个本地仓库有提交。毕竟我针对一个问题的修改可能会涉及多个仓库。如果我不这么检查的话,可能在push的时候会忘记某个仓库的修改,从而导致服务器上的代码出现不完整。

问题处理

git status问题:

当clone到用户端的文件被更改权限后,git status会爆出很多modify
解决方法:更改.git\config文件中的filemode=true改为false

1) 查看filemode选项
git config --get core.filemode

git config core.filemode


2) 设置filemode选项
git config core.filemode true 

或 git config --add core.filemode true

或 git config --global core.fileMode false

repo 推送失败

在各个仓库子项了git add;git commit 命令后,或者执行下面命令后!

repo forall -c "pwd && git add -A && git commit -m "上传信息" "

 统一推送:repo upload (default.xml没有设置review);或者repo push 失败!这个不知道啥原因

正确的推送方法:

repo foralll -c push ;

或者

repoforalll -c git push -u origin master

repo forall –c git push origin HEAD:refs/for/master ;提交审核

git push -u

git push -u参数的作用是将本地分支与远程分支进行关联,并设置推送命令的默认主机。

具体来说,当你使用git push -u origin master命令时,Git会自动将本地的master分支与远程仓库origin上的master分支进行关联。这意味着,一旦关联成功,你就可以使用简化的git push命令来推送本地分支到远程分支,而不需要每次都指定远程分支名。此外,-u参数还会记录这个远程分支为默认的推送目标,这样在以后的推送操作中,你可以直接使用git push命令

使用场景和示例

  1. 首次推送‌:当你第一次将本地分支推送到远程仓库时,使用git push -u origin master可以自动创建远程分支,并设置默认推送目标。例如,将本地的master分支推送到远程仓库originmaster分支上‌。
  2. 简化后续操作‌:一旦设置了默认推送目标,你就可以使用简化的git push命令来推送本地分支到远程分支,而不需要每次都指定远程分支名。例如,后续只需使用git push命令即可将本地更改推送到远程仓库‌。

常见问题

  • 强制推送‌:如果你需要强制推送本地分支到远程分支,可以使用git push -f origin master命令。这通常用于解决冲突或删除远程分支中的某些提交‌1。
  • 删除远程分支‌:要删除远程分支,可以使用git push origin --delete master命令。这相当于推送一个空的本地分支到远程分

repo start区别

1.创建并且切换到新分支(两个以上分支不适用)
# repo start master --all
 
2.切换到已创建的master分支(通用)
# repo start --all master  
 等同于:
# repo forall -c git checkout master
 
# repo branch //查看分支是否切换成功

首先,你需要在 Jenkins 中创建一个新的构建任务。在任务配置中,你需要配置以下步骤: 1. 从 Gitee 仓库中拉取代码 2. 执行 Hyperf 项目的构建命令 3. 构建 Docker 镜像并上传至 Harbor 4. 在目标服务器上通过 Docker 运行镜像,启动 Hyperf 服务 以下是一个简单的 Jenkinsfile 示例: ``` pipeline { agent any stages { stage('Git Checkout') { steps { git 'https://gitee.com/yourusername/yourrepo.git' } } stage('Build') { steps { sh 'composer install' sh './bin/hyperf.php build' } } stage('Dockerize') { steps { sh 'docker build -t yourimage:latest .' withCredentials([usernamePassword(credentialsId: 'harbor-login', passwordVariable: 'HARBOR_PASSWORD', usernameVariable: 'HARBOR_USERNAME')]) { sh "docker login -u ${env.HARBOR_USERNAME} -p ${env.HARBOR_PASSWORD} harbor.yourdomain.com" } sh 'docker tag yourimage:latest harbor.yourdomain.com/yourproject/yourimage:latest' sh 'docker push harbor.yourdomain.com/yourproject/yourimage:latest' } } stage('Deploy') { steps { sh 'docker pull harbor.yourdomain.com/yourproject/yourimage:latest' sh 'docker stop yourcontainer || true' sh 'docker rm yourcontainer || true' sh 'docker run -d --name yourcontainer -p 80:80 harbor.yourdomain.com/yourproject/yourimage:latest' } } } } ``` 你需要根据自己的实际情况进行调整,并且需要在 Jenkins 中配置相关的参数凭据信息。同时,你还需要在服务器上安装 Docker Docker Compose,以便能够运行 Docker 镜像。 希望这能帮到你!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值