嵌套存储库并使它们独立可拉取/可部署?

问题描述

我不确定以下操作是否合理(如果不是,希望得到告知),但我希望嵌套存储库的结构类似于我下面的树。

github
│
└── main-repo
    ├── django
    │   ├── django-project-1
    │   └── django-project-2
    └── react
        ├── react-project-1
        └── react-project-2

这背后的想法是在我的计算机中为我的练习项目建立一个集中目录,便于查找、访问和维护。

出于上述相同的原因,我也希望在 GitHub 中拥有相同的(镜像)树结构,而不是拥有多个 GH 存储库。

虽然我可以将其作为带有子目录的单个存储库来实现,但我希望所有这些子项目都是“独立的”,这意味着能够单独拉取它们,甚至出于实践目的单独部署它们。

>

到目前为止,我尝试独立初始化它们,但我认为这对我没有什么我想要的(即我仍然无法从 GitHub 中提取一个如此初始化的子目录)。

我也看过submodules,但除非我错了,否则我认为它们不是我想要做的事情的正确选择。

这是可行的吗?

解决方法

出于上述相同的原因,我也希望在 GitHub 中拥有相同的(镜像)树结构,而不是拥有多个 GH 存储库。

这样做的方法是将所有历史记录放在一个 repo 中,并将它们作为子模块检出。这就是你所拥有的,以及子模块是什么:你感兴趣的独立更新的历史,作为一些更大的努力的一部分。 helper 命令没有自动化,但设置很简单。

所以这是一个完整的重置,它构建了你描述的 repo 设置,同时避免假设任何你没有在此处指定的细节,以使下面的命令无论如何都可以工作。

cd `mktemp -d`; git init         # we're going to build a specific branch setup
(cd /path/to/main-repo; find -name .git -prune -o -print | cpio -pd ~-)  
for d in {django,react}/*-project-*; do 
        (cd $d; git init; git add .; git commit -m-)
        git submodule add ./$d
done

现在您已经完成了嵌套存储库设置,但是每个项目都添加为一个子模块。要将历史记录提升到您的主存储库中,

for d in {django,react}/*-project-*; do 
        git fetch ./$d
        git branch ${d##*/} FETCH_HEAD
done

现在您的项目存储库中的每个签出提示都有一个完美的普通分支。编辑 .gitmodules 文件并将所有 url 设置为 ./ 只是为了清洁。

现在提交结果。

当你克隆这个构建的 repo 时,你会得到主分支和每个子模块的分支,即项目历史。要设置子目录又名项目又名项目子模块,

git worktree add django/django-project-1 django-project-1
# etc.

或者像上面那样自动化,

for d in {django,react}/*-project-*/; do
        git worktree add $d ${d##*/}
done

在这里的任何地方都可以执行 git submodule init。现在,您拥有一个全新克隆的存储库,将您所有的独立项目历史记录作为子模块,全部放在一个整洁的包中。