【发布时间】:2022-07-06 21:47:02
【问题描述】:
Windows 用户在这里。我有一个带有一堆子模块的 C++ git 项目。目录结构如下所示:
source
apps
myapp1
myapp2
externals
submodule1
submodule2
...
submoduleN
packages
mypackage1
mypackage2
CMakeLists.txt
Makefile
...
子模块是我自己的工作,我在我的项目之间共享(所以我拥有并维护它们)。
克隆它很简单:
git clone ssh://blabla@blabla/blabla
git submodule update --init
一切都会持续一段时间。当我更改子模块中的内容并执行git status 时,git 会识别这一点并说:
C:\blabla>git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
(commit or discard the untracked or modified content in submodules)
modified: source/externals/XXX (modified content)
no changes added to commit (use "git add" and/or "git commit -a")
我进入脏子模块,添加、提交和推送更改。然后,在主项目中,git 会注意到我现在正在进行不同的提交:
C:\blabla>git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: source/externals/XXX (new commits)
no changes added to commit (use "git add" and/or "git commit -a")
这工作正常,直到突然它不再。像这样工作一段时间(通常是一两天)后,git突然停止识别一个或多个子模块的变化。当我进入受影响的子模块目录并在那里点击git status 时,git 会看到更改。但是当我在主项目中做同样的事情时,git不再说那个子模块中有修改的内容。当我在子模块中添加、提交和推送更改时,git 不再识别子模块现在处于不同的提交中。尝试git submodule update 并不能解决任何问题。它将受影响的子模块带回到出现问题之前的提交状态。但是,当我执行git checkout master 然后git pull 以恢复我的更改时,在主目录中执行git status 仍然显示该子模块没有任何更改。
我只知道解决这个问题的两种方法:
- 删除整个项目并重新克隆
- 将子模块克隆到另一个不相关的目录中,更改、提交然后推送一些东西(实际上是任何东西),然后在我的项目中执行
git pull... 奇怪的是,这就是 git 带来的原因,一切都恢复了。
有人知道是什么原因造成的吗?很抱歉这篇超长的帖子,试图提供尽可能多的背景信息。
编辑:我又遇到了问题。
git submodule sync 什么也没解决。
git submodule status 显示如下:
e773ebc7904dd5f695bfa56880bd0874207d57be source/externals/... (heads/master)
9b3ef1bd87dd4a2ab0c527499162df84babff1de source/externals/... (remotes/origin/HEAD)
99f672b772fa876a790b86d6900191fd3eba1d3e source/externals/THIS_ONE_GOES_WRONG (99f672b)
27ed4009784093fa8a095415ec4666135dece821 source/externals/... (remotes/origin/HEAD)
dd207664b563c4fe271c995fda7b1b93ec40f437 source/externals/... (remotes/origin/HEAD)
这里奇怪的是子模块出错的提交不是子模块实际上是一个提交!它在不同的提交(较新的提交)上,如我在受影响的子模块中执行 git log 时所示:
commit c374f672a8ac8fc5d8f312a7cf75785c96ca5763 (HEAD -> master, origin/master, origin/HEAD)
Author: ...
Date: Tue Apr 12 19:29:14 2022 +0200
<commit message>
commit 99f672b772fa876a790b86d6900191fd3eba1d3e
Author: ...
Date: Tue Apr 12 16:15:03 2022 +0200
<commit message>
但无论我做什么,git submodule update 然后拉入受影响的子模块,git 不再识别其中的任何内容。更改了内容,更改了提交,它以某种方式查看过时的数据:/
【问题讨论】:
-
git submodule status能得到什么? -
我怀疑你运行的东西实际上是
git submodule update,这让你回到了 old 子模块提交。您应该git add超级项目中的子模块并运行git commit以在新的超级项目提交中记录子模块的新哈希 ID。
标签: git git-submodules