取消子模块的git子模块

如何取消git子模块的子模块(将全部代码带回内核)? git

正如我“应该”如何,如“最佳程序”同样... fetch


#1楼

对于何时 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


#2楼

我发现从子模块中获取本地提交数据也更加方便,由于不然我将丢失它们。 (因为我没法访问该遥控器,所以没法推送它们)。 所以,我将submodule / .git添加为remote_origin2,获取了该提交并从该分支合并。 不知道我是否仍须要将远程子模块做为源,由于我对git还不熟悉。 orm


#3楼

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 )的内容,
  • 为您清理.gitmodulesrm ),
  • 并在父存储库( rm )的索引中删除表示该子模块SHA1的特殊条目

一旦删除了子模块( deinitgit rm ),就能够将文件夹重命名为其原始名称,并将其做为常规文件夹添加到git repo中。 get

注意:若是子模块是由一个旧的Git(<1.8)建立的,则可能须要删除嵌套的.git子模块自己的文件夹,如评论西蒙东


若是须要保留子模块的历史记录,请参阅jsears答案 ,该答案使用git filter-branch


#4楼

  1. git rm --cached the_submodule_path
  2. .gitmodules文件中删除子模块部分,或者若是它是惟一的子模块,则删除文件。
  3. 提交“已删除子模块xyz”
  4. git add the_submodule_path
  5. 另外一个提交“添加了xyz的代码库”

我尚未找到更简单的方法。 您能够经过git commit -a 3-5压缩为一步。


#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),这些选项能够更好地重命名/复制检测。

相关文章
相关标签/搜索