为啥 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-index
或git 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 存储库 repo1
和 repo2
配置在名为 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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 Windows 和 Linux 机器之间复制 repo 后 Git 会指示更改?