如何克隆GIT存储库列表?

Kev*_*gem 4 git git-clone

我有70多个GIT repo URL(学生)列表.是否有任何功能允许我一次克隆它们?

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

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

kos*_*tix 9

Shell脚本.

获得回购

获得回购的主要想法是

while read repo; do
    git clone "$repo"
done < repolist.txt
Run Code Online (Sandbox Code Playgroud)

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

更新回购

这个比较棘手.

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

接下来,是自动的"同步"是一个有争议的问题在这里:当你做git fetch origin一个"正常"克隆回购,远程分支可以与他们的新内容进行更新,并因此几乎1完全同步.请注意,您的本地分支根本不会被触及.那是因为您可能已完成本地工作,因此您必须决定如何协调远程分支的更新状态与本地分支(如果有的话).这只是Git假设的默认工作模型,因为这是大多数情况下所需要的.

相反,如果你不打算在那些回购的分支上做任何工作,并且它们仅供检查,最简单的方法是让Git根本没有远程分支.

为此,您可以使用几个显式步骤进行克隆:

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

    git init <dirname>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在那里配置远程:

    git remote add --mirror=fetch origin <url>
    
    Run Code Online (Sandbox Code Playgroud)

    --mirror=fetch通知的Git设置什么就取什么用其有力地覆盖与远程东西所有地方的东西的方式获取的数据更新的映射.

  3. 获取所有数据 - 覆盖本地的所有内容:

    git fetch -u origin
    
    Run Code Online (Sandbox Code Playgroud)

    -u(或--update-head-ok)允许GIT中覆盖分支通过指向HEAD参考.这会从索引和工作树的脚部拉出地毯,但我们将在下一步补偿这一点.

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

    git reset --hard HEAD
    
    Run Code Online (Sandbox Code Playgroud)

    这使得Git用指向的分支的最新状态覆盖索引和工作树HEAD- 通常是"master"但是如果你检查另一个分支(见下文)它显然会使用那个.

然后,要在下次执行时更新数据:

git fetch -u origin
git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)

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

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

git branch -a
Run Code Online (Sandbox Code Playgroud)

...然后观察清单并选择一个分支

git checkout <that_branch>
Run Code Online (Sandbox Code Playgroud)

将工作.

在本质上,所有这些都需要显式的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
Run Code Online (Sandbox Code Playgroud)

1远程仓库中删除的分支不会在本地删除.要做到这一点,你必须运行git remote prune origin.