如何克隆GIT存储库列表?

时间:2015-11-11 11:32:09

标签: git git-clone

我有70多个GIT回购网址(学生)的列表。是否有任何功能可以让我一次克隆它们?

将存储库与服务器同步会有相同的效果吗?

如果没有,我想我需要写一个快速的shell脚本才能做到这一点。

2 个答案:

答案 0 :(得分:7)

Shell脚本。

获取回购

获得回购的主要想法是

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

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

更新回购

这个比较棘手。

虽然很容易迭代回购列表, 有“同步”的概念问题。 它的本质在于,当你克隆“正常”方式时 - 也就是说,没有指定修改git clone默认值的不同时髦命令行选项 - 源代表的所有分支最终都是在表单中创建的在您的本地回购中所谓的“远程分支”。 那些远程分支仅跟踪源仓库中匹配分支的状态。然后获取在源代表中指定为“当前”的单个分支,并从中创建本地(即,仅您的)分支。这就是为什么当你克隆一个拥有100个分支的回购时,你最终只有一个本地分支(在99.9%的情况下是“主”)。

接下来,自动“同步”在这里是一个没有实际意义的点:当你在“正常”克隆的回购中执行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”但是你应该检查另一个分支(见下文)它会 显然使用那个。

  5. 然后,下次更新数据时:

    git fetch -u origin
    git reset --hard HEAD
    

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

    如果你需要查看另一个分支,通常

    git branch -a
    

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

    git checkout <that_branch>
    

    会奏效。

    在本质上,由于--mirror选项,需要以明确的repo初始化和以特殊方式添加遥控器的所有舞蹈 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 远程仓库中删除的分支不会在本地删除。为此,您必须运行git remote prune origin

答案 1 :(得分:1)

你可以创建一个超级项目&#34;其中包括所有提及的Git repos submodules(另请参阅Git SCM book),或使用repo之类的工具,它使用清单来管理所有存储库。