对Git子模块进行非子模块化,将所有代码带回核心存储库的最佳实践是什么?
当前回答
下面是@gyim的回答的一个稍微改进的版本(IMHO)。他在主工作副本中做了很多危险的改变,我认为在独立的克隆上操作,然后在最后将它们合并在一起要容易得多。
在一个单独的目录中(使错误更容易清理并再次尝试)检出顶部回购和子回购。
git clone ../main_repo main.tmp
git clone ../main_repo/sub_repo sub.tmp
首先编辑subrepo以将所有文件移动到所需的子目录中
cd sub.tmp
mkdir sub_repo_path
git mv `ls | grep -v sub_repo_path` sub_repo_path/
git commit -m "Moved entire subrepo into sub_repo_path"
注意头部
SUBREPO_HEAD=`git reflog | awk '{ print $1; exit; }'`
现在从主回购中删除子回购
cd ../main.tmp
rmdir sub_repo_path
vi .gitmodules # remove config for submodule
git add -A
git commit -m "Removed submodule sub_repo_path in preparation for merge"
最后,合并它们
git fetch ../sub.tmp
# remove --allow-unrelated-histories if using git older than 2.9.0
git merge --allow-unrelated-histories $SUBREPO_HEAD
并完成了!安全而且没有任何魔法。
其他回答
下面是@gyim的回答的一个稍微改进的版本(IMHO)。他在主工作副本中做了很多危险的改变,我认为在独立的克隆上操作,然后在最后将它们合并在一起要容易得多。
在一个单独的目录中(使错误更容易清理并再次尝试)检出顶部回购和子回购。
git clone ../main_repo main.tmp
git clone ../main_repo/sub_repo sub.tmp
首先编辑subrepo以将所有文件移动到所需的子目录中
cd sub.tmp
mkdir sub_repo_path
git mv `ls | grep -v sub_repo_path` sub_repo_path/
git commit -m "Moved entire subrepo into sub_repo_path"
注意头部
SUBREPO_HEAD=`git reflog | awk '{ print $1; exit; }'`
现在从主回购中删除子回购
cd ../main.tmp
rmdir sub_repo_path
vi .gitmodules # remove config for submodule
git add -A
git commit -m "Removed submodule sub_repo_path in preparation for merge"
最后,合并它们
git fetch ../sub.tmp
# remove --allow-unrelated-histories if using git older than 2.9.0
git merge --allow-unrelated-histories $SUBREPO_HEAD
并完成了!安全而且没有任何魔法。
从git 1.8.5(2013年11月)开始(没有保留子模块的历史):
mv yoursubmodule yoursubmodule_tmp
git submodule deinit yourSubmodule
git rm yourSubmodule
mv yoursubmodule_tmp yoursubmodule
git add yoursubmodule
将:
注销和卸载(即删除子模块的内容)(deinit,因此mv先), 清理你的。gitmodules (rm), 并删除父repo (rm)索引中表示子模块SHA1的特殊条目。
一旦子模块的删除完成(deinit和git rm),您可以重命名文件夹为原来的名称,并将其作为常规文件夹添加到git repo中。
注意:如果子模块是由旧Git(< 1.8)创建的,您可能需要删除子模块本身中嵌套的.git文件夹,正如Simon East所评论的那样
如果你需要保留子模块的历史,请参阅jsears的答案,它使用git filter-branch。
我发现从子模块获取本地提交数据更方便,否则我就会丢失它们。(无法推送,因为我没有遥控器)。所以我添加了submodule/。Git为remote_origin2,从该分支中提交并合并。 不确定我是否仍然需要子模块远程作为起源,因为我对git还不够熟悉。
当
git rm [-r] --cached submodule_path
返回
fatal: pathspec 'emr/normalizers/' did not match any files
背景:我在子模块文件夹中执行了rm -r .git*,然后才意识到它们需要在我刚刚添加它们的主项目中去子模块化。我得到了上面的错误去子模化一些,但不是所有的。不管怎样,我通过运行(当然,在rm -r .git*之后)来修复它们。
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"
注意,这并不能保存历史。
在主回购
Git rm——缓存[submodules_repo] git commit -m "Submodules removed." Git push origin [master]
在子模块repo
Rm -rf .git
还是主回购
Git add [submodules_repo] Git添加。 Submodules repo被添加到main中。 Git push origin [master]
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别