【问题标题】:Why does git not see the changes in my submodules anymore?为什么 git 不再看到我的子模块中的更改?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 我确认这解决了问题。
【解决方案2】:

首先检查您的git config -l 输出,了解与子模块相关的任何设置。

例如,将 status.submoduleSummary 设置为 true,或将 diff.ignoreSubmodules 设置为 false。

还要检查任何 .git 子文件夹,它会将子模块文件夹转换为嵌套的 Git 存储库(完全被父存储库中的 git status 忽略)

【讨论】:

  • 下次发生这种情况时,我会检查这是否有帮助:) 问题:如何从简单的“git add,git commit,git push”用法中改变这些,我从来没有做任何比触发问题
  • @foddex 这些只是git config 设置。如果你最近升级了 Git,它们的一些默认值可能会发生变化。
  • 好的,它又发生了,当我做git config -l 时,我没有看到与你提到的两个选项相关的任何内容......
  • @foddex 是否有任何.gitattributes 文件可以声明内容过滤驱动程序在结帐时自动更改内容?
  • 我没有 .gitattributes 文件
【解决方案3】:

重启我的电脑解决了这个问题。 VSCode 也可能是问题所在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 2021-01-31
    • 2013-09-17
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多