酒店vi設(shè)計(jì)抖音seo培訓(xùn)
Repo簡(jiǎn)介
“Repo” 是一個(gè)用于管理多個(gè)Git存儲(chǔ)庫(kù)的工具,通常與Google的Android開(kāi)發(fā)項(xiàng)目一起使用。它允許您在一個(gè)命令下輕松地進(jìn)行多個(gè)Git存儲(chǔ)庫(kù)的同步、下載和管理。
repo下載安裝
從清華鏡像源下載
mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo #~/bin/repo為repo下載本地的存放路徑
chmod a+x ~/bin/repo
其實(shí)下載下來(lái)的repo文件只是一個(gè)使用Python編寫(xiě)的引導(dǎo)腳本(Google 稱(chēng)之為 Repo launcher,本質(zhì)上是一個(gè)python腳本,可以使用vim打開(kāi)的),完整的repo(即,repo的主體部分)還沒(méi)有下載。
repo help
查看repo幫助說(shuō)明,該幫助列舉了repo所支持的子命令,及各個(gè)子命令的簡(jiǎn)要介紹。
如果需要查看某個(gè)具體子命令的詳細(xì)介紹,執(zhí)行命令repo help 即可。例如查看repo init的幫助,可以輸入repo help init。
上一小節(jié)已經(jīng)提及到了,下載下來(lái)的repo只是一個(gè)引導(dǎo)腳本,完整的repo工具還沒(méi)有下載,此時(shí)執(zhí)行repo help命令只能看到init和help兩個(gè)子命令,而且?guī)椭畔⒅羞€會(huì)提示repo還未安裝,需要執(zhí)行repo init安裝。(需要注意repo init需要跟參數(shù)的,后面會(huì)單獨(dú)介紹repo init的使用)
當(dāng)執(zhí)行完repo init下載了完整的repo工具之后,再執(zhí)行repo help就會(huì)看到repo更多的子命令。
注意:repo init -u 后跟url地址,如果是自己項(xiàng)目,則是Android源碼項(xiàng)目源碼編輯的Repo的地址;如果是官方AOSP repo是官方配置好的,可以對(duì)比如下兩個(gè)安裝repo工具的方式:
repo init -u https://github.com/remote-android/platform_manifests.git -b redroid-11.0.0 --depth=1 --git-lfs # 自定義repo工具中描述源碼倉(cāng)庫(kù)地址組織形式
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-12.0.0_r1 # 官方AOSP repo中源碼倉(cāng)庫(kù)組織形式
或者
repo init -u https://android.googlesource.com/platform/manifest -b android-12.0.0_r12
如果需要某個(gè)特定的 Android 版本,特定版本標(biāo)記查看
<https://source.android.google.cn/docs/setup/about/build-numbers?hl=zh-cn#source-code-tags-and-builds>
repo init -u 命令效果
首先當(dāng)前目錄產(chǎn)生一個(gè).repo目錄
然后克隆一份repo的源代碼到.repo/repo下,里面存放了其他repo子命令,即repo的主體部分。
接著從manifest_git_path倉(cāng)庫(kù)地址clone清單庫(kù)到.repo/manifests和.repo/manifests.git目錄。
同時(shí).repo目錄下還包括manifest倉(cāng)庫(kù)(清單庫(kù))內(nèi)容
.repo文件夾簡(jiǎn)介
執(zhí)行repo init命令之后,會(huì)在當(dāng)前目錄創(chuàng)建一個(gè).repo文件夾。
文件夾 描述
manifests manifest倉(cāng)庫(kù)(清單庫(kù))內(nèi)容,即repo init的-u選項(xiàng)對(duì)應(yīng)的倉(cāng)庫(kù)
manifests.git manifest倉(cāng)庫(kù)(清單庫(kù))的.git目錄
manifest.xml 指明當(dāng)前生效的Manifest文件,即repo init的-m選項(xiàng)對(duì)應(yīng)的參數(shù)(沒(méi)有該選項(xiàng)時(shí)默認(rèn)為default.xml)
repo repo命令的主體,包含了最新的 repo 命令
manifest文件分析
所謂manifest倉(cāng)庫(kù)(清單庫(kù))其實(shí)就是存放manifest(清單)文件的倉(cāng)庫(kù),實(shí)際上可以是任意倉(cāng)庫(kù),只要該倉(cāng)庫(kù)中存在repo init命令-m選項(xiàng)指定的manifest文件即可,清單庫(kù)命名為manifest只不過(guò)是一種約定俗成的寫(xiě)法罷了。
manifest倉(cāng)庫(kù)一般都會(huì)有一個(gè)manifests\default.xml文件,該文件為默認(rèn)的manifest文件。
<?xml version="1.0" encoding="UTF-8"?>
<manifest><remote name="aosp"fetch="https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/"review="https://android-review.googlesource.com/" /><default revision="refs/tags/android-12.0.0_r32"remote="aosp"sync-j="4" /><superproject name="platform/superproject" remote="aosp" revision="android-12.0.0_r32" /><contactinfo bugurl="go/repo-bug" /><project path="build/make" name="platform/build" groups="pdk" ><copyfile src="core/root.mk" dest="Makefile" /><linkfile src="CleanSpec.mk" dest="build/CleanSpec.mk" /><linkfile src="buildspec.mk.default" dest="build/buildspec.mk.default" /><linkfile src="core" dest="build/core" /><linkfile src="envsetup.sh" dest="build/envsetup.sh" /><linkfile src="target" dest="build/target" /><linkfile src="tools" dest="build/tools" /></project><project path="build/bazel" name="platform/build/bazel" groups="pdk" ><linkfile src="bazel.WORKSPACE" dest="WORKSPACE" /><linkfile src="bazel.sh" dest="tools/bazel" /><linkfile src="bazel.BUILD" dest="BUILD" /></project><project path="build/blueprint" name="platform/build/blueprint" groups="pdk,tradefed" /><project path="build/pesto" name="platform/build/pesto" groups="pdk" /><project path="build/soong" name="platform/build/soong" groups="pdk,tradefed" ><linkfile src="root.bp" dest="Android.bp" /><linkfile src="bootstrap.bash" dest="bootstrap.bash" /></project><project path="art" name="platform/art" groups="pdk" /><project path="bionic" name="platform/bionic" groups="pdk" /><project path="bootable/recovery" name="platform/bootable/recovery" groups="pdk" /><project path="bootable/libbootloader" name="platform/bootable/libbootloader" groups="vts,pdk" /><project path="compatibility/cdd" name="platform/compatibility/cdd" groups="pdk" /><project path="cts" name="platform/cts" groups="cts,pdk-cw-fs,pdk-fs" /><project path="dalvik" name="platform/dalvik" groups="pdk-cw-fs,pdk-fs" /><project path="developers/build" name="platform/developers/build" groups="developers,pdk" />省略一部分....<repo-hooks in-project="platform/tools/repohooks" enabled-list="pre-upload" />
</manifest>
清單文件各元素解釋
-
<
manifest>
根標(biāo)簽
這個(gè)是配置的頂層元素,即根標(biāo)志 -
<
remote>
標(biāo)簽
remote元素可以有多個(gè),用于存在多個(gè)git遠(yuǎn)程服務(wù)器的情況。-
name 即表示每個(gè)git的遠(yuǎn)程服務(wù)器的名字(這個(gè)名字很關(guān)鍵,如果多個(gè)remote屬性的話(huà),default屬性中需要指定default remote)。git pull、get fetch的時(shí)候會(huì)用到這個(gè)remote name。
-
fetch :所有g(shù)it url真正路徑的前綴,所有g(shù)it 的project name(就是后面的project標(biāo)簽的name元素)加上這個(gè)前綴,就是git url的真正路徑;如果使用此remote的所有項(xiàng)目的前綴和manifest倉(cāng)庫(kù)前置一致的話(huà),可以使用…代替。
repo init -u https://github.com/remote-android/platform_manifests.git -b redroid-11.0.0 的manifest倉(cāng)庫(kù)前置https://github.com/remote-android/
-
review:通過(guò)repo upload將評(píng)論上傳到的 Gerrit 服務(wù)器的主機(jī)名。 該屬性是可選的; 如果未指定,則repo upload將不起作用。
-
alias:該屬性可以省略,當(dāng)指定了該屬性時(shí),可以覆蓋name屬性設(shè)置每個(gè)項(xiàng)目的.git/config中的遠(yuǎn)程名稱(chēng)。不同remote元素的alias屬性可以相同,比如不同remote元素的alias屬性可以都是origin。
-
-
<
default>
標(biāo)簽元素
default元素只能有一個(gè)。設(shè)定所有project標(biāo)簽的默認(rèn)屬性值,如果在project元素里沒(méi)有指定一個(gè)屬性,則使用default元素的屬性值。- remote :遠(yuǎn)程服務(wù)器的名字(上面remote屬性中提到過(guò),多個(gè)remote的時(shí)候需要指定default remote,就是這里設(shè)置了)
- revision :所有g(shù)it的默認(rèn)branch,后面project沒(méi)有特殊指出revision的話(huà),就用這個(gè)branch
- sync_j : 在repo sync中默認(rèn)并行的數(shù)目
-
<
superproject>
標(biāo)簽是該清單文件中的一個(gè)元素,用于定義一個(gè)超級(jí)項(xiàng)目(也稱(chēng)為"manifest項(xiàng)目")。
超級(jí)項(xiàng)目是一個(gè)特殊的項(xiàng)目,它通常用于組織多個(gè)子項(xiàng)目。在Android源代碼管理中,這些子項(xiàng)目可以是不同的軟件組件、庫(kù)、應(yīng)用程序等。超級(jí)項(xiàng)目本身通常不包含實(shí)際的源代碼,它主要用于管理和同步這些子項(xiàng)目的代碼。
default.xml 文件中的 superproject 標(biāo)簽主要包含以下信息:- name 屬性:指定超級(jí)項(xiàng)目的名稱(chēng)。這個(gè)名稱(chēng)通常是一個(gè)唯一標(biāo)識(shí)符,用于區(qū)分不同的超級(jí)項(xiàng)目。
- path 屬性:指定超級(jí)項(xiàng)目的路徑。這是超級(jí)項(xiàng)目在本地文件系統(tǒng)中的相對(duì)路徑,Repo將會(huì)在該路徑下創(chuàng)建一個(gè)文件夾來(lái)管理超級(jí)項(xiàng)目。
- remote 屬性:指定與超級(jí)項(xiàng)目相關(guān)聯(lián)的Git遠(yuǎn)程存儲(chǔ)庫(kù)的名稱(chēng)。這個(gè)遠(yuǎn)程存儲(chǔ)庫(kù)通常包含了清單文件的信息以及管理所有子項(xiàng)目的信息。
- revision 屬性:指定要使用的Git分支、標(biāo)簽或提交ID。這決定了超級(jí)項(xiàng)目所管理的子項(xiàng)目的版本。
-
<
project>
標(biāo)簽
需要clone的單獨(dú)git,每一個(gè)代表了一個(gè)可以被clone到工作區(qū)的倉(cāng)庫(kù),定義了一個(gè) Git 倉(cāng)庫(kù)項(xiàng)目的配置信息。- name :git 的名稱(chēng),用于生成git url。URL格式是: r e m o t e f e t c h / {remote fetch}/ remotefetch/{project name}.git 其中的 fetch就是上面提到的remote中標(biāo)簽的fetch屬性,name 就是此處的name;如果這個(gè)project有一個(gè)parent屬性,則該project最終的url會(huì)被這樣拼湊
r e m o t e f e t c h / {remote_fetch}/ remotef?etch/{project_parent}/${project_name}.git - path :指定倉(cāng)庫(kù)在本地文件系統(tǒng)中的路徑。clone到本地的git的工作目錄,如果沒(méi)有配置的話(huà),使用name屬性值;相對(duì)于repo的根目錄而言的相對(duì)路徑;
- remote :指定該倉(cāng)庫(kù)使用的遠(yuǎn)程倉(cāng)庫(kù)的名稱(chēng)。定義remote name,如果沒(méi)有定義的話(huà)就用default中定義的remote name
- revision :指定該倉(cāng)庫(kù)使用的分支、標(biāo)簽或提交。指定需要獲取的git提交點(diǎn),可以定義成固定的branch,或者是明確的commit 哈希值
- groups :指定該倉(cāng)庫(kù)所屬的分組,用于組織倉(cāng)庫(kù)。列出project所屬的組,以空格或者逗號(hào)分隔多個(gè)組名。所有的project都自動(dòng)屬于"all"組。每一個(gè)project自動(dòng)屬于name:‘name’ 和path:'path’組。例如,它自動(dòng)屬于default, name:monkeys, and path:barrel-of組。如果一個(gè)project屬于notdefault組,則,repo sync時(shí)不會(huì)下載
- name :git 的名稱(chēng),用于生成git url。URL格式是: r e m o t e f e t c h / {remote fetch}/ remotefetch/{project name}.git 其中的 fetch就是上面提到的remote中標(biāo)簽的fetch屬性,name 就是此處的name;如果這個(gè)project有一個(gè)parent屬性,則該project最終的url會(huì)被這樣拼湊
-
copyfile 標(biāo)簽
project元素的子元素,每個(gè)元素描述了一對(duì) src-dest 文件對(duì)。同步時(shí)(即執(zhí)行repo sync命令時(shí))src文件會(huì)被拷貝到dest。通常會(huì)被用于 README 或 Makefile 或其他構(gòu)建腳本。- dest:是相對(duì)于當(dāng)前目錄(執(zhí)行repo init和repo sync命令的目錄)的路徑
- src:是相對(duì)于project標(biāo)簽的path屬性值的相對(duì)路徑
-
linkfile標(biāo)簽
與copyfile類(lèi)似,只不過(guò)不是拷貝,而是進(jìn)行一個(gè)符號(hào)鏈接。 -
include 標(biāo)簽
通過(guò)name屬性可以引入另外一個(gè)manifest文件(路徑相對(duì)與當(dāng)前的manifest.xml 的路徑),name:另一個(gè)需要導(dǎo)入的manifest文件名字
可以在當(dāng)前的路徑下添加一個(gè)another_manifest.xml,這樣可以在另一個(gè)xml中添加或刪除project -
remove-project 標(biāo)簽
從內(nèi)部的manifest表中刪除指定的project。用于從清單文件中移除一個(gè)項(xiàng)目。這可以用于停止同步某個(gè)項(xiàng)目的代碼。 -
annotation標(biāo)簽
提供對(duì) 元素的注釋,用于描述倉(cāng)庫(kù)的用途或其他信息。 -
repo-hooks 標(biāo)簽
用于定義 Repo 在執(zhí)行特定操作時(shí)應(yīng)該觸發(fā)的鉤子(hooks)腳本。Repo 鉤子是一種機(jī)制,允許你在特定的 Git 操作發(fā)生時(shí)自動(dòng)執(zhí)行一些自定義的腳本或命令。- in-project:指定鉤子腳本的相對(duì)路徑,這是相對(duì)于當(dāng)前 Repo 的路徑。這個(gè)屬性通常用于為特定 Repo 設(shè)置鉤子腳本,而不是全局設(shè)置。
- enabled-list:一個(gè)用逗號(hào)分隔的鉤子名稱(chēng)列表,指定哪些鉤子應(yīng)該在當(dāng)前 Repo 上啟用。這允許你選擇性地啟用或禁用 Repo 鉤子。
搭建repo服務(wù)
- 簡(jiǎn)而言之:
部署通用的工具倉(cāng)庫(kù)git-repo.git。
部署自己的清單倉(cāng)庫(kù)manifests.git。
編寫(xiě)清單文件manifests.xml
批量創(chuàng)建工程子倉(cāng)庫(kù)和上傳源代碼。