假设我有以下项目树:
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