为什么git无法识别我的文件已更改,因此git add无法正常工作


97

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

在分支机构主管

无需提交,工作目录干净

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


4
如果您已经提交了,那么您将没有任何提交,请检查git log。
Grady Player

2
git diff的输出是什么?
maazza 2013年

2
@maazza我从git diff中一无所获
somerandomguy

1
如果git diff(或git status)没有显示任何说明为什么没有要添加的内容。所以问题实际上是:“为什么git无法识别我的文件已更改?”
Sunil D.

对不起,我知道发生了什么。git没看到Visual Studio C#对其进行了更改,但是它看到了何时进行了其他更改,例如notepad ++
somerandomguy 2013年

Answers:


123

我曾经有一个问题,曾经有一段时间我在文件上将git索引设置为“假定不变”。

您可以使用以下命令告诉git停止忽略对该文件的更改:

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

如果这样做没有帮助,那么对于其他奇怪的情况而言,重置可能就足够了。


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

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

git rm --cached只手段从索引中删除该文件,并reset告诉混帐从最后一次提交刷新git的指数。


15
git add -f path/to/the/file它将强制添加要提交的文件。

2
这个答案是唯一可以解决我的问题的答案。不知道这是否是Windows的东西(我以前从未在osx或linux中遇到过类似的问题)。因此,感谢@ThorSummoner。顺便说一句,我想git add -f那是在这个“假设不变”状态的文件,它确实没有工作-不得不要么git update-index还是git rm --cached接着一个git reset,使其工作。
rsenna

1
另外,如果您真的不确定您的回购当前状态,请执行以下操作:git rm --cached -r .然后单击git reset .
rsenna

还有另一种尝试,git update-index --no-skip-worktree path/to/file这就是我解决问题的方式
Fr0sT

1
为我工作,但是的,只有单个文件箱。
Thomas Cheng)

24

检查您的.gitignore文件。您可能会发现该文件,该文件的扩展名或您尝试使用的文件的路径与中的条目匹配.gitignore,这将说明为什么忽略该文件(而不将其识别为更改的文件)的原因。

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


添加更多解释;那会帮助别人。
阿米特·乔希

1
我已经使用gitignore.io生成了.gitignore,并且找到了一行lib/,这使得git忽略了该文件夹。这样做没有问题-至少如果该文件夹不是您项目中的主文件夹,例如发生在我身上的事情。
Paladini

对于我而言,这实际上是我的全局排除文件
vpzomtrrfrt

起初,这没有用。但是,我得到了它的工作。就我而言,在gitignore文件中两次提到了要忽略的事情。始终搜索所有事件并替换所有事件。
MasterJoe '18年

8

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

根据文档:

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

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


1
对我来说git status,没有文件被更改,而是git add .添加了两个文件,并git update-index --really-refresh说这两个文件需要更新,但似乎什么也没做。任何想法?
有人withpc

2
git status忽略带有假定未更改标志的文件。但是,使用git update-index --really-refresh将清除该标记,并且文件现在将显示。尝试再次运行git status,以查看它现在是否更改了更改。如果您没有看到任何内容,请遵循以下文章:stackoverflow.com/questions/2363197/… 最值得注意的是,该命令显示具有假定不变的文件列表:git ls-files -v | grep '^[[:lower:]]'如果没有帮助,您应该创建一个具有更多详细信息的问题,以便我们提供帮助您。
安德烈·库尼亚

7

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

1)您保存了更改,以修复类型: git stash pop

2)您进行了更改并提交了更改,您应该能够看到您的提交 git log

3)您所做的更改做了某种git reset --hard或其他更改,您的更改可能在reflog中,键入,git reflog --all然后如果您确实找到它,则签出或挑选该ref。

4)您已多次签出同一仓库,但您输入的是错误的仓库。


1)找不到存储区2)我进行了更改并提交了,所以我可以再次提交吗?3)我没有这么做4)我在正确的
仓库中

如果您进行了更改并提交了更改,则可以继续执行下一步,进行推送或执行任何工作流程...如果有更多更改,则可以再次提交,甚至git commit --amend可以将新更改放入上一次提交中,但是如果您已经共享提交,请不要​​这样做。
Grady Player

在关闭项目回购后,关闭并重新打开终端是为我完成的。
艾迪(Eddie)

6

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


4

发生了类似这样的时髦事件。Eclipse Kepler的git插件自动将.gitignore文件夹中的所有项目文件夹标记为已忽略。

当我commit进入Team菜单时,它们都将重新设置为忽略。据我所知,这是因为我将它们设置为在父项目中派生的。取消将它们标记为已dervied修复。我以前从未在Indigo上看到过这个。希望对大家有所帮助。


您知道在intellij中如何解决此问题?
MasterJoe '18

3

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

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


3

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


我也正在发生这种情况
Kloar,

2

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

我的故事有点有趣,但我认为可能会遇到一个可能遇到类似情况的人,因此请在此处分享。

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

因此,在没有意识到的情况下,我修改了一个repo2我应该在其中更改的完全相同的命名文件repo1。所以,我一直在运行命令git statusrepo1并且一直在发出相同的消息

在分支机构主管

无需提交,工作目录干净

半个小时。然后我的同事将其视为独立的双眼,这件事使我注意到我错了,但外观很相似。我切换到repo1Git 的那一刻开始注意到更改的文件。

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


2

您是否已将目录从shell下移出?如果您从备份中还原了项目,则会发生这种情况。要解决此问题,只需cd外出后退:

cd ../
cd -

哇,就是这样。疯。另一个技巧根本没有用!
Makalele

1

通常,与这个问题有关,请首先检查您是否正在编辑自己认为的文件!当我在编辑一个转译的JavaScript文件而不是源文件时遇到了这个问题(转译的版本不在源代码控制下)。


谢谢你提到这个!我非常确信自己正在更新正确的文件。不。脸掌
Ashley Grenon

1

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

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


1

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


1

在Visual Studio中编辑文件时,即使未保存文件,它也会立即在git更改中列出。因此,您要做的只是手动保存文件(对于当前显示的文件,请按Ctrl + S;对于所有项目文件,请按Ctrl + Shift + S),然后git bash会选择它们。


.js使用Visual Studio Code 将注释添加到文件时,这对我有用。谢谢。
SnuKies

0

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

希望能帮助到你。


0

有时取决于git版本,如果您忘记这样做git add .

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


0

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

它不会建立符号链接,但是会将源的DEEP副本复制到dest

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


0

我有同样的问题。原来我有该项目的两个副本,并且我的终端在错误的项目文件夹中!


0

我也遇到了这种情况,我尝试了上述方法,但无济于事。然后解决方案是通过终端而不是GUI更改文件。我不知道为什么这行得通,但是行得通。从终端git通过nano编辑文件后,我将其识别为已更改,并且能够添加并提交。


您有解决方案吗?当我使用任何合并工具时,我一直在与git无法识别更改的文件作斗争,而让git查看更改的唯一方法是使用nano进行合并,这需要更多时间。冲突的文件最初对git可见,在通过合并工具对其进行编辑后,它们在git上显示为“未更改”。
Lucas P.

我不知道为什么会这样,以及它如何运作,但对我
有用,

0

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


0

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


-1

我有这个问题。我的行不通是因为我将文件放在项目内的.git文件夹中。


-1

就我而言,git reset --hard删除文件并留下一些空文件夹。检查内容后,我发现目录为空。

但是git会忽略空文件夹。(更正后,git在跟踪内容时会忽略所有目录,不包含空文件夹。)


-4

git add * 然后尝试使用git commit


1
欢迎来到SO!这可能无法回答问题,这里已经有9个答案。请把您的精力转向需要回答的问题!
Cris Luengo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.