前一篇文章Git入门:边玩边学我们介绍了Git
,那接下来就介绍他的好基友Repo
,Repo
是以 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
(清单)
Repo
用Manifest 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