Git repo其中每个子模块是同一个repo的一个分支.如何避免双/三…下载与git clone –recursive?

假设我有以下项目树:

src
data
doc

我想将所有文件夹保存在Git存储库中,发布到Gitlab.但我不想跟src一起跟踪数据和doc.

所以我使用以下策略:

git remote add origin ADDRESS
git submodule add -b data ADDRESS data
git submodule add -b doc ADDRESS doc

它实际上工作正常,除非我尝试使用以下命令复制存储库:

git clone --recursive ADDRESS

所有对象都被传输3次:root和data都包含:

> origin / master
>原产地/数据
> origin / doc

有一种简单的方法可以避免这种情况吗?只是为了澄清我的想法:

>主存储库应该只获取origin / master,而不是其他两个
>数据子模块应该只获取原点/数据.
> doc子模块应该只获取origin / doc.

使用3个独立的存储库很容易实现,但这太麻烦了,因为我将这种方法应用于多个项目.

UPDATE

this answer开始的git worktree允许我手动实现我想要的.

但现在,而不是自动方法(消耗4倍带宽):

git clone --recursive git@foo:foo/bar.git

我要做:

git clone git@foo:foo/bar.git
cd bar
git worktree add data origin/data
git worktree add src/notebooks origin/notebooks
git worktree add doc origin/doc
git worktree add reports origin/reports

我可以用一些脚本自动化这个过程,因为.gitmodules文件已经包含完整的信息:

[submodule "data"]
    path = data
    url = git@foo:foo/bar.git
    branch = data
[submodule "src/notebooks"]
    path = src/notebooks
    url = git@foo:foo/bar.git
    branch = notebooks
[submodule "doc"]
    path = doc
    url = git@foo:foo/bar.git
    branch = doc
[submodule "reports"]
    path = reports
    url = git@foo:foo/bar.git
    branch = reports

我想知道是否已经有一些标准的git脚本或标志处理这个?

最佳答案 Git旨在分发,这意味着每个用户都应该拥有完整的历史记录和所有分支.如果您想拥有一个裸存储库,但需要使用不同的工作树来减少网络流量,可以使用git worktree命令:

所以在你的情况下,假设你有一个src文件夹作为src分支的主文件夹,从中创建其他两个应该像它一样简单

git worktree add ../data data
git worktree add ../doc doc

请参阅这个非常棒的答案https://stackoverflow.com/a/30185564/3066081以获取有关此命令的更多信息.但是如果你有一个没有worktree支持的旧git,你可以使用git-new-workdir脚本作为

git-new-workdir project-dir new-workdir branch

这也在Multiple working directories with Git?中描述

点赞