Git 随机丢失跟踪

KJa*_*nek 0 git git-bash

我在使用 git 时遇到了两个星期的问题,更准确地说是在 windows 上使用 git (Git-2.36.1-64)。

这是非常奇怪的行为,导致随机(对我来说是随机的)git 丢失文件跟踪。我的意思是,我修改了 10 个文件,当我提交时,它会提交 7 个文件,但忘记了另外 3 个文件。然后我必须运行两个命令:“git rm --cached .-r”和“git reset”。这个命令总是对我有帮助。有时它会保留所有文件 2 小时,有时会忘记所有文件。“git status”命令显示存储库是干净的,没有任何内容处于阶段或非阶段模式。即使我修改文件...有时它保留文件,有时不保留文件。这不是控制台、VS Code 或 Visual Studio 的问题,同样的问题,只是失去跟踪。

不幸的是,所有存储库都会发生这种情况。重新安装 git 或使用 git portable 没有帮助。我还在 Windows 中使用了“重置电脑”,但保留了我的文件,它删除了环境变量等。也没有帮助。

我 100% 确定这些存储库没问题,因为我的同事使用来自我们的 Azure DevOps 的相同存储库。我也在我的第二台计算机上使用了这个存储库,并且从未遇到过这样的问题。

我已经没有想法了,这非常干扰我的日常工作......

关于Windows,我使用的是最新版本的Windows 11。也许这就是问题所在?

编辑:今天又发生了,所以我可以展示发生了什么。 文件正在修改但尚未保存 归档已保存并因更改而消失 Git 状态还显示工作树干净 运行 Git rm --cached 。 -r 和 git 重置 。 现在 git 跟踪该文件

  1. 文件正在修改但尚未保存
  1. 归档已保存并因更改而消失
  1. Git 状态还显示工作树干净
  1. 运行 Git rm --cached 。-r 和 git 重置 。
  1. 现在 git 跟踪该文件

LeG*_*GEC 5

[编辑] 这个答案首先建议文件同步服务存在问题,但经过进一步调试,您的问题似乎与本地存储库中设置的一些标志相关联:

运行git ls-files --debug | grep -B5 "flags: [^0]"您确定某些文件设置了assume-unchanged标志(显示为flags: 8000)。

您可以阅读使用假设不变位部分git help update-index以获取更多详细信息(或令人头痛;))。

以下是从一个单独的文件中删除该标志的命令:

git update-index --no-assume-unchanged <filepath>
Run Code Online (Sandbox Code Playgroud)

有一种更短的方法来获取完整的assume-unchanged文件列表:

git ls-files -v | grep "^[a-z]"   # see 'git help ls-files' :
                                  # status is lowercase if assume-unchanged

# to "un assume unchange" all files in one go :
git ls-files -v | grep "^[a-z]" | awk '{ print $2 }' |\
    xargs git update-index --no-assume-unchanged
Run Code Online (Sandbox Code Playgroud)

还要检查core.ignorestat配置值:它应该设置为 false (或者您应该知道将其保持为 true 的充分理由)

git config core.ignorestat
Run Code Online (Sandbox Code Playgroud)

其他一些配置变量会影响如何git处理其索引,它们都以core.(阅读git help update-index并搜索core.以列出它们)开头:

git config --show-origin --get-regexp core

# config variables to look for (2022-05-31 - git version 2.35.0) :
#   core.filemode
#   core.fsmonitor
#   core.ignorestat
#   core.splitIndex
#   core.symlinks
#   core.trustctime
#   core.untrackedCache
Run Code Online (Sandbox Code Playgroud)