0


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

repo是什么

  1. 官方的定义: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/ 的方式生产引导文件)

  1. 测试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>
  1. 执行:

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.xmlproject.list 一个文本文件,里面包含所有项目名字的列表projects该文件夹下包含所有 git project 的裸仓库,文件夹的层次结构跟工作区的布局一样repo 这是 repo 命令的主体,其中也包含最新的 repo 命令,推荐使用这里面的 repo 命令

repo常见命令使用

命令格式和使用流程

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

  1. $ repo <COMMAND> <OPTIONS>

可选的的有:help、init、sync、upload、diff、download、forall、prune、start、status,每一个命令都有实际的使用场景;

2. 项目开发流程是:

  1. repo init初始化工程,指定待下载的分支
  2. repo sync下载代码
  3. repo start将本地git库切换到开发分支(TOPIC BRANCH)
  4. 在本地进行修改,验证后,提交到本地
  5. 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 //查看文件状态

  1. repo forall -p -c git merge topic 把所有项目都切换到master分支,执行上述指令将topic分支合并到master分支。

2.repo常用操作流程

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

3.repo切换分支

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

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 工具

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

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

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

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

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

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

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

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

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

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

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

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

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

平行作业选项

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

多清单选项

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

repo init 特有选项

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

repo sync 特有选项

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

repo upload 特有选项

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

  1. -t, --topic-branch: 将主题设置为本地分支名称
  2. --topic=TOPIC: 设置更改的主题
  3. --re=REVIEWERS, --reviewers=REVIEWERS: 请求这些人审查
  4. --cc=CC: 同时向这些电子邮件地址发送电子邮件
  5. -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 查看清单库分支

在使用

  1. 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

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

问题处理

git status问题:

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

  1. 查看filemode选项

git config --get core.filemode

git config core.filemode

  1. 设置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 **

  1. git push -u origin master

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

git push -u

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

具体来说,当你使用

  1. git push -u origin master

命令时,Git会自动将本地的

  1. master

分支与远程仓库

  1. origin

上的

  1. master

分支进行关联。这意味着,一旦关联成功,你就可以使用简化的

  1. git push

命令来推送本地分支到远程分支,而不需要每次都指定远程分支名。此外,

  1. -u

参数还会记录这个远程分支为默认的推送目标,这样在以后的推送操作中,你可以直接使用

  1. 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命令。这相当于推送一个空的本地分支到远程分
标签: gitee

本文转载自: https://blog.csdn.net/weixin_42107504/article/details/140709590
版权归原作者 卓学电子 所有, 如有侵权,请联系我们删除。

“repo 工具安装和使用教程(windows+gitee)”的评论:

还没有评论