问题描述
我不确定以下操作是否合理(如果不是,希望得到告知),但我希望嵌套存储库的结构类似于我下面的树。
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
。现在,您拥有一个全新克隆的存储库,将您所有的独立项目历史记录作为子模块,全部放在一个整洁的包中。