为什么 git 没有显示我的文件已修改?

Why is git not showing my files as modified?

正在更改文件

我修改了磁盘上的一个文件,运行 git status,说没有任何改变。 运行 git update-index --really-refresh 修改后的文件出现了。

几个星期以来,我每天都会多次遇到这个错误,我怀疑它是一个新的 git4win 错误,或者甚至可能与 Windows 文件系统有关。我一直在使用 git,因为它是在十五年前开始使用的,所以它不是 "I forgot X"。在过去的两个小时内,我已经发生了四次错误。然后我什至有一个小时的午休时间!

$ git --version
git version 2.23.0.windows.1

坏理论

我最初认为它可能与我单独安装的 Linux-git 的 Windows 子系统有关。删除该安装并再次克隆我的所有存储库后(第 N 次)我仍然收到此错误。

修改添加的文件

git 丢失我修改过的文件也适用于已经添加但此后修改过的文件。这导致我提交+推送了很多我已经审查+编译的文件(在我的 IDE 中或在 cli 中),但它们的内容并不相同,而且确实如此。当我 运行 update-index --really-refresh 时,我看到我已经推送了最初添加的文件,但没有推送我修改和编译的文件。

它不是什么

这与 git ignore 无关,因为这发生在已经添加的文件上(参见上面的第二种情况)。它与 WSL 没有直接关系,因为我已经在那里卸载了 git。我没有奇怪的git设置:

core.symlinks=false
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
rebase.autosquash=true
http.sslbackend=openssl
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
credential.helper=manager
diff.astextplain.textconv=astextplain
user.name=Jonas Bystrom
user.email=...
core.autocrlf=true
core.pager=less -F -X
core.longpaths=true
alias.ca=commit -a
alias.nb=checkout -b
alias.quicklog=log --pretty=format:"%h %cr %cn %Cgreen%s%Creset"
alias.logdiff=log -p --stat
alias.search=log --source --all -p --decorate=full -G
push.default=upstream
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
remote.origin.url=ssh://...
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master

我不知道该尝试什么。欢迎任何关于尝试的指示!

直接原因是我的文件已经"assume unchanged",你可以通过

查看
$ git ls-files -v pom.xml
h pom.xml

那个 h 标志意味着 git 在寻找修改过的文件时应该忽略它。修复方式:

git update-index --no-assume-unchanged pom.xml

编辑 2: 我错误地用 IDEA community edition 提交了一个错误,而根本原因是我的公司主目录 (H:\) 有一个.gitconfig 其中包含 core.ignoreStat=true。我在 bash.exe/msys (C:\Users\xxx\) 中使用的 .gitconfig 没有。通过设置 core.ignoreStat=false.

修复