不克隆的情况下使用'git submodule add'

11

如何将本地子模块添加到项目中而不必实际克隆其包含的所有文件?我想避免在本地复制我的项目文件。

我知道这种事情是可以做到的,因为当你克隆一个包含子模块的项目时,默认情况下并不会克隆它们。您必须手动完成操作:

git clone url-of-repo-containing-submodules.git
git submodule init sub-mod
git submodule update --remote

假设我有一个名为meta-project的 git 仓库,其中包含一个外部源代码仓库lib-sobmodule

我可以通过一些技巧来避免文件重复:

cd /path/to/metaproject
git submodule add ../path/to/lib-sobmodule
git commit -m "lib-sobmodule added..."
git push
cd .. && rm -rf meta-project
git clone url-of-meta-project.git

看哪!我的桌面上没有重复的lib-sobmodule文件。但这并不是一个好的解决方法,因为它需要将所有东西导入/导出到git远程...

有没有一种选项或方法可以防止克隆本地项目而不必复制其中包含的所有文件?

免责声明:这几乎是一个克隆问题,参考Is there a way to git submodule add a repo without cloning it?。但是由于答案专注于30K git子模块要求,对我在此描述的更常见用例没有给出令人满意的解决方案。


1
在我的经验中,git子模块只在极少数情况下是一个好的解决方案,而且我发现它们实际上很难使用。虽然今天可能有更好的工具,但问题是,你是否正在寻找错误的工具?考虑更详细地解释您的问题和工具集,看看其他人能否找到更好的解决方案。 - Thorbjørn Ravn Andersen
1个回答

2
由于其旨在克隆主项目内的模块,因此没有干净的解决方案。添加没有关联源代码的子模块是没有意义的。也许在metaproject/submoduledir中执行cat .git会使您对这个机制产生信心。
然而,我理解您的目的,并找到了两种“解决”此问题的方法:
1. 不要添加本地子模块。相反,为该模块创建一个远程并将此远程作为子模块添加到您的主项目中。只要不初始化和更新子模块,代码就不会被本地重复。 2. 第二种方法有点“肮脏”,但如果您不想为子模块创建远程,则可能很有用。您只需要像已经做的那样添加子模块,然后在该子模块上运行git deinit命令。只要您不再次初始化子模块,Git就会保持沉默。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接