如何克隆GIT仓库列表?

cigdeys3  于 2023-04-19  发布在  Git
关注(0)|答案(3)|浏览(131)

我有一个70多个GIT repo URL的列表(学生)。是否有任何功能可以让我一次克隆所有这些URL?
将存储库与服务器同步是否也是如此?
如果没有,我想我需要写一个快速的shell脚本来做到这一点。

ogq8wdun

ogq8wdun1#

Shell脚本。

获取仓库

获得回购的主要想法是

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

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

更新仓库

这一个比较棘手。
虽然迭代仓库列表很容易,但“同步”存在一个概念上的问题。它的本质根源在于当你以“正常”的方式克隆时-也就是说,不指定不同的时髦命令行选项修改git clone的默认值-源存储库的所有分支最终都以所谓的“远程分支”的形式在您的本地存储库中创建。这些远程分支只跟踪源仓库中匹配分支的状态。然后,获取源仓库中指定为“当前”的单个分支,并从中创建一个 * 本地 *(即仅限您的)分支。这就是为什么当您克隆一个拥有100个分支的仓库时,最终只有一个本地分支(在99.9%的情况下是“主”分支)。
接下来,自动“同步”在这里是一个有争议的问题:当你在一个“正常”克隆的repo中执行git fetch origin时,远程分支会用它们的新内容进行更新,因此几乎是完全同步的。请注意,你的本地分支根本不会被触及。这是因为你可能在它们上完成了你的本地工作,所以你必须决定如何将远程分支的更新状态与你的本地分支协调一致,这只是Git默认的工作模型,因为这是大多数情况下所需要的。
相反,如果你不打算在这些仓库的分支上做任何工作,并且它们只用于检查,那么最简单的方法就是让Git完全没有远程分支。
要执行此操作,请使用以下几个显式步骤进行克隆:
1.初始化空存储库:

git init <dirname>

1.在此处配置远程:

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

--mirror=fetch告诉Git设置要获取的内容与要更新的内容之间的Map,以强制用远程内容覆盖所有本地内容。
1.获取所有数据-覆盖所有本地数据:

git fetch -u origin

-u(或--update-head-ok)允许Git覆盖HEAD引用所指向的分支。这会破坏索引和工作树,但我们将在下一步中对此进行补偿。
1.使用新数据强制更新索引和工作树:

git reset --hard HEAD

这使得Git用HEAD所指向的分支的最新状态覆盖索引和工作树-通常是“master”,但如果您 checkout 另一个分支(见下文),它显然会使用该分支。
然后,要在下次执行此操作时更新数据,请执行以下操作:

git fetch -u origin
git reset --hard HEAD

然后研究工作树中的内容。
如果您需要查看另一个分支,通常的

git branch -a

。。。观察名单,挑一个分支,然后

git checkout <that_branch>

会成功的
本质上,所有这些都需要显式的repo初始化和以特殊的方式添加远程,因为git clone--mirror选项意味着创建一个裸存储库,而我们应该想要一个正常的存储库(我认为)。
要更新目录中的所有存储库,请执行以下操作

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

zynd9foi

zynd9foi2#

你可以创建一个“超级项目”,将所有提到的Git仓库都包含在submodules中(另请参阅Git SCM book),或者使用像repo这样的工具,使用清单来管理所有仓库。

kpbpu008

kpbpu0083#

#! /bin/sh
while IFS= read -r line; do
    echo $line
    git clone https://your-git-repo-link/"$line".git
done < cat.txt

cat.txt包含存储库名称列表。
客户服务
设备交换
平台停机时间

相关问题