我有两个代码库A和B并已开始开发应用程序M。所有这三个都存储在它们自己的存储库中。
我的问题是我有一个依赖项,因此A使用子模块B,但M使用子模块A和B。
据我所知,对于同一个主项目,我将拥有同一个子模块B的两个副本。但是(在此设置中)它们不同是没有意义的,因为它们代表同一个应用程序中的同一个库。
有没有办法解决这个问题,这样当我在M上工作时,我只有一个A和B的副本?
我有两个代码库A和B并已开始开发应用程序M。所有这三个都存储在它们自己的存储库中。
我的问题是我有一个依赖项,因此A使用子模块B,但M使用子模块A和B。
据我所知,对于同一个主项目,我将拥有同一个子模块B的两个副本。但是(在此设置中)它们不同是没有意义的,因为它们代表同一个应用程序中的同一个库。
有没有办法解决这个问题,这样当我在M上工作时,我只有一个A和B的副本?
M--/
|-- A
| |-- B
|
|-- B
只需M/B
从中删除子模块M
,然后保留/使用M/A/B
.
原因:
A
子模块(一个独立的存储库),它必须需要B
一些东西。M
存储库,您可以教它使用M/A/B
.据我了解,您的应用程序 M hierarсhy 是这样的:
M /
|- A /
|- B
因此,要将子模块B添加到A,您应该这样做(在文件夹 A 中)
git submodule add git@github.com:username/B.git
对于应用程序M,您应该执行相同的操作,但使用现有B的路径(在文件夹 M 中)
git submodule add git@github.com:username/B.git A/B
在此处查看Guenther Bunthaler的非常详细的答案
该方法是通过将 .git 工作目录移到彼此的项目目录层次结构之外来展平目录以独立工作。
M/
A/
B/
哪里有指向和M/
的反向链接子模块。
并且有一个反向链接子模块到.A/
B/
A/
B/
总的来说,在您确保所有子模块更改都已提交并推送后,
cd M/A
git submodule deinit -- B
rm -rf .git/modules/B
git mv -- B ../../
cd ..
git submodule deinit -- A
rm -rf .git/modules/A
git mv -- A ../
git submodule deinit -- B
rm -rf .git/modules/B
git mv -- B ../
echo "gitdir: A/.git" > "A/.git"
echo "gitdir: B/.git" > "B/.git"
cd ../A
echo "gitdir: B/.git" > "B/.git"