为什么 git 不再看到我的子模块中的更改?

fod*_*dex 8 git git-submodules

Windows 用户在这里。我有一个带有一堆子模块的 C++ git 项目。目录结构看起来像这样:

source
  apps
    myapp1
    myapp2
  externals
    submodule1
    submodule2
    ...
    submoduleN
  packages
    mypackage1
    mypackage2
CMakeLists.txt
Makefile
...
Run Code Online (Sandbox Code Playgroud)

这些子模块是我自己的工作,我在我的项目之间共享(因此我拥有并维护它们)。

克隆这个很简单:

git clone ssh://blabla@blabla/blabla
git submodule update --init
Run Code Online (Sandbox Code Playgroud)

一切都有效一段时间。当我更改子模块中的内容并执行 操作时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")
Run Code Online (Sandbox Code Playgroud)

我进入脏子模块,添加、提交并推送更改。然后,在主项目中,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")
Run Code Online (Sandbox Code Playgroud)

这很好用,直到突然就不行了。这样工作一段时间后(通常是一两天),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)
Run Code Online (Sandbox Code Playgroud)

这里奇怪的部分是,提到的子模块出错的提交并不是子模块实际上是一个提交!它位于不同的提交(较新的提交)上,如我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>
Run Code Online (Sandbox Code Playgroud)

但无论我做什么,git submodule update然后拉入受影响的子模块,git 都不再识别其中的任何内容。更改了内容,更改了提交,它以某种方式查看过时的数据:/

fod*_*dex 5

我想我已经找到答案了。我正在使用 Visual Studio 2022,它似乎会产生大量的 git 进程,这些进程以某种方式在后台徘徊。当这些进程仍在运行时,我遇到了所描述的问题。但是,一旦我终止这些进程,或者只是重新启动,整个问题就会消失,并且 git 会再次按预期运行。

看来这不是git的错,也不是我的错,而是VS2022的源代码控制系统的问题。我将在VS2022中禁用git,看看问题是否重复!