<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SalvageOfSDK on Potter的个人笔记</title><link>https://potterwhite.github.io/portfolio/embedded-build-infrastructure/salvage-of-sdk/</link><description>Recent content in SalvageOfSDK on Potter的个人笔记</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Mon, 10 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://potterwhite.github.io/portfolio/embedded-build-infrastructure/salvage-of-sdk/index.xml" rel="self" type="application/rss+xml"/><item><title>第一次迭代（2025）：从单体巨石到 repo 多仓库协同</title><link>https://potterwhite.github.io/portfolio/embedded-build-infrastructure/salvage-of-sdk/iteration-1-repo-python/</link><pubDate>Sat, 07 Jun 2025 00:00:00 +0000</pubDate><guid>https://potterwhite.github.io/portfolio/embedded-build-infrastructure/salvage-of-sdk/iteration-1-repo-python/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作者:&lt;/strong&gt; Potter White&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日期:&lt;/strong&gt; 2025年6月&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="一-项目概述"&gt;一、 项目概述&lt;/h3&gt;
&lt;p&gt;我独立主导并实施了一项大型嵌入式 Linux SDK 的完整迁移工程。该项目将一个以离线压缩包形式分发的、庞大的单体代码库，成功重构并迁移至内部 GitLab 服务器，建立了一套基于 Google &lt;code&gt;repo&lt;/code&gt; 工具的模块化、多仓库（multi-repository）协同开发体系。&lt;/p&gt;
&lt;p&gt;这次改造不仅引入了现代化的版本控制最佳实践，还通过自动化脚本解决了迁移过程中的核心技术难题，最终建立了一套可扩展、高效率的团队协作流程，极大地提升了研发效率与代码质量。&lt;/p&gt;
&lt;h3 id="二-面临的挑战压缩包地狱与单体代码库的困境"&gt;二、 面临的挑战：“压缩包地狱”与单体代码库的困境&lt;/h3&gt;
&lt;p&gt;在项目改造前，我们基于 Rockchip SDK 的产品研发流程正面临着严峻的挑战：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;版本历史缺失：&lt;/strong&gt; SDK 以一个巨大的 &lt;code&gt;.tar.gz&lt;/code&gt; 压缩包分发，代码的任何变更都无法追溯。我们陷入了依赖文件名（如 &lt;code&gt;sdk_v1.2_final_final.tar.gz&lt;/code&gt;）进行版本管理的“地狱模式”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;庞大臃肿的单体仓库：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在此之前，整个 SDK 被塞进一个&lt;strong&gt;单一、巨大的 Git 仓库&lt;/strong&gt;中。&lt;/li&gt;
&lt;li&gt;以Rockchip的SDK为例, RK官方可以提供repo的下载权限,需要公司向RK的代理提交代码访问申请表,审核通过后提供操作人员的ssh公钥.如果不透过这个方式,大概率我们拿到的就会是一个不小的压缩包格式的SDK.&lt;/li&gt;
&lt;li&gt;这种情况下, sdk的克隆耗时极长，代码合并冲突堪称灾难，不同模块的开发者无法独立工作。因此,只能选择一个人或两个人独立负责一个项目, 否则SDK的同步工作将消耗大量时间, 尤其是调试kernel时,需要频繁验证各种设备树的修改甚至驱动和uboot的修改.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协作流程阻塞：&lt;/strong&gt; 代码变更依赖手动打包和传输，极易出错。功能分支、代码审查（Merge Request）等现代协作方式完全无法实施，导致集成阶段痛苦不堪。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限管理混乱：&lt;/strong&gt; 所有开发者都拥有全部代码的访问权限，包括他们无需接触的核心 IP 和敏感组件，存在安全隐患。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新人上手困难：&lt;/strong&gt; 搭建一套新的开发环境是项复杂、耗时数小时的手动任务，常常需要资深工程师介入指导。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="三-我的解决方案分步击破构建现代化研发体系"&gt;三、 我的解决方案：分步击破，构建现代化研发体系&lt;/h3&gt;
&lt;p&gt;我设计并执行了一套分阶段的解决方案，系统性地解决了上述所有痛点。&lt;/p&gt;
&lt;h4 id="第一阶段自动化解析与智能化迁移"&gt;&lt;strong&gt;第一阶段：自动化解析与智能化迁移&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;我没有采用低效且易错的手动迁移，而是开发了一个&lt;strong&gt;强大的 Python 自动化脚本&lt;/strong&gt;作为项目的基石。该脚本实现了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;智能解析复杂清单：&lt;/strong&gt; 自动读取并解析原始 SDK 中相互嵌套的 &lt;code&gt;repo&lt;/code&gt; 清单（&lt;code&gt;.xml&lt;/code&gt;）文件，精准识别出全部 N(一般子仓库数量不会少,否则就不需要repo管理了) 个独立的代码模块。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动化 GitLab 项目创建：&lt;/strong&gt; 调用 GitLab API,并借助PAT(Personal Access Token)，让py脚本在指定的团队空间下为每个模块自动创建对应的、独立的 Git 仓库。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;诊断并“修复”不健康仓库：&lt;/strong&gt; 脚本能自动检测出原始仓库的一个致命问题——许多仓库是“浅克隆”（shallow clone），Git 历史不完整。我的解决方案是：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;对于历史完整的仓库：&lt;/strong&gt; 完整保留其所有分支和标签并推送到 GitLab。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对于历史残缺的仓库：&lt;/strong&gt; 自动将其重新初始化为一个全新的 Git 仓库，并生成一个干净、完整的“初始版本”提交。这步操作是确保后续 &lt;code&gt;repo sync&lt;/code&gt; 能够成功的关键。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统一分支规范：&lt;/strong&gt; 自动将所有 N 个仓库中混乱的默认分支名（如 &lt;code&gt;master&lt;/code&gt;, &lt;code&gt;develop&lt;/code&gt; 等）统一重命名为 &lt;code&gt;main&lt;/code&gt;，为后续的 &lt;code&gt;repo&lt;/code&gt; 清单管理奠定了基础。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="第二阶段gitlab-服务端环境加固"&gt;&lt;strong&gt;第二阶段：GitLab 服务端环境加固&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;为了支撑全新的工作流，我对 GitLab 服务器进行了关键的底层配置：&lt;/p&gt;</description></item><item><title>第二次迭代（2026）：把没有 repo 链路的厂商 SDK 恢复成 N 个 Git 子仓库</title><link>https://potterwhite.github.io/portfolio/embedded-build-infrastructure/salvage-of-sdk/iteration-2-salvage-rk3576/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://potterwhite.github.io/portfolio/embedded-build-infrastructure/salvage-of-sdk/iteration-2-salvage-rk3576/</guid><description>&lt;div class="pageinfo pageinfo-primary"&gt;
&lt;p&gt;从一份经过开发板厂商深度定制过的SDK压缩包，经过整个流程（5份shell脚本+1份python脚本）的处理。&lt;/p&gt;
&lt;p&gt;得到一份可以一键式拉取就可以正确编译出镜像，且镜像能够正常运行的深度修复的由若干（一般几十到一百多个）子仓库组成的SDK代码。&lt;/p&gt;
&lt;/div&gt;
&lt;figure&gt;&lt;a href="https://potterwhite.github.io/2026/sdk-salvage-rk3576/4-verify-sync-summary-fail-2026-08-11.png" target="_blank"&gt;&lt;img src="https://potterwhite.github.io/2026/sdk-salvage-rk3576/4-verify-sync-summary-fail-2026-08-11.png" style="max-width: 100%; height: auto; border-radius: 8px;" alt="`4-verify-sync.sh` 的 6 项断言结果:重建出来的 58 仓库与只读基线逐字节比对。3 项 FAIL 是逐项判定后接受的差异,不是没跑完 —— 每一项的取舍见下文"&gt;&lt;/a&gt;&lt;figcaption style="text-align: center; font-style: italic; margin-top: 0.5em; color: var(--td-sidebar-text-color);"&gt;&lt;code&gt;4-verify-sync.sh&lt;/code&gt; 的 6 项断言结果:重建出来的 58 仓库与只读基线逐字节比对。3 项 FAIL 是逐项判定后接受的差异,不是没跑完 —— 每一项的取舍见下文&lt;/figcaption&gt;&lt;/figure&gt;

&lt;hr&gt;
&lt;h2 id="一做了什么"&gt;一、做了什么&lt;/h2&gt;
&lt;h3 id="输入"&gt;输入&lt;/h3&gt;
&lt;p&gt;厂商给到手的就是一个 tarball,没有任何 repo 链路:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;体积 10G&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer 10G Jul &lt;span style="color:#0000cf;font-weight:bold"&gt;31&lt;/span&gt; 19:44 &amp;lt;share&amp;gt;/02.Products/rk3576/rk3576-linux-6.1_20260709.tar.xz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;.repo&lt;/code&gt; 不存在&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;developer@rk3576-rk3576_ubuntu-22-04:~/sdk/linux/sdk-src/rk3576-linux-6.1-readonly$ find . -name &lt;span style="color:#4e9a06"&gt;&amp;#34;.repo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;developer@rk3576-rk3576_ubuntu-22-04:~/sdk/linux/sdk-src/rk3576-linux-6.1-readonly$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;所有 &lt;code&gt;.git&lt;/code&gt; 都是指向那个不存在的 &lt;code&gt;.repo&lt;/code&gt; 的软链接&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;developer@rk3576-rk3576_ubuntu-22-04:~/sdk/linux/sdk-src/rk3576-linux-6.1-readonly$ find . -name &lt;span style="color:#4e9a06"&gt;&amp;#34;.git&amp;#34;&lt;/span&gt; -exec ls -lhat &lt;span style="color:#ce5c00;font-weight:bold"&gt;{}&lt;/span&gt; &lt;span style="color:#4e9a06"&gt;\;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;28&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:46 ./u-boot/.git -&amp;gt; ../.repo/projects/u-boot.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;32&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:38 ./kernel-6.1/.git -&amp;gt; ../.repo/projects/kernel-6.1.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;27&lt;/span&gt; Nov &lt;span style="color:#0000cf;font-weight:bold"&gt;20&lt;/span&gt; &lt;span style="color:#0000cf;font-weight:bold"&gt;2025&lt;/span&gt; ./rkbin/.git -&amp;gt; ../.repo/projects/rkbin.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;47&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:28 ./external/rknn-toolkit2/.git -&amp;gt; ../../.repo/projects/external/rknn-toolkit2.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;41&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:40 ./external/libmali/.git -&amp;gt; ../../.repo/projects/external/libmali.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;42&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:42 ./external/rknn-llm/.git -&amp;gt; ../../.repo/projects/external/rknn-llm.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;41&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:38 ./external/uvc_app/.git -&amp;gt; ../../.repo/projects/external/uvc_app.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;44&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:42 ./external/minilogger/.git -&amp;gt; ../../.repo/projects/external/minilogger.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;49&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:37 ./external/security/bin/.git -&amp;gt; ../../../.repo/projects/external/security/bin.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;57&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:37 ./external/security/rk_tee_user/.git -&amp;gt; ../../../.repo/projects/external/security/rk_tee_user.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;57&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:37 ./external/security/librkcrypto/.git -&amp;gt; ../../../.repo/projects/external/security/librkcrypto.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;40&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:37 ./external/rockit/.git -&amp;gt; ../../.repo/projects/external/rockit.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;42&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:37 ./external/rkupdate/.git -&amp;gt; ../../.repo/projects/external/rkupdate.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;47&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:37 ./external/rockchip-test/.git -&amp;gt; ../../.repo/projects/external/rockchip-test.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;53&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:38 ./external/camera_engine_rkaiq/.git -&amp;gt; ../../.repo/projects/external/camera_engine_rkaiq.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;42&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:38 ./external/chromium/.git -&amp;gt; ../../.repo/projects/external/chromium.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;46&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:37 ./external/rkwifibt-app/.git -&amp;gt; ../../.repo/projects/external/rkwifibt-app.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;37&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:42 ./external/mpp/.git -&amp;gt; ../../.repo/projects/external/mpp.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;45&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:38 ./external/alsa-config/.git -&amp;gt; ../../.repo/projects/external/alsa-config.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;38&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:39 ./external/dpdk/.git -&amp;gt; ../../.repo/projects/external/dpdk.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;42&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:37 ./external/rkwifibt/.git -&amp;gt; ../../.repo/projects/external/rkwifibt.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;37&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:38 ./external/avs/.git -&amp;gt; ../../.repo/projects/external/avs.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;46&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:42 ./external/rk_pcba_test/.git -&amp;gt; ../../.repo/projects/external/rk_pcba_test.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;50&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:39 ./external/common_algorithm/.git -&amp;gt; ../../.repo/projects/external/common_algorithm.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;37&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:39 ./external/iva/.git -&amp;gt; ../../.repo/projects/external/iva.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;46&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:39 ./external/ethercat_igh/.git -&amp;gt; ../../.repo/projects/external/ethercat_igh.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;41&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:38 ./external/uac_app/.git -&amp;gt; ../../.repo/projects/external/uac_app.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;41&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:37 ./external/samples/.git -&amp;gt; ../../.repo/projects/external/samples.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;43&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:37 ./external/rktoolkit/.git -&amp;gt; ../../.repo/projects/external/rktoolkit.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;43&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:42 ./external/linux-rga/.git -&amp;gt; ../../.repo/projects/external/linux-rga.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;42&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:42 ./external/recovery/.git -&amp;gt; ../../.repo/projects/external/recovery.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;41&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:38 ./external/xserver/.git -&amp;gt; ../../.repo/projects/external/xserver.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;44&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:39 ./external/drm-cursor/.git -&amp;gt; ../../.repo/projects/external/drm-cursor.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;40&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:42 ./external/rkfsmk/.git -&amp;gt; ../../.repo/projects/external/rkfsmk.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;52&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:39 ./external/gstreamer-rockchip/.git -&amp;gt; ../../.repo/projects/external/gstreamer-rockchip.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;44&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:37 ./external/rockit_uvc/.git -&amp;gt; ../../.repo/projects/external/rockit_uvc.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;40&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:33 ./external/rknpu2/.git -&amp;gt; ../../.repo/projects/external/rknpu2.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;27&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:45 ./tools/.git -&amp;gt; ../.repo/projects/tools.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;32&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:35 ./docs/cn/.git -&amp;gt; ../../.repo/projects/docs/cn.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;42&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:36 ./docs/cn/RK3576/.git -&amp;gt; ../../../.repo/projects/docs/cn/RK3576.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;26&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:35 ./docs/.git -&amp;gt; ../.repo/projects/docs.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;38&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:38 ./docs/rtt-docs/.git -&amp;gt; ../../.repo/projects/docs/rtt-docs.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;32&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:37 ./docs/en/.git -&amp;gt; ../../.repo/projects/docs/en.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;42&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:38 ./docs/en/RK3576/.git -&amp;gt; ../../../.repo/projects/docs/en/RK3576.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;39&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:29 ./app/rkpartybox/.git -&amp;gt; ../../.repo/projects/app/rkpartybox.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;34&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:29 ./app/rkadk/.git -&amp;gt; ../../.repo/projects/app/rkadk.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;43&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:28 ./app/ipcweb-backend/.git -&amp;gt; ../../.repo/projects/app/ipcweb-backend.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;34&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:29 ./app/rkipc/.git -&amp;gt; ../../.repo/projects/app/rkipc.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;38&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:28 ./app/lvgl_demo/.git -&amp;gt; ../../.repo/projects/app/lvgl_demo.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;116&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:43 ./prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/.git -&amp;gt; ../../../../../.repo/projects/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;117&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:42 ./prebuilts/gcc/linux-x86/aarch64/arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-elf/.git -&amp;gt; ../../../../../.repo/projects/prebuilts/gcc/linux-x86/aarch64/arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-elf.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;114&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:44 ./prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/.git -&amp;gt; ../../../../../.repo/projects/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;109&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:44 ./prebuilts/gcc/linux-x86/arm/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux/.git -&amp;gt; ../../../../../.repo/projects/prebuilts/gcc/linux-x86/arm/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;40&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:33 ./device/rockchip/.git -&amp;gt; ../../.repo/projects/device/rockchip.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lrwxrwxrwx &lt;span style="color:#0000cf;font-weight:bold"&gt;1&lt;/span&gt; developer developer &lt;span style="color:#0000cf;font-weight:bold"&gt;31&lt;/span&gt; Jun &lt;span style="color:#0000cf;font-weight:bold"&gt;22&lt;/span&gt; 17:29 ./buildroot/.git -&amp;gt; ../.repo/projects/buildroot.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;developer@rk3576-rk3576_ubuntu-22-04:~/sdk/linux/sdk-src/rk3576-linux-6.1-readonly$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="输出"&gt;输出&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;项目&lt;/th&gt;
					&lt;th&gt;结果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;独立 Git 仓库&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;58 个&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;清单仓库&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;default.xml&lt;/code&gt;(manifest),托管在 &lt;code&gt;&amp;lt;server&amp;gt;/&amp;lt;GROUP&amp;gt;/&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;客户端拉取&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;3 条命令&lt;/strong&gt;(&lt;code&gt;repo init&lt;/code&gt; / &lt;code&gt;repo sync -j8 --verify&lt;/code&gt; / &lt;code&gt;repo forall -c 'git lfs pull'&lt;/code&gt;)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;体积&lt;/td&gt;
					&lt;td&gt;编译前 &lt;strong&gt;~28G&lt;/strong&gt;,编译后 &lt;strong&gt;~78G&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;校验&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;4-verify-sync.sh&lt;/code&gt;,&lt;strong&gt;6 项自动断言&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;交付文档&lt;/td&gt;
					&lt;td&gt;纯命令、零理论;&lt;strong&gt;8 类故障 + 对应处置&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;验收&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;同事独立编译 + 烧写,均成功&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="客户端拉取完整无省略"&gt;客户端拉取(完整,无省略)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;repo init -u http://&amp;lt;server&amp;gt;/&amp;lt;GROUP&amp;gt;/manifest.git -b main -m default.xml --no-clone-bundle
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;repo sync -j8 --verify
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;repo start main --all
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;repo forall -c &lt;span style="color:#4e9a06"&gt;&amp;#39;git lfs pull&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;除了 &lt;code&gt;repo start main --all&lt;/code&gt; 之外的三条都不能省。
&lt;code&gt;--verify&lt;/code&gt; 少了会停在 &lt;code&gt;(yes/always/NO)&lt;/code&gt; 交互提示上,默认 NO, 于是 repo hook 不执行、空目录不出现、编译可能直接失败;
&lt;code&gt;git lfs pull&lt;/code&gt; 少了只有 17G 而不是 28G,编译报文件损坏。&lt;/p&gt;</description></item></channel></rss>