为啥 git 无法识别我的文件已更改,因此 git add 不起作用

Posted

技术标签:

【中文标题】为啥 git 无法识别我的文件已更改,因此 git add 不起作用【英文标题】:Why doesn't git recognize that my file has been changed, therefore git add not working为什么 git 无法识别我的文件已更改,因此 git add 不起作用 【发布时间】:2013-06-04 06:58:46 【问题描述】:

我正在尝试使用 bash 将我的文件推送到 github。他们已经在那里了,我正在上传一个带有新行和代码等的更新版本。但是当我尝试git add 然后git status 它说:

在主分支上

没有提交,工作目录干净

而我正在使用的文件刚刚被修改。

【问题讨论】:

如果你已经提交了,那么你将没有什么可提交的,检查 git log。 git diff 的输出是什么? @maazza 我从 git diff 中一无所获 如果git diff(或git status)没有显示任何可以解释为什么没有可添加的内容。所以问题真的是:“为什么 git 不能识别我的文件已被更改?” 对不起,伙计们,我知道发生了什么。git 没有看到 Visual Studio C# 更改了它,但它会看到其他东西何时更改它,例如 notepad++ 【参考方案1】:

我遇到了一个问题,曾几何时,我在我的文件中将 git 索引设置为“假定未更改”。

你可以告诉 git 停止忽略对文件的更改:

git update-index --no-assume-unchanged path/to/file

如果这对其他奇怪的情况没有帮助,reset 可能就足够了。


在实践中,我发现删除缓存文件并将其重置为工作:

git rm --cached path/to/file
git reset path/to/file

git rm --cached 表示只从索引中删除文件,reset 告诉 git 从上次提交中重新加载 git 索引。

【讨论】:

git add -f path/to/the/file 它将强制添加要提交的文件。 这个答案是唯一有助于解决我的问题的答案。不确定这是否是 Windows 的问题(我过去 从未 遇到过类似的问题,无论是在 osx 还是在 linux 中)。所以感谢@ThorSummoner。顺便说一句,我尝试了git add -f 处于这种“假设不变”状态的文件,它确实工作 - 必须git update-indexgit rm --cached 后跟git reset 才能使它工作。 另外,如果你真的不确定你的回购当前状态,这样做:git rm --cached -r . 然后git reset . 为我工作,但只有单个文件案例。 它可以工作,使用此命令按照@rsenna git rm --cached -r 。然后 git reset 。【参考方案2】:

检查您的.gitignore file。您可能会发现您尝试使用的文件、文件扩展名或文件路径与 .gitignore 中的条目匹配,这可以解释为什么该文件被忽略(并且不被识别为更改的文件) .

当我遇到类似问题时,我就是这种情况。

【讨论】:

我使用gitignore.io 来生成我的.gitignore 并且我发现与lib/ 有一行,是什么让git 忽略了这个文件夹。没有问题 - 至少如果这个文件夹不是你项目的主文件夹,就像我发生的那样。 对于我的任何人来说,这实际上是我的全局排除文件 起初,这不起作用。但是,我让它工作了。就我而言,要忽略的东西在 gitignore 文件中被提到了两次。始终搜索所有匹配项并全部替换。【参考方案3】:

听起来很疯狂,但有时即使您认为自己在正确的存储库中,但您却不在正确的存储库中。例如,您可能已经移动了父目录,但忘记在文本编辑器中切换存储库。反之亦然:您在文本编辑器中位于正确的仓库中,但在命令行中位于错误的仓库中。在第一种情况下,您在正确的 file 中进行了编辑,但它与在命令行中打开的文件夹不同,因此它实际上是错误的文件。在第二种情况下,您实际上确实编辑了正确的文件,但是您的命令行 git 无法识别更改,因为您不在命令行上的正确目录中。

【讨论】:

该死的。我想:多么愚蠢。在我检查编辑器的路径之前,这永远不会成为问题。 ?【参考方案4】:

就像已经讨论过的那样,这些文件可能被标记为“assume-unchanged”,这基本上告诉 git 你不会修改这些文件,因此它不需要跟踪它们的更改。但是,这可能会影响多个文件,如果它是一个很大的工作区,您可能不想一个一个地检查它们。在这种情况下,您可以尝试: git update-index --really-refresh

根据文档:

Like --refresh, but checks stat information unconditionally, without regard to the "assume unchanged" setting.

它基本上会强制 git 跟踪所有文件的更改,而不管“假定不变”标志。

【讨论】:

对我来说git status 说没有文件被更改,但git add . 添加了两个文件,git update-index --really-refresh 说这两个需要更新,但似乎没有做任何事情。有什么想法吗? git status 忽略带有假设未更改标志的文件。但是,使用 git update-index --really-refresh 将清除该标志,并且文件现在将显示。尝试再次运行 git status 以查看它现在是否更改了更改。如果您没有看到任何内容,请关注此帖子:***.com/questions/2363197/… 最值得注意的是显示具有假设无更改的文件列表的命令:git ls-files -v | grep '^[[:lower:]]' 如果没有任何帮助,您应该创建一个包含更多详细信息的问题,以便我们为您提供帮助。 【参考方案5】:

好吧,我们没有足够的能力来回答这个问题,所以我会给你几个猜测:

1) 你隐藏了你的更改,修复类型:git stash pop

2) 你有更改并提交了它们,你应该能够在git log看到你的提交

3) 您进行了某种git reset --hard 或其他方面的更改,您的更改可能在 reflog 中,输入 git reflog --all,然后检查或挑选 ref(如果您确实找到它)。

4) 你已经多次检查了同一个 repo,但你错了。

【讨论】:

1) 没有找到 stash 2) 我有更改并已提交,所以我可以再次提交吗? 3)我没有这样做 4)我在正确的回购中 如果您有更改并已提交,那么您可以进入下一步,推送或任何您的工作流程......如果您有更多更改,您可以再次提交,您甚至可以@987654325 @ 这会将您的新更改放入您的最后一次提交中,如果您已经共享了您的提交,请不要​​这样做。 在清理项目仓库后关闭并重新打开终端为我做了这件事。【参考方案6】:

发生了这样一件奇怪的事情。 Eclipse Kepler 的 git 插件会自动在 .gitignore 文件夹中将我的所有项目文件夹标记为已忽略。

当我在Team 菜单上找到commit 时,它们都会重新设置为忽略。据我所知,这是因为我将它们设置为在父项目中派生的。将它们取消标记为 dervied 解决了这个问题。我以前从未在 Indigo 上看到过这种情况。希望对某人有所帮助。

【讨论】:

知道如何在 intellij 中解决此问题吗?【参考方案7】:

我有一些 git 子模块配置错误。我去了 repo 的根目录,并在之前有 .git 文件夹的目录上发出了这些命令:

git rm --cached sub/directory/path -f

然后目录出现在git status

为了以防万一,您可能需要在尝试之前复制您的存储库。

【讨论】:

【参考方案8】:

我们在 Windows 上通过 WinMerge 工具传输差异来更改文件时发生了这种情况。显然 WinMerge(至少它在我的计算机上的配置方式)有时不会更新它更改的文件的时间戳

在 Windows 上,git status 使用文件的时间戳和文件大小的变化来确定文件是否已更改。所以由于时间戳没有更新,它只有文件大小。不幸的是,该文件是一个简单的版本文件,其内容从 7.1.2 更改为 7.2.0。换句话说,文件大小也保持不变。其他文件也被 WinMerge 更改并且没有更新其时间戳,但在 git status 检测到更改后大小不同。

【讨论】:

【参考方案9】:

TL;DR;您是否在正确的存储库中?

我的故事有点好笑,但我认为它可能发生在可能有类似情况的人身上,所以在这里分享。

实际上,在我的机器上,我有两个独立的 git 存储库 repo1repo2 配置在名为 source 的同一根目录中。这两个存储库本质上是我在公司工作和使用的两种产品的存储库。现在的问题是,作为标准指南,我公司所有产品的源代码目录结构都完全相同。

所以没有意识到我在repo2 中修改了一个完全相同的命名文件,我应该在repo1 中更改它。所以,我一直在repo1 上运行命令git status,它一直给出相同的消息

在主分支上

没有什么要提交的,工作目录干净

半小时。然后我的同事将它观察为独立的一双眼睛,并让我注意到我错了但看起来非常相似的存储库。我切换到repo1 的那一刻,Git 开始注意到更改的文件。

不太常见的情况。但你永远不知道!

【讨论】:

【参考方案10】:

我在使用 Sublime Text-3 时遇到了类似的问题。 在对代码进行新的更改并保存后,当我尝试 git add ./status 命令时,响应是“分支已经是最新的”。 我发现,无论在文本编辑器中保存更新,文件实际上都没有改变。 在其他编辑器中打开文件并保存更改对我有用。

【讨论】:

这也发生在我身上【参考方案11】:

您是否将目录从 shell 下移出?如果您从备份中恢复了项目,则可能会发生这种情况。要解决这个问题,只需 cd 退出并返回:

cd ../
cd -

【讨论】:

哇,原来如此。疯狂的。另一个技巧根本不起作用!【参考方案12】:
git update-index --really-refresh

你可以试试这个命令,它会更新你文件夹中的索引。

【讨论】:

【参考方案13】:

一般来说,对于这个问题,首先检查您是否正在编辑您认为的文件!我在编辑转译的 javascript 文件而不是源文件时遇到了这个问题(转译的版本不受源代码控制)。

【讨论】:

感谢您提及这一点!我非常确信我正在更新正确的文件。没有。 掌心【参考方案14】:

我的 Git 客户端 (Gitg) 为我造成了这个问题。我通常会运行的正常命令不起作用。即使触摸项目中的每个文件也不起作用。

我找到了修复它的方法,但我仍然不确定是什么原因造成的。复制您的项目目录。丢失的文件将显示在复制目录的git status 中。重命名可能会做同样的事情。

【讨论】:

【参考方案15】:

我遇到了同样的问题。原来我有两个项目副本,而我的终端位于错误的项目文件夹中!

【讨论】:

【参考方案16】:

遇到了问题,但它只有两个目录,我不知道这两个目录最终都被配置为 git 子模块。我不知道这是怎么发生的,但这个过程是按照这个链接上的一些说明进行的,但不要删除目录(就像他最后所做的那样),而是做git add path/to/dir

【讨论】:

【参考方案17】:

当您在 Visual Studio 中编辑文件时,即使文件未保存,它也会立即列在 git 更改中。因此,您只需手动保存文件(Ctrl+S 用于当前显示的文件或 Ctrl+Shift+S 用于所有项目文件),git bash 会选择它们。

【讨论】:

当我使用 Visual Studio Code 将 cmets 添加到 .js 文件时,这对我有用。谢谢。【参考方案18】:

这也发生在我身上,我尝试了上述方法,但没有任何帮助。然后解决方案是通过终端更改文件,而不是 GUI。我不知道为什么这有效但有效。在我从终端通过 nano 编辑文件后,git 将其识别为已更改,并且我能够添加并提交。

【讨论】:

您找到解决方案了吗?当我使用任何合并工具时,我一直在与我的 git 不识别我更改的文件作斗争,而让 git 查看更改的唯一方法是使用 nano 进行合并,这需要更多时间。冲突文件最初对 git 可见,在它们被合并工具编辑后,它们在 git 上显示为“未更改”。 我不知道为什么会这样以及它是如何工作的,但它对我有用,谢谢【参考方案19】:

我有同样的问题。我需要提交的文件也从未在 .gitignore 文件中声明过。

在我的例子中,使用提升到暂存的-f 标志强制添加文件并修复了问题。

git add -f <path to file>

【讨论】:

【参考方案20】:

您尝试上传哪种文件?现在我只花了将近一个小时来上传我的 css 修改。但是这个 css 是从 styl 文件编译的,因此 git 只是忽略了它。当我更改样式源时,一切正常。

希望对你有帮助。

【讨论】:

【参考方案21】:

有时取决于 git 版本,如果你忘记了git add .

要检查您对存储库的更改,请始终使用git status,它会显示所有未跟踪和更改的文件。因为git diff 只显示添加的文件。

【讨论】:

【参考方案22】:

确保从适用于 Windows 的 Git Bash 内部创建符号链接 (ln -s source dest)。

它不创建符号链接,而是将源的深度副本复制到目标

我在 Windows 版 Git Bash(版本 2.16.2)的 MINGW64 终端上遇到了与 OP 相同的行为,我意识到我的“编辑”更改实际上位于原始目录中,而我的 git bash 命令来自深层副本保持不变。

【讨论】:

【参考方案23】:

我在这里遇到同样的问题 VS2015 没有识别我的 js 文件更改,从存储库设置中删除远程,然后重新添加远程 URL 路径解决了我的问题。

【讨论】:

【参考方案24】:

当我使用 vi 编辑器在服务器中创建补丁文件时,我遇到了类似的问题。似乎问题在于间距。当我从本地推送补丁时,部署是正确的。

【讨论】:

【参考方案25】:

如果您使用 VSCode 并切换到新机器,您可能会关闭 Autosave,因此即使您对文件进行更改,git 也不会识别它们。

这解决了我的问题

【讨论】:

【参考方案26】:

以下内容对我有用:

git mv tesfile.js TestFile.js

更多详情请查看:https://***.com/a/16071375/11677643

【讨论】:

【参考方案27】:

当所有更改都在新目录中时,这发生在我身上。我添加了第一个文件

git add newdirectory/new.file

然后git status按预期显示目录中的其他文件。

【讨论】:

【参考方案28】:

我遇到了这个问题。我的不工作,因为我将文件放在项目内的 .git 文件夹中。

【讨论】:

【参考方案29】:

尝试使用git add * 然后git commit

【讨论】:

欢迎来到 SO!这可能无法回答问题,这里已经有 9 个答案。请把你的精力放在需要回答的问题上!

以上是关于为啥 git 无法识别我的文件已更改,因此 git add 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Git 将文件列为已更改但没有更改

为啥在 Windows 和 Linux 机器之间复制 repo 后 Git 会指示更改?

Git 删除添加的带有大文件的提交

如何在终端中更改我的 Git 用户名?

为啥在取消 git 提交后我的更改消失了,我该如何恢复它们?

git 显示在 Mac NFS 文件系统上更改的随机文件