如何删除Git子模块?
顺便问一下,我不能这么做有什么原因吗EDOCX1?0?
- 简单答案stackoverflow.com/a/21211232/94687现在是正确的答案,应该标记为"是"。现在,它只是git rm modulename和rm -rf .git/modules/modulename
- 事实并非如此。该答案并不涉及从.git/config中删除子模块条目。接受的答案显示了完全删除子模块的最新方法。在这个答案中,它也得到了更简洁的解释:stackoverflow.com/a/36593218/1562138
- 我发现这篇文章对于删除子模块非常有帮助。它包括有关删除.gitsubmodules和.git/config文件链接中的条目的信息
- 请节省一些时间,并直接回答有效的问题(2017年):stackoverflow.com/a/36593218/528313
- 我已经解决了两天的子模块问题。当我发现这一点时,我有了突破:forums.developer.apple.com/thread/13102。基本上,Xcode和其他应用程序都很难扩展包含"~"的URL。一旦我将ssh://[email protected]/~/git/myrep o.git更改为ssh://[email protected]/home/username/git/myrep‌&8203;o.git(查找服务器上的实际路径),所有的奇怪都会在十分钟内消失。另请参见stackoverflow.com/questions/32833100/…
通过页面Git子模块教程:
要删除子模块,需要:
从.gitmodules文件中删除相关部分。
阶段.gitmodules改变git add .gitmodules。
从.git/config中删除相关章节。
运行git rm --cached path_to_submodule(无尾斜线)。
运行rm -rf .git/modules/path_to_submodule。
承诺第十一条〔八〕款
删除现在未跟踪的子模块文件
另请参见:下面的其他步骤。
- "顺便问一下,我不能简单地把子模块rm设置为什么有原因吗?"?
- @Abernier最简单的答案可能是"因为不存在这样的命令。"我猜他们是想明确删除子模块文件和子模块配置,以避免意外的数据丢失。也许有人会认为git submodule rm只是简单地删除了子模块注册,如果命令也删除了本地存储库,这会让人吃惊。任何局部变化都将不可挽回地消失。也许另一个人会认为只有文件会被删除。
- 坦白说,我不知道为什么。不过,我希望他们添加一个命令。这四个步骤太复杂了。
- 我不断地得到这个错误:"fatal:pathspec"blocks/submodule_folder/"与任何文件都不匹配"。我添加了-f,-force命令:"git rm--cached-f blocks/submodule_folder",这样就摆脱了缓存。
- @dtan确保没有尾随斜杠
- 那对我不起作用。以前是子模块的文件夹现在不应该在父项目中显示为普通文件夹吗?因为它们不适合我,而且在将更改推到Github之后,它仍然认为它们是子模块,只是它们不再链接到子模块repos…
- 好吧,我又得用电了,现在可以用了。
- 还必须清除.git/模块,以便以后使用相同的路径添加模块。
- 下面是一个bash脚本,它删除了一个子模块,只需为子模块rm创建一个git别名;)gist.github.com/2491147
- 子模块目录也应该删除,对吗?那么:rm -rf path_to_submodule。
- 还需要rm-rf.gitmodulessubmodule name?
- 是的,您可能想删除现在未跟踪的子模块文件。
- 如果要将目录作为纯子模块重新添加(记住也要删除其内部.git文件夹),则需要删除.git/modules引用目录。见下面马克的答案:stackoverflow.com/a/9536504/149416
- 你需要准备.gitmodules。在提交之前运行git add.gitmodules。
- git submodule rm应该是一个命令。如果子模块中有子模块,则此设置会变得更加复杂,因为您的.git/config的位置发生了更改。
- 删除像git rm --cached path_to_sub/*这样的文件夹中的所有缓存怎么样?
- @你可能只是解释了为什么命令不存在。如果你下了命令,你就应该把所有这些角落的案子都处理掉,也许这决定太难了。
- @可能是阿德里安·拉特纳帕拉。但它是Git!这些人很聪明。最复杂的程序应该是自动化的第一候选。
- 当您进行更改时,如何手动修改.git目录?使用主项目的每个人都需要手动进行这些更改吗?他们如何知道需要进行这些更改?
- @jamesmoore修改后的.gitmodules文件将被推送到master,因此每个人都会看到更改。但是,.git/config中的相关部分不会推给其他部分。它只是一个包含克隆子模块repo信息的本地设置。如果需要,项目中的其他人仍然需要删除子模块repo。Git不能如实地知道其他人在回购中是否有任何未经审核的更改,因此Git自动删除他们的副本是不安全的。
- 答案不是100%正确。我发现,除非在"git-rm-cached"行中插入了"-f",否则无法使此修复程序与"master"以外的分支一起工作。切换到每个分支,并使用"-f"使其工作-我想这与编辑配置文件"中断"其他分支而不编辑它们的方式有关。伙计,子模块在Git中设计得很糟糕!再也不用了!
- 确实应该有一个删除子模块的命令。这个怎么样:git submodule removeuntrackdelee?这是否足以满足上述用例?:)而且,由于我的Git知识有限,我更容易把这5个(!)搞砸。比一步一步搞砸还难。
- 如果人们使用该子模块的.git/,会发生什么?假设你把它取下来推/拉。应该有一个git submodule rm -f XXX以避免数据丢失。
- 如果在步骤4中省略了--cached选项,则不需要步骤7。
- 你应该使用git submodule deinit [-f]。
- 我必须将a-r添加到文件夹的末尾remove才能将其从索引中取出:git rm--缓存路径_to_子模块-r
- 这对我有用。我想将子模块更改为不带任何.gitmodules轨道的真实文件。然后你必须删除每个子模块git跟踪和目录清理,然后重建你的目录…..为什么删除子模块这么复杂…
- 经典Git…做一个简单的任务,让它很难做到不可能。
Since Git1.8.3(April 22D,2013):
There was no Porcelain way to say"I no longer am interested in this submodule", once you express your interest in a submodule with"submodule init".
"submodule deinit" is the way to do so.
删除过程也使用git rm(自从GIT1.8.5 October 2013)。
摘要
The 3-steps removal process will be:
1 2 3 4 5 6 7 8 9 10
| 0. mv a/submodule a/submodule_tmp
1. git submodule deinit -f -- a/submodule
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)
# or, if you want to leave it in your working tree and have done step 0
3. git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule |
清除
This is mentioned in Daniel Schroeder's answer,and summarized by eonil in the comments:
BLCK1/
See Commit 95C16418:
Currently using"git rm" on a submodule removes the submodule's work tree from that of the superproject and the gitlink from the index.
But the submodule's section in .gitmodules is left untouched, which is a leftover of the now removed submodule and might irritate users (as opposed to the setting in .git/config, this must stay as a reminder that the user showed interest in this submodule so it will be repopulated later when an older commit is checked out).
Let"git rm" help the user by not only removing the submodule from the work tree but by also removing the"submodule." section from the .gitmodules file and stage both.
从这个标记中可以看出
With"git submodule init" the user is able to tell git they care about one or more submodules and wants to have it populated on the next call to"git submodule update".
But currently there is no easy way they can tell git they do not care about a submodule anymore and wants to get rid of the local work tree (unless the user knows a lot about submodule internals and removes the"submodule.$name.url" setting from .git/config together with the work tree himself).
Help those users by providing a 'deinit' command.
This removes the whole submodule. section from .git/config either for the given
submodule(s) (or for all those which have been initialized if '.' is given).
Fail if the current work tree contains modifications unless forced.
Complain when for a submodule given on the command line the url setting can't be found in .git/config, but nonetheless don't fail.
本文关照初始化步骤(EDOCX1&4)和EDOCX1&5)
自从GIT1.8.5以来,第git rm号法律还规定:
- File:it is need to removed for you.
- The submodule special entry(as illustrated by this question):The GIT RM removes it from the index:(无trailing slash)That will remove that directory stored in the index with a special mode"160000",marking it as a submodule root directory.
如果你忘记了最后一步,并尝试添加一个副产品,作为一个常规目录,你会得到错误的信息,如:
ZZU1
注:Since Git 2.17(Q2 2018),Git subbodule deinit is no longer a shell script.这叫一个C函数。
See commit 2E61273,commit 1342476(14 Jan 2018)by Prathamesh Chavan(EDOCX1&10).哈马诺Junio C.EDOCX1&11--in commit EAD8DBE,13 Feb 2018
1 2 3 4 5
| git ${wt_prefix:+-C"$wt_prefix"} submodule--helper deinit \
${GIT_QUIET:+--quiet} \
${prefix:+--prefix"$prefix"} \
${force:+--force} \
${deinit_all:+--all}"$@" |
- 你能举例说明一下submodule deinit的用法吗?
- @这里有一个成功使用它的例子:stackoverflow.com/a/16161950/6309。但请记住,与我最初的想法相反,1.8.3尚未发布!在UNIX上,您可以从源代码编译它。
- 根据我的经验,git submodule deinit没有从.git/config中删除相关目录。它还在那里,直到我手动移除它。
- 所以,如果我在别人做了这件事之后再拉一下,我的子模块会不会被清理干净,或者我仍然需要做通常的手动步骤呢?(cf stackoverflow.com/questions/14877420/…)
- @ hamishdowner的专用输入要走了(目录也不再在submodule),和.gitmodules应该好了,但我仍然是双止任何事与.git目录(IE的当地config,在你当地的回购:那是不是被改性的git pullby)
- vonc @我仍然停留与.gitmodules文件和在我的.git模块/我有个好的参考。我们可以remove只是这些事情,忽视他们的第三或什么的吗?
- warpzit @你做的有git1.8.3,和你的git submodule deinit吗?但如果不是,是的,你可以manually干净的额外的元数据。
- 什么其他用户分享WHO的Gi repository需要做什么?只是git pull吗?
- @ jayen吗是的,如果你承诺的在不同的英语,.gitmodules进入和在不同的英语,特别在进入指数,和推,回购,人可以拉它和那submodule将去。
- "deinit断面的git-submodule(1)现在recommends用git rm:"如果你真的想要捕捉的submodule从repository和承诺,用Gi RM(1)代替。"
- 这里的脚本,automates那些步骤:gist.github.com / sharplet / 6289697。把它给你PATH和git remove-submodule path/to/submodule。
- @ adamsharp,就不会被你需要使用git-remove-submodule ...代替git remove-submodule ....吗?
- @肯尼号:"git remove-submodule"(与空间)将看为一executable"git-remove-submodule"(与短跑)任何地方在你的$PATH。
- 我有一个错误的从脚本,我想会发生在每一个时代错误:submodule:"magit"(或其一个一个嵌套的submodules)用途的.git目录(RM -使用"RF",如果你真的想捕捉它包括所有对其历史)不会被submodules总是有.git目录里面的他们吗?
- 对不起,pedz @深夜的答案。你reproduced,错误的消息吗?它在"的情况在一个嵌套的submodule吗?(submodule内的submodule)
- pedz @ @ vonc听起来绝对是喜欢它的引起了由一个嵌套的submodule。你能试着编辑的脚本的运行git rm -rf"$submodule_name"(注* -rflag)吗?如果这工作,我会更新的脚本,accordingly。
- @ adamsharp)把"magit",并不是有submodules。并不是任何submodule要有.git目录在它吗?
- pedz @你是正确的,这并不让我submodules。是的,如果在submodule也initialised和检查出来的,它应该有一个.git目录。这版的蠢货,你是用吗?
- @ adamsharp -对不起-为缓慢的回复。我没有得到的emails。我不知道这版本。现在我有一个1.8.3.2和1.7.12.4。我upgraded最近。我1.7.4.1为好。我不知道这版我曾经当我做的remove。等等)做的召回,并不是有1.62 Gi submodule deinit。
- @ pedz吗是的,git submodule deinit唯一可用从各类+。注意的是,当我提到在我的edited回答以上,git rm asubmodule将很快安排一切。
- 运行的脚本左我与破碎的项目。我试过了deleting的submodule,然后添加回来,与git submodule add -b master ..。我有一个错误,和找给我的submodule回来了:Gi目录为"asub"也发现locally与remote(S):商品URL _ asub.git如果你想reuse这地方Gi目录代替cloning再次从URL _ asub.git使用"-"-力"选项。如果当地的Gi目录也不"是的先生,你是unsure回购或是什么这意味着选择另一个名称与"- name"选项。注:这与Gi 1.8.4.msysgit.0版本
- @您可以将现有的子模块转换为以下分支:stackoverflow.com/a/18799234/6309。或者使用msysgit 1.8.5.2(code.google.com/p/msysgit/downloads/…):git rm yourSubmodule现在从工作树和.gitmodules文件中删除子模块。
- @Tingl我已经编辑了答案以删除脚本,并将答案更新为git1.8.5,现在对Windows以及MSysgit 1.8.5.2都可用。
- 注:deinit和rm似乎与路径一起工作,对我来说效果很好,在asubmodule上有一个尾随斜线,同时使用两个命令。(GIT V1.1.1)
- @desseim是的,所有命令都是这样的:stackoverflow.com/a/22130978/6309
- 在当前的Git(v1.9+)中,普通老的git rm submodule正是您所希望的,正如其他人已经说过的那样。
- 我的经验是,一个好的git rm -rf --cached /path/to/submodule删除了子模块。然后是git commit。如果我不想把文件夹作为子模块添加,我只需要删除path/to/folder和git add /path/to/folder中的.git。
- 这使得.git/modules//保持不变。因此,如果使用此方法删除子模块并重新添加它们,就不可能了,因为存储库已经损坏。
- @VONC删除这样的内部结构真的很好吗?它不会影响到任何结构数据的完整性吗?我不是吉特的专家,但我越来越不信任吉特,因为我知道它是多么的脆弱…
- @eonil no,在本例中,为了保持它与删除gitlink条目(stackoverflow.com/a/16581096/6309)的一致性,它是可以的。
- "git submodule deinit[submodule]"只是给了我一个用法提示-语法不正确?
- @内森霍比,这取决于你的版本的git(git --version)。适用于Git 1.8.3+。如果您的版本太旧,您应该能够轻松地升级它(例如:stackoverflow.com/a/24847953/6309)
- @内森霍恩比让我猜猜:Ubuntu精确12.0.4升和1.7.9.5吉特?(packages.ubuntu.com/precise/vcs/git和stackoverflow.com/q/14409639/6309)。
- 您最好更改命令的顺序,否则(在Windows上)会得到Stopping at 'lib/asubmodule'; script returned non-zero status.解决方案的错误:git rm lib/asubmodule && rm .git/modules/lib/asubmodule && git submodule lib/asubmodule deinit --recursive --force(如果您的模块位于根目录下,则不需要lib/)
- @VONC的答案涵盖了所有的基础,但是如果您现在只需要删除一个子模块,请参见:stackoverflow.com/a/21211232/8047
- 什么是3BIS????
记下来Since Gite 1.8.5.2,two commands will do:
1 2
| git rm the_submodule
rm -rf .git/modules/the_submodule |
As@mark Cheverton's answer correctly pointed out,if the second line isn't used,even if you removed the submodule for now,the remnant GIT/modules/the U submodule folder will prevent the same submodule from being added back or replaced in the future.同时,作为@vonc mentioned,git rmWill do most of the job on a submodule.
最新情况(07/05/2017)--
(just to clarify,the_submodule)is the relative path of the submodule inside the project.例如,如果潜水管道内有一个subdir子目录。
2.As pointed out correctly in the comments and other answers,the two commands(although functionally sufficient to remove a submodule),do leave a trace in the EDOCX1&17)section of EDOCX1&4(as of July 2017),which can be removed using a third command:
1
| git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null |
- 我现在使用的是Git 2.4.9版(AppleGit-60),我所要做的就是RM子模块。我推了推,然后重新添加了一个与子模块同名的文件夹,它毫无问题地工作。
- 我在OSX上使用的是Git2.5.4版本,如果您想从另一个位置重新添加子模块,只需要执行第二个命令。如果不执行第二步,您将看到:在本地找到"submodule"的git目录,其中包含远程:
- 这不会从.git/config中删除子模块条目。有关删除子模块的完整方法,请参阅stackoverflow.com/a/36593218/1562138。
- 这是100%的绝对辉煌和工作。真的。
- @使用git 2.7.4的fvgs,git rm命令将节从.git/config中删除,并删除.git/modules/。文件夹(s)
- @我刚用Git2.11.1测试过这个,我观察到和以前一样的行为。git init && git submodule add && git rm 留下.git/config条目和.git/modules/目录及其内容。也许在删除子模块之前您没有初始化它?
- @fvgs好吧,当我尝试你的实验时,我在Git2.7.4中也得到了同样的结果-不知道发生了什么?子模块肯定是初始化的,已经有一段时间发生了多次变化。
- 我觉得先运行这个更安全。git子模块deinit-f子模块
- 答案能解释一下这里是什么东西吗?子模块的路径?
- @是的,这就是路。请查看更新。
- 值得注意的是,如果您从未在运行这些命令的存储库中初始化过该子模块(例如,您创建了一个新的非递归克隆),则不需要运行第二个命令或从g it配置中删除该节,因为这些元素将不存在。
- @如果签出子模块,则实际上需要您的命令。否则你会得到一个错误Unlink of file '...' failed。
这个问题的大多数答案都是过时的、不完整的或不必要的复杂。
使用git 1.7.8或更高版本克隆的子模块在本地repo中最多会留下四个自身的痕迹。删除这四个记录道的过程由以下三个命令给出:
1 2 3 4 5 6 7 8
| # Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule
# Remove the submodule directory from the superproject's .git/modules directory
rm -rf .git/modules/path/to/submodule
# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule |
- 为什么这个答案没有多少赞成票?所有这些流行的答案都漏掉了一些东西,这是唯一一个真正以最简单的方式消除了子模块所有痕迹的答案。注意:命令的顺序很重要。
- 你从哪里得到-rf?尝试运行该命令时出错(第二个命令;Windows计算机)
- 回答我自己的问题:stackoverflow.com/questions/97875/rm rf equivalent for windo‌&8203;ws
- @MBDEvpl是在被接受的答案3年后出现的,我想没有人能说服OP接受这个答案。
- 不幸的是,这不允许将文件保存在您的工作树中(如果您可能希望将它们提交给您的父repo),rm -rf也不会在Windows上工作。
- @Thomasrm -rf的意思是"删除整个文件夹",这样您就可以从Windows中的Explorer GUI中执行此操作。或者,如果您在Windows中使用Git,您还可以使用Git-bash,这样您就可以在那里运行所有这些命令,它们将按原样工作。
- 这是2018年不复杂的答案?
- .gitmodules文件在运行这些命令时似乎仍然不受影响。
简单步骤
删除配置项:git config -f .git/config --remove-section submodule.$submodulenamegit config -f .gitmodules --remove-section submodule.$submodulename。
从索引中删除目录:
git rm --cached $submodulepath。
提交
删除未使用的文件:rm -rf $submodulepathrm -rf .git/modules/$submodulename。
请注意:$submodulepath不包含前导或尾随斜杠。
背景
当你做git submodule add时,它只会加在.gitmodules上,但是一旦你做了git submodule init,它就加入了.git/config。
因此,如果您希望删除模块,但能够快速恢复,那么就这么做:
1 2
| git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath |
最好先做git rebase HEAD和git commit。最后,如果你把它放到一个脚本中。
还有一个答案,我可以不流行一个git子模块吗?.
- 我有很多子模块(和更大的混乱),所以我必须通过一个for循环。因为它们中的大多数在特定的目录和ls输出下都包含尾随斜杠。我做了类似于for dir in directory/*; do git rm --cached $dir; done的事情。
- 为了得到这个列表,可以在脚本中用于递归删除-git config -f .git/config -l | cut -d'=' -f1 | grep"submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//'--看起来如果有什么地方出错了,就必须这样做,否则就只有git submodule | grep -v '^+' | cut -d' ' -f3。
- 获取没有进行本地更改的模块列表-git submodule | grep '^+' | cut -d' ' -f2
- 注意,我不得不在双引号中加上submodulename,"submodulename"。参考.git/config文件
- #2正是我想要的,谢谢!+ 1
除了这些建议之外,我还必须添加一个同名的新子模块(在我的例子中,我是用原来的叉子替换叉子)。
- 我在这方面也遇到了麻烦。如果您试图将子模块重新安装到同一路径,它会将分支信息缓存在您提到的位置,这会使事情变得混乱。
- 谢谢,我也需要这个。@安东,我同意,我已经编辑了最热门的答案来添加这个信息。
- 我使用--name选项使替换工作…请参阅stackoverflow.com/questions/14404704/…
To remove a submodule added using:
运行:
是的
For old versions of GIT(Circa ~ 1.8.5)use:
1 2 3
| git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah |
- 确实是1。从Git 1.8.3起,这是唯一正确的答案。应该被认为是正确的。
- +1在较新版本的Git中删除的正确和干净的方法。
- git rm仍保留在.git/modules/中。(2.5.4)
- @鲁道夫·达姆科维奇,对我有用吗?注意,它只会删除精确路径匹配的子模块条目;如果您移动了一个子模块,然后使用git rm,则不会;在我的Mac上使用2.5.4进行的快速测试会更新.gitmodules文件,如以下文档所述:git scm.com/docs/git rm_u子模块…但是,如果您发现了某种平台/版本的组合,而这并没有发生,那么您可能应该对此提出一个bug。
- 这个答案并不完全正确。git rm在.git/modules/dir和.git/config文件(ubuntu,git 2.7.4)中留下东西。其他答案100%有效:stackoverflow.com/a/36593218/4973698
必须删除.gitmodules和.git/config中的条目,并从历史记录中删除模块的目录:
1
| git rm --cached path/to/submodule |
如果你要写在Git的邮件列表上,可能会有人给你写一个shell脚本。
- 不需要任何shell脚本,其他答案有删除子模块所有跟踪的命令:stackoverflow.com/a/36593218/4973698
您可以使用别名自动化其他人提供的解决方案:
1 2
| [alias]
rms ="!f(){ git rm --cached "$1";rm -r "$1";git config -f .gitmodules --remove-section "submodule.$1";git config -f .git/config --remove-section "submodule.$1";git add .gitmodules; }; f" |
把它放到你的Git配置中,然后你就可以做:git rms path/to/submodule
总而言之,您应该这样做:
设置path_to_submodulevar(无尾斜杠):
path_to_submodule=path/to/submodule
从.gitmodules文件中删除相关行:
git config -f .gitmodules --remove-section submodule.$path_to_submodule
从.git/config中删除相关节
git config -f .git/config --remove-section submodule.$path_to_submodule
仅从索引中取消$path_to_子模块的存储和删除(以防止信息丢失)
git rm --cached $path_to_submodule
跟踪对.gitmodules所做的更改
git add .gitmodules
提交超级项目
git commit -m"Remove submodule submodule_name"
删除现在未跟踪的子模块文件
rm -rf $path_to_submodule
rm -rf .git/modules/$path_to_submodule
- 所以,其他所有取消我的更改的人都必须运行rm-rf$path_to_submodule rm-rf.git/modules/$path_to_submodule才能删除子模块缓存?
- 我建议更新,git submodule update。如果子模块路径更新不正确(Git抛出错误),则删除它们:rm -rf .git/modules/ && rm -rf && git submodule update。
如果由于添加、提交和推送了一个已经是Git存储库(包含.git的文件夹)而意外添加了子模块,那么您将无法编辑.gitmodules文件或.git/config中的任何内容。在这种情况下,您只需要:
1 2 3 4
| git rm --cached subfolder
git add subfolder
git commit -m"Enter message here"
git push |
在执行git add之前,我还删除了.git文件夹。
我发现deinit对我有好处:
1 2
| git submodule deinit <submodule-name>
git rm <submodule-name> |
来自GIT文档:
deinit
Unregister the given submodules, i.e. remove the whole submodule.$name
section from .git/config together with their work tree.
- 同意找到相同的解决方案。这是2018年的最佳方式)
- 它没有删除.git/modules/。。您应该删除它们,请参见@fvgs的答案。
在对所有不同的答案进行实验之后,我终于找到了这个解决办法:
1 2 3 4 5 6 7 8 9 10 11 12
| #!/bin/sh
path="$1"
if [ ! -f"$path/.git" ]; then
echo"$path is no valid git submodule"
exit 1
fi
git submodule deinit -f $path &&
git rm --cached $path &&
rm -rf .git/modules/$path &&
rm -rf $path &&
git reset HEAD .gitmodules &&
git config -f .gitmodules --remove-section submodule.$path |
这与你添加潜水艇之前的状态相同。你可以再一次添加潜水艇,这在这里是不可能的。
1 2
| git submodule add $giturl test
aboveScript test |
这给了你一个干净的检查,没有任何改变。
This was tested with:
1 2
| $ git --version
git version 1.9.3 (Apple Git-50) |
- 你为什么用git rm --cached $path,然后用rm -rf $path,而不是git rm -r $path?
我目前正在做的是2012年12月(结合了这些答案的大部分):
1 2 3 4 5 6 7 8
| oldPath="vendor/example"
git config -f .git/config --remove-section"submodule.${oldPath}"
git config -f .gitmodules --remove-section"submodule.${oldPath}"
git rm --cached"${oldPath}"
rm -rf"${oldPath}" ## remove src (optional)
rm -rf".git/modules/${oldPath}" ## cleanup gitdir (optional housekeeping)
git add .gitmodules
git commit -m"Removed ${oldPath}" |
以下是我所做的:
1.)从.gitmodules文件中删除相关节。可以使用以下命令:
1
| git config -f .gitmodules --remove-section"submodule.submodule_name" |
2.)阶段.gitmodules变化
3.)删除.git/config中的相关章节。可以使用以下命令:
1
| git submodule deinit -f"submodule_name" |
4.)移除Gitlink(无尾随斜杠):
1
| git rm --cached path_to_submodule |
5.)清理.git/modules:
1
| rm -rf .git/modules/path_to_submodule |
6)提交:
1
| git commit -m"Removed submodule <name>" |
7.)删除现在未跟踪的子模块文件
1
| rm -rf path_to_submodule |
- 谢谢。对我来说,我必须将前三步的顺序重新排列为3),1),2)。做1)首先在步骤3给fatal: no submodule mapping found in .gitmodules for path 'submodule_name'。但这两个步骤都是必要的。(GIT V2.82)
我最近发现一个GIT项目,其中包括许多相关的GIT命令:https://github.com/visionmedia/git-extras
Install it and type:
1
| git-delete-submodule submodule |
然后事情就发生了。潜艇目录将从您的备份中删除,并且仍然存在于您的档案系统中。你可以像这样改变
我必须进一步执行John Douthe的步骤,并将cd放入子模块的目录中,然后删除git存储库:
1 2
| cd submodule
rm -fr .git |
然后,我可以将这些文件作为父Git存储库的一部分提交,而不必使用对子模块的旧引用。
- 我也必须这样做,才能越过"致命的:而不是Git存储库":尝试执行git rm --cache步骤时出错。
以下是我认为必要或有用的4个步骤(首先是重要步骤):
1 2 3 4
| git rm -f the_submodule
rm -rf .git/modules/the_submodule
git config -f .git/config --remove-section submodule.the_submodule
git commit -m"..." |
理论上,步骤1中的git rm应该处理好它。希望有一天,OP问题的第二部分可以得到肯定的回答(这可以在一个命令中完成)。
但截至2017年7月,第2步是删除.git/modules/中的数据所必需的,否则,您不能在将来添加子模块。
正如Tinlyx的回答所指出的那样,对于git 1.8.5+,您可能可以通过上述两个步骤,因为所有git submodule命令似乎都可以工作。
步骤3删除文件.git/config中the_submodule的部分。这应该是为了完整性。(该条目可能会对旧的Git版本造成问题,但我没有要测试的版本)。
对此,大多数答案建议使用git submodule deinit。我发现使用git config -f .git/config --remove-section更明确,也不那么容易混淆。根据Git子模块文件,git deinit:
Unregister the given submodules ... If you really want to remove a
submodule from the repository and commit that use git-rm[1]
instead.
最后但并非最不重要的是,如果您不执行git commit,您在执行git submodule summary时(从git 2.7开始)会/可能会出错:
1 2
| fatal: Not a git repository: 'the_submodule/.git'
* the_submodule 73f0d1d...0000000: |
不管您是执行第2步还是第3步。
1 2 3 4 5 6 7 8
| project dir: ~/foo_project/
submodule: ~/foo_project/lib/asubmodule
- - - - - - - - - - - - - - - - - - - - - - - - -
run:
1. cd ~/foo_project
2. git rm lib/asubmodule &&
rm .git/modules/lib/asubmodule &&
git submodule lib/asubmodule deinit --recursive --force |
我找到了潜艇(Forgot's exactly name)隐藏的文件,它有一个清单。你可以用这种方式逐个除掉他们。我只有一个,所以我删除了它。很简单,但可能会有点不对劲,因为我不知道有没有任何东西与潜艇有关。看起来很好,从利伯特潘的普通升级问题来看,但这是(希望)不相关的。
通知没有人在手动擦除,因此添加
如果您刚刚添加了子模块,例如,您只是添加了错误的子模块或将其添加到了错误的位置,只需执行git stash,然后删除文件夹。这是假设添加子模块是您在最近的回购中所做的唯一事情。
对于Git 2.17及更高版本,它只是:
1 2 3
| git submodule deinit -f {module_name}
git add {module_name}
git commit |
在最新的Git中,只需要4个操作就可以删除Git子模块。
- 删除EDOCX1[0]中的对应条目
- 阶段变更git add .gitmodules。
- 删除子模块目录git rm --cached 。
- 承诺1〔18〕。