Skip to content

Instantly share code, notes, and snippets.

@keyou
Created November 2, 2017 04:25
Show Gist options
  • Save keyou/98029c27f2a186c173e647ca09fb4cab to your computer and use it in GitHub Desktop.
Save keyou/98029c27f2a186c173e647ca09fb4cab to your computer and use it in GitHub Desktop.
gclient
<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 &lt;version&gt;</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 &lt; 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 # &lt;1s
gclinet sync --reversion src@c/master --nohooks # &gt;10m,不需要水管
gclient runhooks # &gt;10m,需要水管
...... # 编译
...... # 修改代码
...... # 使用 git 进行代码提交
# 更新代码:
cd src
git pull # &lt;10s
gclient sync # &lt;30s</code></pre>
</body></html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment