我正在将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
的花絮。现在:
最终答案不正确!
只是想补充一点,删除文件会使它们也消失在master分支中。显然,我唯一能做的就是使用devb牧场中的submodules文件夹,但是只是用.gitignore
“忽略”它们,以免将其推送到我的远程dev分支。
答案 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。