首页 > 解决方案 > 将“子”git repo 合并/移动到“父”git repo

问题描述

我对 git 很陌生,只将它用于简单的项目提交等,所以我可能犯了错误!

我最近开始在最初未版本化的代码上使用 git。我在 Visual Studio 2017 中使用 git。如果我没记错的话,Visual Studio 创建了存储库,我没有手动创建它们。

我在 Visual Studio 的同一解决方案中有 4 个项目。我最近注意到 1 个特定项目没有通知我未提交的更改(Visual Studio 将图标放在文件旁边),它不会让我提交更改,但我可以看到提交历史记录。使用 Git GUI 或 Bash,我可以看到未暂存的更改等并提交它们。

查看文件资源管理器,我可以看到解决方案根目录中有一个 git repo,而 3 个正在工作的项目目录中没有 git repo。但是在无法正常工作的项目中,它有自己的 git repo。我不确定这是怎么发生的。

我认为这会导致冲突,阻止视觉工作室识别我的更改。我想基本上删除项目目录中的“子”git repo,并让“父”repo 管理整个解决方案。

我尝试按照这种方法合并两个存储库(来自Windows 上的 Git GUI:合并冲突):

cd path/to/project-b
git remote add project-a /path/to/project-a
git fetch project-a --tags
git merge --allow-unrelated-histories project-a/master # or whichever branch you want to merge
git remote remove project-a

我可以在我的提交历史中看到“子”回购的历史似乎已被合并,但在有问题的项目中仍未检测到更改。

Git 历史

我重命名了子 git repo 以查看是否有帮助,但没有改变。

我需要遵循一个流程来允许我合并两个存储库,并让解决方案级别的 git repo 管理所有项目吗?

如果可能,最好保留子项目的提交历史。

标签: gitvisual-studioversion-controlvisual-studio-2017git-merge

解决方案


我在这里找到了一个合理的解决方案:How To: Merge a Git submodule into its main repository

我会在这里放一些摘录,以防将来删除该文章。本文将引导您将 src/models 中脚本的子模块合并到主存储库中。

主要思想是在子模块目录的根目录下建立一个新的目录结构,就好像它是父目录一样,将所有跟踪的文件移动到该目录中,然后推送到远程。

在模型目录中:

mkdir -p src/models
git ls-tree master --name-only | xargs -I{} git mv {} src/models
git commit -m 'Move all files into src/models directory'
git push

然后删除对子模块的所有引用,并删除目录:

Git 子模块元数据存储在 .gitmodules 文件中:

从该文件中删除子模块。

git add .gitmodules

.git/config 有一个类似的条目,也可以编辑该文件。

git rm --cached models

rm -rf .git/modules/models

git commit -m 'Remove models submodule'

rm -rf models

然后从远程合并子模块文件:

在主存储库中运行命令:

git remote add models-origin git@github.com/exampleUser/models
git fetch models-origin
git merge --allow-unrelated-histories models-origin/master
git remote remove models-origin

对我自己来说,我遇到了一个奇怪的情况,大多数子模块引用都不存在,我得到了错误:

No submodule mapping found in .gitmodules for path 'submodule/path'

这个答案帮助了我:https : //stackoverflow.com/a/13394710/1324919 删除缓存的子模块后,我必须运行子模块更新:

git rm --cached submodule-name
git submodule update --init

现在我有来自子模块的历史记录,主仓库正在跟踪文件。看起来它并不容易/不可能恢复。至少我有那里的历史,我可以阅读并在必要时复制/粘贴。

Git 提交,所有分支历史


推荐阅读