<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Repo on Hacper&#39;s Blog</title>
    <link>https://hacperme.com/tags/repo/</link>
    <description>Recent content in Repo on Hacper&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh</language>
    <lastBuildDate>Mon, 27 Dec 2021 08:00:12 +0800</lastBuildDate>
    <atom:link href="https://hacperme.com/tags/repo/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>在 windows 平台上 使用 git 多仓库管理工具 repo</title>
      <link>https://hacperme.com/posts/notes/2021-12-27-git_repo_on_windows/</link>
      <pubDate>Mon, 27 Dec 2021 08:00:12 +0800</pubDate>
      <guid>https://hacperme.com/posts/notes/2021-12-27-git_repo_on_windows/</guid>
      <description>repo 介绍 一个大型项目通常会有多个仓库构成，比如 Android 项目，通过 manifest 清单（xml 文件）定义一个项目中各个 git 代码仓库的关联，而 repo 就是在这种项目组织方式下</description>
      <content:encoded><![CDATA[<p><img loading="lazy" src="https://images.hive.blog/DQmSGXHJfKaAaVnF2r9UguGKRsASW67yL7RErYrTEpJqfTk/photo-1640012249194-ac74a4d7c03a.jpg" alt="photo-1640012249194-ac74a4d7c03a.jpg"  />
</p>
<h2 id="repo-介绍">repo 介绍</h2>
<p>一个大型项目通常会有多个仓库构成，比如 Android 项目，通过 manifest 清单（xml 文件）定义一个项目中各个 git 代码仓库的关联，而 repo 就是在这种项目组织方式下的一个用于多仓库协同开发和代码评审的一个客户端工具。</p>
<p>repo 是使用 python 开发实现的，需要安装 python 才能运行，repo 可以用于下载和提交代码，以及对多个代码仓库同时执行 git 命令，在他的官网上可以找到更多关于repo的介绍资料：<a href="https://gerrit.googlesource.com/git-repo/+/HEAD/README.md">https://gerrit.googlesource.com/git-repo/+/HEAD/README.md</a>。</p>
<h2 id="windows-系统使用-repo">Windows 系统使用 repo</h2>
<p>原始的 Google repo 工具仅支持在 Linux 系统下运行，现在支持 python 2 和 python 3，但无法在 Windows 上使用，这使得一些在 Windows 系统环境下开发的项目使用 repo 不太方便。</p>
<p>如果需要在Windows下使用，可以使用第三方的 <a href="https://github.com/esrlabs/git-repo">esrlabs repo</a>，按照官网介绍下载安装repo，并添加环境变量就可以使用了，目前仅支持 python2，esrlabs repo 的命令参数兼容原始的google repo，这算是 Windows 下使用 repo 的一个替代方案。如果使用的是 Windows 10，还可以在 Windows 10 的Linux 子系统下安装原始 repo，在 Linux 子系统进行多仓库管理，这是第二个方案。第三个方案是使用 go 语言开发 git-repo 替代 repo，下面介绍 git-repo 的安装和使用。</p>
<h2 id="git-repo-介绍和使用示例">git-repo 介绍和使用示例</h2>
<p>git-repo 是一个使用 go 编写的仓库管理工具，与原始 repo 相比，支持 Windows、Mac 和 Linux 系统，除了git，没有其他软件依赖，兼容多数原始的 repo 命令，速度也比 python 编写的 repo 快，所以在 Windows 平台上 git-repo 算是一个很好的替代原始 repo 的选择，它的官网地址为：<a href="https://git-repo.info/zh_cn/">https://git-repo.info/zh_cn/</a>，可以了解更多信息。</p>
<ol>
<li>安装</li>
</ol>
<p>在 <a href="https://git-repo.info/zh_cn/download/">https://git-repo.info/zh_cn/download/</a> 下载对应平台的二进制执行文件，然后将其添加到环境变量。</p>
<p>在 Windows上打开 git bash，能够正确执行 git repo version 命令说明安装好了。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ git repo version
</span></span><span class="line"><span class="cl">git-repo version 0.7.8
</span></span><span class="line"><span class="cl">git version 2.22.0.windows.1
</span></span></code></pre></td></tr></table>
</div>
</div><ol start="2">
<li>使用示例</li>
</ol>
<p>git-repo 在使用上是作为 git 的一个子命令 git repo 来使用的，在 git repo 后面输入命令参数。</p>
<p>初始化项目：git repo init -u &lt; manifest-url&gt;</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ git repo init -u git@gitee.com:qioixiy/manifests.git
</span></span><span class="line"><span class="cl">Warning: Permanently added the ECDSA host key <span class="k">for</span> IP address <span class="s1">&#39;212.64.62.183&#39;</span> to the list of known hosts.
</span></span><span class="line"><span class="cl">remote: Enumerating objects: 17, <span class="k">done</span>.
</span></span><span class="line"><span class="cl">remote: Total <span class="m">17</span> <span class="o">(</span>delta 0<span class="o">)</span>, reused <span class="m">0</span> <span class="o">(</span>delta 0<span class="o">)</span>, pack-reused <span class="m">17</span>
</span></span><span class="line"><span class="cl">Unpacking objects: 100% <span class="o">(</span>17/17<span class="o">)</span>, <span class="k">done</span>.
</span></span><span class="line"><span class="cl">From gitee.com:qioixiy/manifests
</span></span><span class="line"><span class="cl"> * <span class="o">[</span>new branch<span class="o">]</span>      master     -&gt; origin/master
</span></span><span class="line"><span class="cl">Note: checking out <span class="s1">&#39;20dd4a7db47f19b7e59f4e880a46ac9732cd4986&#39;</span>.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">You are in <span class="s1">&#39;detached HEAD&#39;</span> state. You can look around, make experimental
</span></span><span class="line"><span class="cl">changes and commit them, and you can discard any commits you make in this
</span></span><span class="line"><span class="cl">state without impacting any branches by performing another checkout.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">If you want to create a new branch to retain commits you create, you may
</span></span><span class="line"><span class="cl"><span class="k">do</span> so <span class="o">(</span>now or later<span class="o">)</span> by using -b with the checkout <span class="nb">command</span> again. Example:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  git checkout -b &lt;new-branch-name&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">HEAD is now at 20dd4a7 Add trac into dev-env
</span></span><span class="line"><span class="cl">Switched to a new branch <span class="s1">&#39;default&#39;</span>
</span></span><span class="line"><span class="cl">NOTE: Your identity is: hacper &lt;git&gt;
</span></span><span class="line"><span class="cl">NOTE: If you want to change this, please re-run <span class="s1">&#39;git repo init&#39;</span> with --config-name
</span></span><span class="line"><span class="cl">NOTE: repo has been initialized in G:<span class="se">\W</span>orkspace<span class="se">\f</span>sl
</span></span><span class="line"><span class="cl">&lt;/git&gt;&lt;/new-branch-name&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><p>初始化成功会有一个 .repo 隐藏目录。</p>
<p>同步代码：git repo sync</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ git repo sync
</span></span><span class="line"><span class="cl">remote: Enumerating objects: 315, <span class="k">done</span>.
</span></span><span class="line"><span class="cl">remote: Enumerating objects: 6069, <span class="k">done</span>.
</span></span><span class="line"><span class="cl">remote: Total <span class="m">315</span> <span class="o">(</span>delta 0<span class="o">)</span>, reused <span class="m">0</span> <span class="o">(</span>delta 0<span class="o">)</span>, pack-reused <span class="m">315</span>
</span></span><span class="line"><span class="cl">Receiving objects: 100% <span class="o">(</span>315/315<span class="o">)</span>, 120.01 KiB <span class="p">|</span> 278.00 KiB/s, <span class="k">done</span>.
</span></span><span class="line"><span class="cl">Resolving deltas: 100% <span class="o">(</span>126/126<span class="o">)</span>, <span class="k">done</span>.
</span></span><span class="line"><span class="cl">From https://gitee.com/qioixiy/shell.profileiB <span class="p">|</span> 262.00 KiB/s
</span></span><span class="line"><span class="cl"> * <span class="o">[</span>new branch<span class="o">]</span>      master     -&gt; gitee_qioixiy/master
</span></span><span class="line"><span class="cl">remote: Total <span class="m">6069</span> <span class="o">(</span>delta 0<span class="o">)</span>, reused <span class="m">0</span> <span class="o">(</span>delta 0<span class="o">)</span>, pack-reused <span class="m">6069</span>
</span></span><span class="line"><span class="cl">Receiving objects: 100% <span class="o">(</span>6069/6069<span class="o">)</span>, 2.35 MiB <span class="p">|</span> 497.00 KiB/s, <span class="k">done</span>.
</span></span><span class="line"><span class="cl">Resolving deltas: 100% <span class="o">(</span>4069/4069<span class="o">)</span>, <span class="k">done</span>.
</span></span><span class="line"><span class="cl">From https://gitee.com/qioixiy/git-repo
</span></span><span class="line"><span class="cl"> * <span class="o">[</span>new branch<span class="o">]</span>      main       -&gt; gitee_qioixiy/main
</span></span><span class="line"><span class="cl"> * <span class="o">[</span>new branch<span class="o">]</span>      master     -&gt; gitee_qioixiy/master
</span></span><span class="line"><span class="cl">ERROR: 404: bad ssh_info response of <span class="s1">&#39;http://gitee.com/ssh_info&#39;</span>
</span></span><span class="line"><span class="cl">NOTE: fail to check remote server, you may need to install gerrit hooks by hands
</span></span><span class="line"><span class="cl">ERROR: fail to load remotes: gitee_qioixiy
</span></span><span class="line"><span class="cl">Note: checking out <span class="s1">&#39;d7399d9ca2cfe40dcee22f0ea6ce0cdd283e5a78&#39;</span>.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">You are in <span class="s1">&#39;detached HEAD&#39;</span> state. You can look around, make experimental
</span></span><span class="line"><span class="cl">changes and commit them, and you can discard any commits you make in this
</span></span><span class="line"><span class="cl">state without impacting any branches by performing another checkout.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">If you want to create a new branch to retain commits you create, you may
</span></span><span class="line"><span class="cl"><span class="k">do</span> so <span class="o">(</span>now or later<span class="o">)</span> by using -b with the checkout <span class="nb">command</span> again. Example:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  git checkout -b &lt;new-branch-name&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">HEAD is now at d7399d9 update home_dot/files/.profile_priv.
</span></span><span class="line"><span class="cl">Note: checking out <span class="s1">&#39;6a2f4fb39073a4e2e6824d5f2f4a1cbf5fe4b766&#39;</span>.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">You are in <span class="s1">&#39;detached HEAD&#39;</span> state. You can look around, make experimental
</span></span><span class="line"><span class="cl">changes and commit them, and you can discard any commits you make in this
</span></span><span class="line"><span class="cl">state without impacting any branches by performing another checkout.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">If you want to create a new branch to retain commits you create, you may
</span></span><span class="line"><span class="cl"><span class="k">do</span> so <span class="o">(</span>now or later<span class="o">)</span> by using -b with the checkout <span class="nb">command</span> again. Example:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  git checkout -b &lt;new-branch-name&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">HEAD is now at 6a2f4fb repo init: Added --no-partial-clone and made it persist. Bumped version to 2.14.
</span></span><span class="line"><span class="cl">&lt;/new-branch-name&gt;&lt;/new-branch-name&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><p>下载代码成功结果如下：</p>
<p><img loading="lazy" src="https://cdn.jsdelivr.net/gh/hacperme/picx_hosting/raw/master/20211226/xxx.7dh4nlz4oew0.png" alt=""  />
</p>
<p>创建新分支：git repo start &ndash;all new_branch_name</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ git repo start --all fea/test
</span></span><span class="line"><span class="cl">Switched to a new branch <span class="s1">&#39;fea/test&#39;</span>
</span></span><span class="line"><span class="cl">Switched to a new branch <span class="s1">&#39;fea/test&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>提交代码： git repo upload</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
