Created
November 2, 2017 04:25
-
-
Save keyou/98029c27f2a186c173e647ca09fb4cab to your computer and use it in GitHub Desktop.
gclient
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<html lang="en"><head> | |
<meta charset="UTF-8"> | |
<title></title> | |
<style id="system" type="text/css">*{margin:0;padding:0;}body { font:13.34px helvetica,arial,freesans,clean,sans-serif; color:black; line-height:1.4em; background-color: #F8F8F8; padding: 0.7em;}p { margin:1em 0; line-height:1.5em;}table { font-size:inherit; font:100%; margin:1em;}table th{border-bottom:1px solid #bbb;padding:.2em 1em;}table td{border-bottom:1px solid #ddd;padding:.2em 1em;}input[type=text],input[type=password],input[type=image],textarea{font:99% helvetica,arial,freesans,sans-serif;}select,option{padding:0 .25em;}optgroup{margin-top:.5em;}pre,code{font:12px Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace;}pre { margin:1em 0; font-size:12px; background-color:#eee; border:1px solid #ddd; padding:5px; line-height:1.5em; color:#444; overflow:auto; -webkit-box-shadow:rgba(0,0,0,0.07) 0 1px 2px inset; -webkit-border-radius:3px; -moz-border-radius:3px;border-radius:3px;white-space: pre-wrap;word-wrap:break-word;}pre code { padding:0; font-size:12px; background-color:#eee; border:none;}code { font-size:12px; background-color:#f8f8ff; color:#444; padding:0 .2em; border:1px solid #dedede;}img{border:0;max-width:100%;}abbr{border-bottom:none;}a{color:#4183c4;text-decoration:none;}a:hover{text-decoration:underline;}a code,a:link code,a:visited code{color:#4183c4;}h2,h3{margin:1em 0;}h1,h2,h3,h4,h5,h6{border:0;}h1{font-size:170%;border-top:4px solid #aaa;padding-top:.5em;margin-top:1.5em;}h1:first-child{margin-top:0;padding-top:.25em;border-top:none;}h2{font-size:150%;margin-top:1.5em;border-top:4px solid #e0e0e0;padding-top:.5em;}h3{margin-top:1em;}hr{border:1px solid #ddd;}ul{margin:1em 0 1em 2em;}ol{margin:1em 0 1em 2em;}ul li,ol li{margin-top:.5em;margin-bottom:.5em;}ul ul,ul ol,ol ol,ol ul{margin-top:0;margin-bottom:0;}blockquote{margin:1em 0;border-left:5px solid #ddd;padding-left:.6em;color:#555;}dt{font-weight:bold;margin-left:1em;}dd{margin-left:2em;margin-bottom:1em;}@media screen and (min-width: 768px) { body { width: 748px; margin:10px auto; }}</style><style id="custom" type="text/css"></style></head> | |
<body marginheight="0"><h1>gclient 介绍</h1> | |
<blockquote> | |
<p>gclient 的官方文档: (这些文档比我总结的好多了)<br><a href="https://www.chromium.org/developers/how-tos/depottools">https://www.chromium.org/developers/how-tos/depottools</a> 介绍gclient的一些基本知识 | |
<a href="https://www.chromium.org/developers/how-tos/get-the-code/gclient-managed-mode">https://www.chromium.org/developers/how-tos/get-the-code/gclient-managed-mode</a> 介绍gclient的 Managed Mode | |
<a href="https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/master/README.gclient.md">https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/master/README.gclient.md</a> 介绍gclient的基本知识 | |
<a href="https://cs.chromium.org/chromium/src/buildtools/checkdeps/README.md?dr=C">https://cs.chromium.org/chromium/src/buildtools/checkdeps/README.md?dr=C</a> 介绍include_rules 的相关知识 | |
<a href="https://chromium.googlesource.com/chromium/tools/depot_tools/+/master/gclient.py">https://chromium.googlesource.com/chromium/tools/depot_tools/+/master/gclient.py</a> 介绍gclinet的配置文件以及Hooks | |
</p> | |
</blockquote> | |
<p>gclient 是由 Google 用 Python 开发的一套跨平台的<strong>git仓库管理工具</strong>,它的作用类似 git 的 submodule,用来将多个git仓库组成一个solution进行管理,比如chromium项目是由80多个独立的git仓库构成的。这样的好处是,一个git仓库可以被多个solution共用,类似CBB的机制,只不过它是直接引用代码仓库,而CBB是引用编译好的程序。 | |
</p> | |
<p>具体来讲,gclient 的核心功能是<strong>将solution中由DEPS文件定义的所有git仓库拉取到指定的目录</strong>。围绕着这个功能,它添加了一些其它的辅助功能,比如<code>Hooks</code>,<code>include_rules</code>等功能。 | |
</p> | |
<h2>关键概念:</h2> | |
<ul> | |
<li><code>gclient</code>: 一个跨平台的代码仓库管理工具,用于管理由多个代码仓库组成的项目; </li> | |
<li><code>repo</code>: 作用同gclient,是gclient的前辈,gclient是更新的工具; </li> | |
<li><code>roll_deps</code>: 一个gclient 的辅助工具,用于更新DEPS文件中某个项目的代码版本; </li> | |
<li><code>Gerrit/Rietveld</code>: 一个Code Review系统,可以和git/svn集成; </li> | |
<li><code>Hooks</code>: gclient中的术语,当gclient拉完代码之后执行的额外脚本; </li> | |
<li><code>Solution</code>: 一个包含DEPS文件的仓库,DEPS文件中记录了该solution所有依赖的项目; </li> | |
<li><code>.gclient</code>: 一个由 gclient config 命令创建出来的文件,内部记录了要拉取的solution; </li> | |
<li><code>DEPS</code>: 一个文件,gclient 用于管理项目依赖的一个文件,记录了项目的依赖关系; </li> | |
<li><code>CL</code>: Change List ,类似 git 的 diff 和 pack; </li> | |
<li><code>LKGR</code>: Last Known Good Revision,一个git tag,记录了最新的经过完整测试的版本; </li> | |
<li><code>managed</code>: gclient 的一种模式,该模式已过时,不推荐使用;该模式用于帮助那些对git不熟悉的开发者更简单的使用gclient; </li> | |
<li><code>inlcude_rules</code>: 指定当前目录下哪些目录/文件可以被其他代码inlcude,那些不可以被inlcude;</li> | |
<li><code>specific_include_rules</code>: 作用同include_rules,但是可以使用通配符; </li> | |
</ul> | |
<h2>gclient --help</h2> | |
<p><img src="GetImage.png" alt="gclient --help"> | |
</p> | |
<h2>gclient 命令解释</h2> | |
<h3><code>gclient config</code></h3> | |
<p>该命令用来初始化要拉取的solution,它会在命令执行目录下生成 .gclient 文件; | |
.gclient 文件中记录了要拉取的solution的仓库地址,以及拉取后要保存的位置,如下: | |
</p> | |
<pre><code class="lang-python">solutions = [ | |
{ | |
"url": "https://chromium.googlesource.com/chromium/src.git", # 要拉取的仓库地址,solution 地址 | |
"managed": False, # 使用 unmanaged 模式 | |
"name": "src", # 拉去后存放的目录 | |
"deps_file": ".DEPS.git", # deps 文件名(如果找不到,会找DEPS?) | |
"custom_deps": {}, # 自定义的 project 的仓库地址 | |
}, | |
]</code></pre> | |
<h3><code>gclient sync</code></h3> | |
<p>该命令用来同步solution。它有很多的参数可选:<br>- <code>--force</code> 拉取solution中的所有仓库<br>- <code>--revision <version></code> 将代码切换到 version 版本<br>- <code>--no-history</code> 拉取的时候不拉取git历史记录,可以减少拉取的大小,从而加快拉取的速度<br>- <code>--nohooks</code> 拉取代码后不执行hooks | |
</p> | |
<h3><code>gclient runhooks</code></h3> | |
<p>对本地已经修改的文件执行hooks | |
</p> | |
<h3><code>gclient status</code></h3> | |
<p>输出当前solution中所有仓库的状态信息 | |
</p> | |
<h3><code>gclient diff</code></h3> | |
<p>显示整个solution中所有项目的diff信息 | |
</p> | |
<h3><code>gclient fetch</code></h3> | |
<p>相当于在solution中的每一个仓库都执行了git fetch 操作 | |
</p> | |
<h3><code>gclient flatten</code></h3> | |
<p>将当前solution“扁平化”,生成一个 DEPS 文件,使用 --pin-all-deps 参数可以使生成的 DEPS 文件中记录每一个仓库的commit号 | |
</p> | |
<h3><code>gclient grep</code></h3> | |
<p>类似 grep,用于在当前 solution 中搜索字符串 | |
</p> | |
<h3><code>gclient pack</code></h3> | |
<p>内部对每一个仓库使用 git diff 来生成一个 patch,这个patch 可以用 ’patch –p0 < patchfile‘ 命令来应用到solution中 | |
</p> | |
<h3><code>gclient recurse</code></h3> | |
<p>在solution中的每一个仓库中执行一条命令 | |
</p> | |
<h3><code>gclient revert</code></h3> | |
<p>在solution中的每一个仓库中执行git reset –hard,将solution回退到一个clean的状态,所有本地的修改都会撤销 | |
</p> | |
<h3><code>gclient revinfo</code></h3> | |
<p>显示当前solution中每一个仓库的版本信息 | |
</p> | |
<h3><code>gclient root</code></h3> | |
<p>输出当前solution根目录的路径 | |
</p> | |
<h2>使用 gclient 的开发流程人如下:</h2> | |
<pre><code class="lang-bash"># 首次拉代码: | |
mkdir chromium | |
cd chromium | |
gclient config [email protected]:CrOS/src.git --unmanaged # <1s | |
gclinet sync --reversion src@c/master --nohooks # >10m,不需要水管 | |
gclient runhooks # >10m,需要水管 | |
...... # 编译 | |
...... # 修改代码 | |
...... # 使用 git 进行代码提交 | |
# 更新代码: | |
cd src | |
git pull # <10s | |
gclient sync # <30s</code></pre> | |
</body></html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment