Repo入门:边玩边学

前一篇文章Git入门:边玩边学我们介绍了Git,那接下来就介绍他的好基友RepoRepo 是以 Git 为基础构建的代码库管理工具。Repo 可以在必要时整合多个 Git 代码库,将相关内容上传到版本控制系统。借助单个 Repo 命令,可以将文件从多个代码库下载到本地工作目录。
Repo 命令是一段可执行的 Python 脚本,你可以将其放在路径中的任何位置。

下载Repo

确保主目录下有一个 bin/ 目录,并且该目录包含在路径中:

mkdir ~/bin
PATH=~/bin:$PATH

下载 Repo 工具,并确保它可执行:

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

Repo命令

使用 Repo 需遵循的格式如下:

repo <COMMAND> <OPTIONS>

可选元素显示在方括号 [ ] 中。例如,许多命令会将项目列表用作参数。你可以为项目指定项目列表,作为名称列表或本地源代码目录的路径列表:

repo sync [<PROJECT0> <PROJECT1> <PROJECTN>]
repo sync [</PATH/TO/PROJECT0> ... </PATH/TO/PROJECTN>]

help
安装 Repo 后,你可以通过在 Repo 树中运行以下命令来获取有关某个命令的信息:

repo help <COMMAND>

例如,以下命令会生成 Repo init 参数的说明和选项列表,该参数会在当前目录中初始化 Repo

repo help init

init

repo init -u <URL> [<OPTIONS>]

在当前目录中安装 Repo。这会创建一个 .repo/ 目录,其中包含用于 Repo 源代码和源代码清单文件的 Git 代码库。该 .repo/ 目录中还包含 manifest.xml,这是一个指向 .repo/manifests/ 目录中所选清单的符号链接。

选项:

-u:指定要从中检索清单代码库的网址。您可以在 https://android.googlesource.com/platform/manifest 中找到常见清单
-m:在代码库中选择清单文件。如果未选择任何清单名称,则会默认选择 default.xml。
-b:指定修订版本,即特定的清单分支。

sync

repo sync [<PROJECT_LIST>]

下载新的更改并更新本地环境中的工作文件。如果你在未使用任何参数的情况下运行 repo sync,则该操作会同步所有项目的文件。

upload

repo upload [<PROJECT_LIST>]

对于指定的项目,Repo 会将本地分支与最后一次 repo sync 时更新的远程分支进行比较。Repo 会提示你选择一个或多个尚未上传以供审核的分支。

forall

repo forall [<PROJECT_LIST>] -c <COMMAND>

在每个项目中运行指定的 shell 命令。

prune

repo prune [<PROJECT_LIST>]

删除已合并的项目。

start

repo start <BRANCH_NAME> [<PROJECT_LIST>]

从清单中指定的修订版本开始,创建一个新的分支进行开发。比较常用的是对所有的项目都创建开发分支:

repo start iot --all

status

repo status [<PROJECT_LIST>]

对于每个指定的项目,将工作树与临时区域(索引)以及此分支 (HEAD) 上的最近一次提交进行比较。在这三种状态存在差异之处显示每个文件的摘要行。

Manifest (清单)

RepoManifest XML来管理多个git项目,以下是项目清单XML文件的示例:

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

<manifest>
  <remote fetch="." name="seL4"/>
  <remote fetch="../sel4proj" name="sel4proj"/>

  <default remote="seL4" revision="master"/>

  <project name="musllibc.git" path="projects/musllibc" revision="f58dacf44a679a2d7c10fbb8d8bc8f58e2123791" upstream="sel4"/>
  <project name="riscv-pk" path="projects/riscv-pk" remote="sel4proj" revision="db937e995b09d343fb7146c447b0780ab1dca66b" upstream="fix-32bit"/>
  <project name="seL4.git" path="kernel" revision="757c3ac98246afd0593367f1fa19054316a77495" upstream="master"/>
  <project name="seL4_libs.git" path="projects/seL4_libs" revision="1697cb16ecbc7820cbda78d7c7c1896e884195a1" upstream="master"/>
  <project name="seL4_tools.git" path="projects/tools" revision="930b6467eae8404e4a72555b693120ac0d64fc48" upstream="master">
    <linkfile dest="CMakeLists.txt" src="cmake-tool/default-CMakeLists.txt"/>
    <linkfile dest="init-build.sh" src="cmake-tool/init-build.sh"/>
  </project>
  <project name="sel4test.git" path="projects/sel4test" revision="dbd96aa862b8519165aaa8ae7bd5a1787048e34a" upstream="master"/>
  <project name="util_libs.git" path="projects/util_libs" revision="c575f7280ce6184dbb2876f83a6c591c91de219e" upstream="master"/>
</manifest>

下面是清单元素的简要概述:

<remote name="seL4" fetch="." />

这里remote元素指定了远程git仓库。

<project name="musllibc.git" remote="seL4" path="projects/musllibc" revision="sel4"/>

project元素声明下面的属性:

name: 远程git服务器的名字
path: 是相对于项目初始化所在目录的存储库检出位置。
revision:指定要使用的存储库版本。支持分支和修订哈希。支持标签,但属性值的结构必须为refs/tags/tagname。
<default revision="master" remote="seL4"/>

设定所有projects的默认属性值,如果在project元素里没有指定一个属性,则使用default元素的属性值。

常见问题

如何检出项目的发行版本?

repo init -u https://github.com/seL4/sel4test-manifest.git -b refs/tags/10.1.1
repo sync

如何更改已签出项目的清单?

repo init -m master.xml
repo sync

这将在清单存储库中把当前清单更改master.xml
如何创建固定清单?

repo manifest -r -o pinned.xml

如何更快步项目

repo init -u https://github.com/seL4/sel4test-manifest.git --no-clone-bundle --depth=1
repo sync --jobs=8 --current-branch --no-clone-bundle
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值