将git仓库转换为子模块并将.git目录移动到超级仓库

5

我有一个超级仓库和几个子模块:

MY_SUPER_REPO

  • my_sub_1
  • my_sub_2

现在,我正在创建一个新目录,它将成为一个子模块:

  • my_dir_3

当我准备好将其变成子仓库时,我执行以下操作:

git init
git remote add origin URL

我接下来会进入超级仓库并执行以下操作。
git submodule add URL

现在,gitmodules已相应更新,但是.git文件夹仍然位于my_dir_3中,并且当我在该子模块中工作时,似乎是从这里获取钩子,而不是超级版本库的.git/modules/xyz目录。我运行一个脚本将钩子复制到我的超级版本库的.git/modules/xyz中,但由于本地的.git文件夹存在于添加的子模块中,因此超级版本库中的钩子未被使用。
是否有“神奇”的命令来解决这个问题,或者我需要手动复制.git

你使用的 Git 版本是什么?(只是为了检查这是否是后来修复的错误) - VonC
我认为这与版本无关,可能只是实现方式的问题。我正在使用最新版本之一:2.10.1。 - Henrik
2个回答

3
您可以稍微调整您的操作步骤:
  • 首先,您需要添加一个远程URL (git remote add origin URL),然后将新的repo推送到其远程目标
  • 然后删除该文件夹
  • 最后,按照惯例添加子模块 (git submodule add URL)
这样,您就可以确保子模块被正确初始化,并且其.git位于正确位置。

0

根据您的问题,我回答了我所理解的内容。如果您需要其他帮助,请在评论区留言。

假设您正在创建一个新目录,该目录后来将成为子模块。如果您不想跟踪此目录中的更改,则将其添加到超级仓库的 .gitignore 文件中。现在,假设您决定将其作为子模块,从超级仓库开始操作。

1)从 .gitignore 中删除该目录

2)初始化 my_dir_3

git init

3)将子模块添加到超级仓库中

git submodule add module_name

子模块已添加到超级仓库中。要使用子模块(至少在你的情况下),需要了解以下几点:

1)您的超级仓库也应该是一个 Git 仓库。

2)Git 将子模块视为 Git 中的不同实体,这意味着模块中的更改不会反映在另一个模块中。例如,my_sub_1 中的提交不会反映在 my_sub_2 中。

3)一旦将其作为子模块添加,Git 将开始跟踪 my_sub_3 作为一个单独的项目。

4) 在添加子模块后,“git status”应该会显示.gitmodules,你会注意到所有的子模块都在.gitmodules里。

5) 这就是关于git子模块的有趣部分,假设你在my_sub_3中进行了一些更改,Git将其视为子模块,并且当你不在该目录中时不跟踪其内容。

因此,如果你离开该目录,则不会跟踪更改。如果你在这个阶段提交,它将被视为超级仓库的一部分而不是my_sub_3。

最后,

子模块不应与远程混淆,远程是同一项目的其他存储库;子模块是指您想要成为源树一部分的不同项目,而两个项目的历史仍然完全独立,您无法从主项目内修改子模块的内容。

你可能想为另一个项目添加一个远程,并使用子树合并策略,而不是将另一个项目视为子模块。


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