为什么 git 再也看不到我的子模块中的更改?
Why does git not see the changes in my submodules anymore?
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 周围一切又恢复正常了。
有人知道是什么原因造成的吗?抱歉超长 post,尽量提供尽可能多的上下文。
编辑:我又遇到了问题。
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 config -l
输出,了解与子模块相关的任何设置。
例如,将 status.submoduleSummary
to true, or or diff.ignoreSubmodules
设置为 false。
还要检查任何 .git 子文件夹,它会将子模块文件夹转换为嵌套的 Git 存储库(完全被父存储库中的 git status
忽略)
我想我找到了答案。我正在使用 Visual Studio 2022,它似乎产生了大量的 git 进程,这些进程以某种方式在后台徘徊。当这些进程仍然是 运行 时,我遇到了所描述的问题。但是,只要我终止这些进程,或者简单地重新启动,整个问题就会消失并且 git 再次按预期运行。
看来这不是git或我的错,而是VS2022的源代码控制系统的问题。我将在 VS2022 中禁用 git 并查看问题是否重复!
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 周围一切又恢复正常了。
有人知道是什么原因造成的吗?抱歉超长 post,尽量提供尽可能多的上下文。
编辑:我又遇到了问题。
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 config -l
输出,了解与子模块相关的任何设置。
例如,将 status.submoduleSummary
to true, or or diff.ignoreSubmodules
设置为 false。
还要检查任何 .git 子文件夹,它会将子模块文件夹转换为嵌套的 Git 存储库(完全被父存储库中的 git status
忽略)
我想我找到了答案。我正在使用 Visual Studio 2022,它似乎产生了大量的 git 进程,这些进程以某种方式在后台徘徊。当这些进程仍然是 运行 时,我遇到了所描述的问题。但是,只要我终止这些进程,或者简单地重新启动,整个问题就会消失并且 git 再次按预期运行。
看来这不是git或我的错,而是VS2022的源代码控制系统的问题。我将在 VS2022 中禁用 git 并查看问题是否重复!