嵌套存储库并独立制作它们pullable/deployable?

Nesting repositories and make them independently pullable/deployable?

我不确定以下做法是否合理(如果不合理,我将不胜感激)但我希望嵌套存储库的结构与下面的树类似。

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

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

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

虽然我可以将其作为带有子目录的单个存储库来完成,但我希望所有这些子项目都是 'independent',这意味着能够单独提取它们,甚至可以单独部署它们以供我练习目的。

到目前为止,我尝试独立初始化它们,但我认为这对我来说不是我正在寻找的东西(即我仍然无法从 GitHub 如此初始化的子目录中提取)。

我也查看了 submodules,但除非我错了,否则我认为它们不是我正在尝试做的事情的正确选择。

这是可行的吗?

I would as well like to have this same (mirroring) tree structure in GitHub for the same reasons described above, rather than having multiple GH repos.

实现这一点的方法是将所有历史记录放在一个 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。现在您已经有了一个新克隆的存储库,将您所有的独立项目历史记录作为子模块,全部放在一个整洁的包中。