1.gclient簡介
gclient是谷歌開發的一套跨平台git倉庫管理工具,用來將多個git倉庫組成一個solution進行管理。總體上,其核心功能是根據一個Solution的DEPS文件所定義的規則將多個git倉庫拉取到指定目錄。例如,chromium就是由80多個獨立倉庫組成。
2.相關概念
- hooks: 當gclient拉完代碼后執行的額外腳本;
- solution: 一個包含DEPS文件的倉庫,可以認為是一個完整的項目;
- DEPS: 一個特殊的文件,規定了項目依賴關系;
- .gclient:一個特殊文件,規定了要拉取的solution,可由
gclient config
命令創建出來; - include_rules:指定當前目錄下哪些目錄/文件可以被其他代碼include包含,哪些不可以被include。
幫助命令:
gclient --help
3.常用命令
3.1 gclient config
該命令會生成.gclient
文件,用於初始化要拉取的solution,其內容記錄了solution倉庫的地址以及要保存的位置。
我們在拉取chromium代碼時第一步其實也是生成了.gclient
文件,內容如下:
solutions = [
{
"url": "https://chromium.googlesource.com/chromium/src.git", # Solution倉庫地址
"managed": False,
"name": "src", # 拉取代碼后存放的位置
"custom_deps": {}, # 自定義依賴的倉庫地址
"custom_vars": {},
},
]
以下是可以配置的字段:
- name : checkout出源碼的名字
- url : 源碼所在的目錄,gclient希望checkout出的源碼中包括一個DEPS的文件,這個文件包含了必須checkout到工作目錄的源碼的信息;
- deps_file 這是一個文件名(不包括路徑),指在工程目錄中包含依賴列表的文件,該項為可選,默認值為"DEPS"
- custom_deps 這是一個可選的字典對象,會覆蓋工程的"DEPS"文件定義的條目。一般它用作本地目錄中,那些不用checkout的代碼;
- target_os : 這個可選的條目可以指出特殊的平台,根據平台來checkout出不同代碼
3.2 gclient sync
該命令用於同步solution的各個倉庫,它有一些參數:
-f
、--force
:強制更新未更改的模塊;--with_branch_heads
: 除了clone默認refspecs外,還會clone "branch_heads" refspecs;--with_tags
: 除了默認的refspec之外,還可以clone git tags;--no-history
: 不拉取git提交歷史信息;--revision <version>
: 將代碼切換到 version 版本 ;--nohooks
:拉取代碼之后不執行hooks。
拉取代碼主要是根據DEPS
文件來進行,它里面的內容包括:
deps
: 要獲取的子依賴項:
deps = {
"src/outside" : "http://outside-server/trunk@1234",
}
vars
:定義字符串變量,一般用於替代公共的字符串,然后通過Var
來獲取實際的值:
vars = {
'chromium_git': 'https://chromium.googlesource.com'
}
deps = {
'src/chrome/browser/resources/media_router/extension/src':
Var('chromium_git') + '/media_router.git' + '@' + '475baa8b2eb0a7a9dd1c96c9c7a6a8d9035cc8d7',
'src/buildtools':
Var('chromium_git') + '/chromium/buildtools.git' + '@' + Var('buildtools_revision')
}
Hooks
:DEPS包含可選的內容 hooks,也有重要的作用,它表示在sync, update或者recert后,執行一個hook操作,也即執行對應的腳本;
hooks = [
{
#config git log format
'name': 'git-log',
'pattern': '.',
'action': [
'python',
'src/git-log/config_commit.py',
],
},
...
]
deps_os
:根據不同的平台定義不同的依賴工程,可選的包括:
DEPS_OS_CHOICES = {
"win32": "win``` "win": "win",
"cygwin": "win",
"darwin": "mac",
"mac": "mac",
"unix": "unix",
"linux": "unix",
"linux2": "unix",
"linux3": "unix",
"android": "android",
}
deps_os = {
"win": {
"src/chrome/tools/test/reference_build/chrome_win":
"/trunk/deps/reference_builds/chrome_win@197743",
.....
},
"ios": {
"src/third_party/GTM":
(Var("googlecode_url") % "google-toolbox-for-mac") + "/trunk@" +
Var("gtm_revision"),
....
},
...
}
3.3 gclient runhooks
執行hooks。當你拉取代碼時使用了--nohooks
參數時,就可以使用該命令來手動執行hooks。
3.4 gclient recurse
在每個倉庫中都執行一條git 命令
3.5 gclient fetch
相當於每個倉庫都執行了git fetch
操作。
3.6 gclient diff
相當於每個倉庫都執行git diff
操作。
3.7 gclient status
相當於每個倉庫都執行git status
操作。
更多指令可以使用gclient --help
查看。
4. 拉取代碼流程
使用gclient拉取代碼的時,主要使用以下命令: