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}/ remotefetch/{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. 项目开辟流程是:
- repo init初始化工程,指定待下载的分支
- repo sync下载代码
- repo start将当地git库切换到开辟分支(TOPIC BRANCH)
- 在当地进行修改,验证后,提交到当地
- 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 sync | git pull | 同步代码 | repo upload | git push | 上传代码 | repo forall | 无 | 多堆栈 | repo start | git checkout -b | 创建并切换分支 | repo checkout | git checkout | 切换分支 | repo status | git status | 状态查询 | repo branches | git branch | 分支查询 | repo diff | git diff | 文件对比 | repo prune | 无 | 删除归并分支 | repo stage –i | git add --interactive | 添加文件到暂存区 | repo abandon | git 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)的分支,你可以按照以下步调操作:
- 确定你当前所在的清单库目录。
- 利用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,即:fetch/{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命令
利用场景和示例
- 首次推送:当你第一次将当地分支推送到远程堆栈时,利用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企服之家,中国第一个企服评测及商务社交产业平台。 |