如何克隆 GIT 个存储库列表?

How to clone a list of GIT repositories?

我有一个包含 70 多个 GIT 回购 URL(学生)的列表。有什么功能可以让我一次克隆它们吗?

将存储库与服务器同步是否相同?

如果没有,我想我需要编写一个快速 shell 脚本才能执行此操作。

Shell 脚本。

获取回购协议

获得回购的主要想法是

while read repo; do
    git clone "$repo"
done < repolist.txt

假设文件 "repolist.txt" 每行包含一个 repo URL。

正在更新存储库

这个比较棘手。

虽然遍历回购列表很容易, "synchronizing" 存在 概念性 问题。 它的本质在于,当您克隆 "normal" 方式时——也就是说,不指定不同的时髦命令行选项来修改 git clone 的默认值——源代码库的所有分支最终都在在您生成的本地回购中所谓的 "remote branches" 的形式。 这些远程分支仅跟踪源代码库中匹配分支的状态。然后采用在源代码库中指定为 "current" 的单个分支,并从中创建一个 local(即,仅属于您的)分支。这就是为什么当你克隆一个有 100 个分支的 repo 时你最终只有一个本地分支(在 99.9% 的情况下是 "master")。

接下来,自动 "synchronization" 在这里是一个有争议的点:当你在 "normally" 克隆的 repo 中执行 git fetch origin 时,远程分支会更新它们的新内容并且因此几乎1 完全同步。 请注意,您的本地分支机构根本没有被触及。 那是因为你可能已经对它们进行了本地工作, 所以你必须决定你想如何协调更新的 远程分支机构与本地分支机构的状态(如果有的话)。 这只是 Git 假定的默认工作模型,因为这就是 大多数情况下需要。

相反,如果您不打算在这些回购协议的分支上做任何工作, 它们仅供检查,最简单的方法是 使 Git 完全没有远程分支。

为此,您使用几个明确的步骤进行克隆:

  1. 初始化一个空存储库:

    git init <dirname>
    
  2. 在那里配置遥控器:

    git remote add --mirror=fetch origin <url>
    

    --mirror=fetch 告诉 Git 设置要获取的内容的映射 以一种有力的方式用获取的数据更新什么 用远程内容覆盖所有本地内容。

  3. 获取所有数据——覆盖所有本地数据:

    git fetch -u origin
    

    -u(或--update-head-ok)允许Git覆盖分支 由 HEAD 引用指向。这把地毯从脚上拉下来 索引和工作树,但我们将在下一步中对此进行补偿。

  4. 使用新数据强制更新索引和工作树:

    git reset --hard HEAD
    

    这使得 Git 使用 HEAD 指向的分支的最新状态覆盖索引和工作树 — 通常 "master" 但您应该检查另一个分支出来(见下文)它将 显然用那个。

然后,下次更新数据:

git fetch -u origin
git reset --hard HEAD

然后研究工作树中的内容。

如果需要查看其他分支,通常

git branch -a

...观察列表并选择一个分支,然后

git checkout <that_branch>

会起作用。

在本质上,所有这些都需要显式 repo 初始化和以特殊方式添加远程,因为 --mirror 选项 git clone 意味着创建一个裸存储库,我们应该想要 一个正常的(我认为)。

要更新目录中的所有存储库,请执行

find "$root_dir" -mindepth 1 -maxdepth 1 -type d -print \
    | while read repo; do \
        cd "$repo" && \
        git fetch -u origin && \
        git reset --hard HEAD \
      done

1 远程repo删除的分支,本地没有删除。为此,您必须 运行 git remote prune origin.

您可以创建一个 "super project",其中包括所有提到的 Git 存储库,如 submodules (also see the Git SCM book), or use a tool like repo,使用清单来管理所有存储库。