“=12=” “=10=” “=13=” 举报 “=11=” “=13=” 举报

Merging/moving "child" git repo into "parent" git repo

我是 git 的新手,只将它用于简单的项目提交等,所以我可能犯了错误!

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

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

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

我认为这导致了冲突,导致 visual studio 无法识别我的更改。我想基本上删除项目目录中的“子”git 存储库,并让“父”存储库管理整个解决方案。

我尝试按照此方法(来自 )合并两个存储库:

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 存储库管理所有项目?

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

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

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

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

In the models directory:

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 submodules metadata is stored in the .gitmodules file:

remove the submodule from that file.

git add .gitmodules

.git/config has a similar entry, edit that file as well.

git rm --cached models

rm -rf .git/modules/models

git commit -m 'Remove models submodule'

rm -rf models

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

In the main repository run the commands:

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'

这个答案对我有帮助: 删除缓存的子模块后,我不得不 运行 更新子模块:

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

现在我有了子模块的历史记录,主仓库正在跟踪文件。它看起来不像是 easy/possible 恢复到。至少我在那里有历史,我可以通读并在必要时 copy/paste 退出。