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

打印 上一主题 下一主题

主题 950|帖子 950|积分 2850

repo是什么

       官方的界说:Repo是谷歌用python脚本写的调用git的一个脚本,可以实现管理多个git库。
   Android的源代码利用Repo 命令行工具来管理多个git堆栈,大概有百多个。要想克隆和管理百多个 Git 堆栈,不是一件简单的事变。Repo 命令行工具对 Git 部分命令如clone、pull,push,分支切换等浩繁命令和操作动作进行封装,将百多个 Git 库有用的进行构造。
  Linux下安装Repo 

linux下的Repo安装稍简单些,兼容性较好。
  1. curl http://android.git.kernel.org/repo >~/bin/repo
  2. chmod a+x ~/bin/repo
  3. 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

方法二(不成功):利用的是国内清华镜像
  1. mkdir ~/bin
  2. PATH=~/bin:$PATH
  3. curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
  4. 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 功能就各种报错了:
  1. 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)实行如下引导命令:
  1. # python3 版本向下兼容,注意这里应该下载是 repo-py3,而不是 repo
  2. # PS: 这里下载的 repo 只是一个引导脚本,需要后续 repo init 后才有完整功能
  3. curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > ~/bin/repo
  4. # 赋予脚本可执行权限
  5. 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 依赖
  1. # 安装 requests 依赖,如果跳过这一步,后续执行命令时会自动提示安装(不安装repo init会有问题)
  2. pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
复制代码
到此,repo工具安装配置成功!!!

项目清单库 manifest创建

1.创建名为 manifest 的堆栈(该堆栈用于Repo 初始化与全部要管理的git堆栈初次同步),并在堆栈中创建一个 default.xml 文件作为 repo 初始化的依据 ;default.xml文件用例:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <manifest>
  3.   <remote  name="gitee"
  4.            fetch="git@gitee.com:{namespace}"
  5.            autodotgit="true" /> <!--fetch=".." 代表使用 repo init -u 指定的相对路径 也可用完整路径,example:https://gitee.com/MarineJ/manifest_example/blob/master/default.xml-->
  6.   <default revision="master"
  7.            remote="gitee" /><!--revision 为默认的拉取分支,后续提 pr 也以 revision 为默认目标分支-->
  8.   <project path="repo_test1" name="repo_test1" />  <!--git@gitee.com:{namespace}/{name}.git name 与 clone 的 url 相关-->
  9.   <project path="repo_test2" name="repo_test2" />
  10. </manifest>
复制代码
以下为 repo init 初始化命令, 需要用 -u 参数来指定 manifest 的远程堆栈地点:
  1. 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内容:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <manifest>
  3.   <remote  name="gitee"
  4.            fetch="https://gitee.com/monkeyqiyu"
  5.            autodotgit="true" /> <!--fetch=".." 代表使用 repo init -u 指定的相对路径 也可用完整路径,example:https://gitee.com/MarineJ/manifest_example/blob/master/default.xml-->
  6.   <default revision="master"
  7.            remote="gitee" /><!--revision 为默认的拉取分支,后续提 pr 也以 revision 为默认目标分支-->
  8.   <project path="git_test" name="git_test" />  <!--git@gitee.com:{namespace}/{name}.git name 与 clone 的 url 相关-->
  9.   <project path="git_test1" name="git_test1" />
  10. </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初始化和堆栈初次同步
  
  1. mkdir your_project && cd your_project
  2. repo init -u git@gitee.com:{namespace}/manifest.git
  3. 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命令一次性拉取各个子堆栈代码到当地。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <manifest>
  3.   <remote  name="gitee"
  4.            fetch="https://gitee.com/monkeyqiyu"
  5.            autodotgit="true" /> <!--fetch=".." 代表使用 repo init -u 指定的相对路径 也可用完整路径,example:https://gitee.com/MarineJ/manifest_example/blob/master/default.xml-->
  6.   <default revision="master"
  7.            remote="gitee" /><!--revision 为默认的拉取分支,后续提 pr 也以 revision 为默认目标分支-->
  8.   <project path="wifi_sdk" name="git_test" />  <!--git@gitee.com:{namespace}/{name}.git name 与 clone 的 url 相关-->
  9.   <project path="wifi_sdk/app" name="git_demo" />
  10.   <project path="wifi_sdk/driver" name="git_test1" />
  11. </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命令的利用格式如下所示
  1. $ 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. 项目开辟流程是:

  • repo init初始化工程,指定待下载的分支
  • repo sync下载代码
  • repo start将当地git库切换到开辟分支(TOPIC BRANCH)
  • 在当地进行修改,验证后,提交到当地
  • repo upload上传到服务器,等候review
Repo + Gitee 当地开辟流程
  
  1. repo start {branch} --all # 切换开发分支,当对部分仓库进行指定时,会触发仓库的预先fork
  2. repo forall -c git add ./ git add / repo stage  # 批量加入暂存区或者单独加入
  3. repo forall -c git commit / git commit  # 批量进行提交或者单独提交
  4. repo config --global repo.token {TOKEN} # 进行 gitee access_token 配置, access_token 获取连接 https://gitee.com/profile/personal_access_tokens
  5. repo config repo.pullrequest {True/False} # 对是否触发PR进行配置
  6. repo push --br={BRANCH} --d={DEST_BRANCH}  # 进行推送并生成PR和审查,执行后会展示出可进行推送的项目,去掉注释的分支会进行后续推送
  7. 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 代码库全部回滚到某一日期 
  1. repo forall -c 'commitID=$(git log --before "2024-06-24 24:00" -1 --pretty=format:"%H") && git reset --hard  $commitID'
复制代码
repo 查看清单库分支

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

  • 确定你当前所在的清单库目录。
  • 利用git branch命令查看当前分支。
  • 利用git branch -r查看远程跟踪分支。
  • 利用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的例子:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <manifest>
  3.   <remote  name="korg"
  4.            fetch="gitosis@XXXXroid.git.xxxxxxxxxx.com.cn:android/"
  5.            review="review.source.xxxxxxxxxx.com/gerrit/" />
  6.   <default revision="XXXXroid4.1"    这里指定默认的分支名
  7.            remote="korg"
  8.            sync-j="4" />
  9.   <project path="build" name="platform/build" >  
  10.     <copyfile src="core/root.mk" dest="Makefile" />
  11.   </project>
  12.   <project path="abi/cpp" name="platform/abi/cpp" />
  13.   <project path="bionic" name="platform/bionic" />
  14.   <project path="bootable/bootloader/legacy" name="platform/bootable/bootloader/legacy" />
  15.   <project path="bootable/diskinstaller" name="platform/bootable/diskinstaller" />
  16.   <project path="bootable/recovery" name="platform/bootable/recovery" />
  17.   <project path="cts" name="platform/cts" />
复制代码
以上几个工程都是同等的:path指定当地堆栈位置,name指定远程的堆栈位置,当地堆栈将默认跟踪远程的XXXXroid4.1分支。
再来看几个:(和上面的出自同一个manifest.xml中):
  1.   <project path="packages/apps/10086cn" name="platform/packages/apps/10086cn" revision="XXXXroid_own_copyright" />
  2.   <project path="packages/apps/AppBackup" name="platform/packages/apps/AppBackup" revision="XXXXroid_own_copyright" />
  3.   <project path="packages/apps/AudioProfile" name="platform/packages/apps/AudioProfile" revision="XXXXroid_own_copyright" />
  4.   <project path="packages/apps/Monternet" name="platform/packages/apps/Monternet" revision="XXXXroid_own_copyright" />
  5.   <project path="packages/apps/MyFavorites" name="platform/packages/apps/MyFavorites" revision="XXXXroid_own_copyright" />
  6.   <project path="packages/apps/XXXXNote" name="platform/packages/apps/XXXXNote" revision="XXXXroid_own_copyright" />
  7.   <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文件内容:
  1. apuser@YaochuanLiubt:~/mywork/403-akm$ repo start local-0113 --all
  2. Starting local-0113: 100% (248/248), done.  
  3. apuser@YaochuanLiubt:~/mywork/403-akm$ cd kernel/
  4. apuser@YaochuanLiubt:~/mywork/403-akm/kernel$ git branch
  5. * local-0113
  6. apuser@YaochuanLiubt:~/mywork/403-akm/kernel$ cat .git/config
  7. [core]
  8. repositoryformatversion = 0
  9. filemode = true
  10. [remote "korg"]
  11. url = gitosis@XXXXroid.git.xxxxxxxxxx.com.cn:android/kernel/common.git
  12. review = review.source.xxxxxxxxxx.com/gerrit/
  13. projectname = kernel/common
  14. fetch = +refs/heads/*:refs/remotes/korg/*
  15. [branch "local-0113"]
  16. remote = korg
  17. merge = XXXXroid4.0.3_vlx_3.0 /看,这里跟的是这个/
复制代码
  1. apuser@YaochuanLiubt:~/mywork/403-akm/packages/apps/10086cn$ git branch
  2. * local-0113
  3. apuser@YaochuanLiubt:~/mywork/403-akm/packages/apps/10086cn$ cat .git/config
  4. [core]
  5. repositoryformatversion = 0
  6. filemode = true
  7. [remote "korg"]
  8. url = gitosis@XXXXroid.git.xxxxxxxxxx.com.cn:android/platform/packages/apps/10086cn.git
  9. review = review.source.xxxxxxxxxx.com/gerrit/
  10. projectname = platform/packages/apps/10086cn
  11. fetch = +refs/heads/*:refs/remotes/korg/*
  12. [branch "local-0113"]
  13. remote = korg
  14. merge = XXXXroid_own_copyright /看,这里跟的是另一个!/
  15. apuser@YaochuanLiubt:~/mywork/403-akm/packages/apps/10086cn$
  16. apuser@YaochuanLiubt:~/mywork/403-akm/packages/apps/10086cn$
  17. 所以,以后就不要在用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命令
利用场景和示例

  • 首次推送‌:当你第一次将当地分支推送到远程堆栈时,利用git push -u origin master可以主动创建远程分支,并设置默认推送目标。例如,将当地的master分支推送到远程堆栈origin的master分支上‌。
  • 简化后续操作‌:一旦设置了默认推送目标,你就可以利用简化的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 //查看分支是否切换成功

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表