从特定分支中删除 git 个子模块
Remove git submodule from a specific branch
我正在将我的 JS 应用程序移植到现代 E6 模块。我的应用程序存储在 git 存储库中。在 repo 中有一个子模块。
我创建了另一个分支来做我需要做的事情,但我想删除这个特定分支中的子模块。
原因是我必须 npm install
子模块中的应用程序作为一个包,而不是像在 master 分支中那样以 "the classical submodule" 方式使用它。
正在阅读 this answer 我认为这就像结帐到新分支一样简单,修改 .gitmodules 文件,排除子模块并删除子模块文件夹本身。
但是,当我执行此操作时,我检查了 master,似乎子模块也从那里丢失了,这将是一个巨大的错误。在检查这是否重要之前,我没有暂存更改。
那么,我如何摆脱新分支中的子模块以开始在其中工作,而不会在我的 master 分支中丢失它?
编辑 1
phd 评论后我正在重试。我在需要删除 git 模块的分支中。我编辑了 .gitmodules
文件以删除我需要删除的子模块,然后尝试使用 git rm -r <my_submodule>
删除子模块但我收到 fatal: Please, stage your changes to .gitmodules or stash them to proceed
消息。
所以我隐藏了我的更改并删除了子模块。然后我可以检出到主分支,并且子模块文件夹在那里(根据我的需要)。
另外,大师.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
的情况下删除 floder。现在:
- dev 分支没有什么可提交的
- 子模块文件夹不存在
- 当我切换到它时,我没有收到任何消息
最终答案不正确!
只是想补充一点,删除文件会使它们在 master 分支中也消失。我唯一能做的显然是使用 devb ranch 中的子模块文件夹,但只是 "ignoring" 它们带有 .gitignore
,以免将它们推送到我的远程开发分支。
你的问题缺少一些重要的细节,所以让我猜猜缺少的部分。您已经创建了一个分支,编辑了 .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 after checking out a branch. See an elaborated example.
我正在将我的 JS 应用程序移植到现代 E6 模块。我的应用程序存储在 git 存储库中。在 repo 中有一个子模块。
我创建了另一个分支来做我需要做的事情,但我想删除这个特定分支中的子模块。
原因是我必须 npm install
子模块中的应用程序作为一个包,而不是像在 master 分支中那样以 "the classical submodule" 方式使用它。
正在阅读 this answer 我认为这就像结帐到新分支一样简单,修改 .gitmodules 文件,排除子模块并删除子模块文件夹本身。
但是,当我执行此操作时,我检查了 master,似乎子模块也从那里丢失了,这将是一个巨大的错误。在检查这是否重要之前,我没有暂存更改。
那么,我如何摆脱新分支中的子模块以开始在其中工作,而不会在我的 master 分支中丢失它?
编辑 1
phd 评论后我正在重试。我在需要删除 git 模块的分支中。我编辑了 .gitmodules
文件以删除我需要删除的子模块,然后尝试使用 git rm -r <my_submodule>
删除子模块但我收到 fatal: Please, stage your changes to .gitmodules or stash them to proceed
消息。
所以我隐藏了我的更改并删除了子模块。然后我可以检出到主分支,并且子模块文件夹在那里(根据我的需要)。
另外,大师.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
的情况下删除 floder。现在:
- dev 分支没有什么可提交的
- 子模块文件夹不存在
- 当我切换到它时,我没有收到任何消息
最终答案不正确!
只是想补充一点,删除文件会使它们在 master 分支中也消失。我唯一能做的显然是使用 devb ranch 中的子模块文件夹,但只是 "ignoring" 它们带有 .gitignore
,以免将它们推送到我的远程开发分支。
你的问题缺少一些重要的细节,所以让我猜猜缺少的部分。您已经创建了一个分支,编辑了 .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 after checking out a branch. See an elaborated example.