从特定分支中删除git子模块

时间:2018-09-15 14:07:25

标签: git npm git-submodules

我正在将JS应用程序移植到现代E6模块中。我的应用程序存储在git repo中。回购中有一个子模块。

我创建了另一个分支来执行我需要做的事情,但是我想删除该特定分支中的子模块。

原因是我必须npm install将应用程序作为一个软件包打包,而不是像在master分支中那样以“经典子模块”方式使用。

我读this answer就像签到新分支一样简单,修改不包括子模块的.gitmodules文件,然后删除子模块文件夹本身。

但是,当我这样做时,我结帐到master,看来那里也缺少子模块,这将是一个巨大的错误。在确认这是否重要之前,我没有进行更改。

那么,如何摆脱新分支中的子模块以开始工作,而又不会在主分支中丢失子模块?

编辑1

我在phd评论之后再试一次。我在需要删除gitmodule的分支中。我编辑了.gitmodules文件以删除需要删除的子模块,然后尝试使用git rm -r <my_submodule>删除子模块,但收到了fatal: Please, stage your changes to .gitmodules or stash them to proceed消息。

因此,我保存了更改并删除了子模块。然后我可以签出到master分支,并且子模块文件夹在那里(根据需要)。

此外,主.gitmodules仍显示我从另一个分支中删除的子模块,这是我的目标。

所以现在我有一个带有子模块的master分支,而没有子模块的“ dev”分支,我可以在这里使用npm进行安装。所以我想我搞砸了,asnwer I linked是正确的。将接受phd答案,因为它是正确的。

最后,由于我的git版本为2.7.4,并且我无法运行git checkout --recurse-submodules master,因此我添加了this GIT PPA(我正在使用Ubuntu),因为OS软件包管理器中的版本较旧,将git升级为2.19,运行命令,一切正常。

我使用的命令是:

sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
apt-get install --only-upgrade git

编辑2

奇怪的是,我只是注意到当我切换到“ dev”分支时,尽管.gitmodules不在列表中显示该子模块,但删除的子模块的文件夹仍然存在。另外,在结帐至该分支期间,我收到了消息warning: unable to rmdir 'ol/ol-layerswitcher': Directory not empty

我猜现在该文件夹不再被视为子模块,但它仍然存在。如果可能的话,我该如何从dev分支而不是master分支中删除它(这是我最初的问题)?

最终答案

好,我回答了自己。我只需要除去没有git rm的花絮。现在:

  1. dev分支没有要提交的内容
  2. 子模块文件夹不存在
  3. 当我切换到它时,我没有收到任何消息

最终答案不正确!

只是想补充一点,删除文件会使它们也消失在master分支中。显然,我唯一能做的就是使用devb牧场中的submodules文件夹,但是只是用.gitignore“忽略”它们,以免将其推送到我的远程dev分支。

1 个答案:

答案 0 :(得分:1)

您的问题缺少一些重要的细节,所以让我猜测缺失的部分。您已经创建了一个分支,编辑了.gitmodules(从中删除了子模块)并删除了子模块的目录。您在.gitmodules中添加并提交了更改。

我相信您提交了.gitmodules,因为没有它,您将无法检出master分支。

然后您检出master,发现缺少子模块目录,对吗?那是问题的核心问题?

不幸的是,这就是子模块的工作方式。 Git doesn't update submodules automatically on checkout.如果您的git很新鲜,则应该使用git checkout --recurse-submodules master

或者您需要在签出分支后开发a post-checkout hook that updates submodules。参见an elaborated example