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 都不再识别其中的任何内容。更改了内容,更改了提交,它以某种方式查看过时的数据:/
我想我已经找到答案了。我正在使用 Visual Studio 2022,它似乎会产生大量的 git 进程,这些进程以某种方式在后台徘徊。当这些进程仍在运行时,我遇到了所描述的问题。但是,一旦我终止这些进程,或者只是重新启动,整个问题就会消失,并且 git 会再次按预期运行。
看来这不是git的错,也不是我的错,而是VS2022的源代码控制系统的问题。我将在VS2022中禁用git,看看问题是否重复!