如何取消git子模块的子模块(将全部代码带回内核)? git
正如我“应该”如何,如“最佳程序”同样... fetch
对于何时 this
git rm [-r] --cached submodule_path
退货 url
fatal: pathspec 'emr/normalizers/' did not match any files
上下文:我在子模块文件夹中作了rm -r .git*
,而后才意识到须要在刚刚添加了它们的主项目中对它们进行反调制。 当对部分而非所有解调器进行非子调制时,出现上述错误。 不管如何,我经过运行来修复它们(固然,在rm -r .git*
) spa
mv submodule_path submodule_path.temp git add -A . git commit -m "De-submodulization phase 1/2" mv submodule_path.temp submodule_path git add -A . git commit -m "De-submodulization phase 2/2"
请注意,这不会保留历史记录。 code
我发现从子模块中获取本地提交数据也更加方便,由于不然我将丢失它们。 (因为我没法访问该遥控器,所以没法推送它们)。 所以,我将submodule / .git添加为remote_origin2,获取了该提交并从该分支合并。 不知道我是否仍须要将远程子模块做为源,由于我对git还不熟悉。 orm
从git 1.8.5(2013年11月 )开始( 不保留子模块的历史记录 ): 索引
mv yoursubmodule yoursubmodule_tmp git submodule deinit yourSubmodule git rm yourSubmodule mv yoursubmodule_tmp yoursubmodule git add yoursubmodule
那将: rem
deinit
,所以首先是mv
)的内容, .gitmodules
( rm
), rm
)的索引中删除表示该子模块SHA1的特殊条目 。 一旦删除了子模块( deinit
和git rm
),就能够将文件夹重命名为其原始名称,并将其做为常规文件夹添加到git repo中。 get
注意:若是子模块是由一个旧的Git(<1.8)建立的,则可能须要删除嵌套的.git
子模块自己的文件夹,如评论由西蒙东
若是须要保留子模块的历史记录,请参阅jsears的答案 ,该答案使用git filter-branch
。
git rm --cached the_submodule_path
.gitmodules
文件中删除子模块部分,或者若是它是惟一的子模块,则删除文件。 git add the_submodule_path
我尚未找到更简单的方法。 您能够经过git commit -a
3-5压缩为一步。
若是只须要将子模块代码放入主存储库,则只需删除子模块,而后将文件从新添加到主存储库中便可:
git rm --cached submodule_path # delete reference to submodule HEAD (no trailing slash) git rm .gitmodules # if you have more than one submodules, # you need to edit this file instead of deleting! rm -rf submodule_path/.git # make sure you have backup!! git add submodule_path # will add files instead of commit reference git commit -m "remove submodule"
若是您还想保留子模块的历史记录,能够作一个小技巧:将子模块“合并”到主存储库中,以便结果与之前相同,只是子模块文件如今位于主存储库。
在主模块中,您须要执行如下操做:
# Fetch the submodule commits into the main repository git remote add submodule_origin git://url/to/submodule/origin git fetch submodule_origin # Start a fake merge (won't change any files, won't commit anything) git merge -s ours --no-commit submodule_origin/master # Do the same as in the first solution git rm --cached submodule_path # delete reference to submodule HEAD git rm .gitmodules # if you have more than one submodules, # you need to edit this file instead of deleting! rm -rf submodule_path/.git # make sure you have backup!! git add submodule_path # will add files instead of commit reference # Commit and cleanup git commit -m "removed submodule" git remote rm submodule_origin
生成的存储库看起来有些奇怪:将有多个初始提交。 但这不会对git形成任何问题。
在第二种解决方案中,您将具备很大的优点,即您仍然能够在最初位于子模块中的文件上运行git blame或git log。 实际上,您在这里所作的是在一个存储库中重命名许多文件,而git应该自动检测到这一点。 若是git log仍然有问题,请尝试一些选项(--follow,-M,-C),这些选项能够更好地重命名/复制检测。