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/ 的方式生产引导文件)
- 测试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仓库(可以继续按格式添加其它名字的仓库):
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>
- 执行:
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
└── repo4 directories, 2 files
当执行 repo init 命令来初始化仓库的时候首先执行的就是 Repo 的引导脚本,该脚本会到我们指定的地方去下载 Manifest 仓库,以及 Repo 命令主体部分。下载好之后就放在当前目录下面的**.repo目录下,其中:
文件夹 用途**manifests清单文件的仓库manifests.git 清单文件的 Git 裸仓库,不带工作区manifest.xml 这是一个链接文件,指向你的用于初始化工作区的清单文件,即manifests/default.xmlproject.list 一个文本文件,里面包含所有项目名字的列表projects该文件夹下包含所有 git project 的裸仓库,文件夹的层次结构跟工作区的布局一样repo 这是 repo 命令的主体,其中也包含最新的 repo 命令,推荐使用这里面的 repo 命令
repo常见命令使用
命令格式和使用流程
1. repo命令的使用格式如下所示
$ repo <COMMAND> <OPTIONS>
可选的的有:help、init、sync、upload、diff、download、forall、prune、start、status,每一个命令都有实际的使用场景;
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 //查看文件状态
- repo forall -p -c git merge topic 把所有项目都切换到master分支,执行上述指令将topic分支合并到master分支。
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//建立本地分支
- 其它
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指令输出之前列出项目名称,即在指定命令的输出前显示项目标题;
-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)的分支,你可以按照以下步骤操作:
- 确定你当前所在的清单库目录。
- 使用
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 -rgit 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案列使用说明
repo 类似一个脚本,拉取所有子仓库到本地;根据default.xml组成一个可以编译的工程
default.xml单独存在于一个仓库;用这个仓库脚本批量管理操作其它仓库。这个仓库也是可以有分支的,拉取分:repo init -u <清单库URL> -b <分支名>
可以单独克隆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
- repo拉取仓库后,可以进去进入各个仓库路径;单独操作该仓库git命令(不需要repo前缀)
问题处理
git status问题:
当clone到用户端的文件被更改权限后,git status会爆出很多modify
解决方法:更改.git\config文件中的filemode=true改为false
- 查看filemode选项
git config --get core.filemode
或
git config core.filemode
- 设置filemode选项
git config core.filemode true
或 git config --add core.filemode true
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
命令。这相当于推送一个空的本地分支到远程分
版权归原作者 卓学电子 所有, 如有侵权,请联系我们删除。