git update-index --assume-unchanged返回“严重无法标记文件”


133

我与这篇博文中的OP遇到了同样的问题,但是我不明白标记为正确的答案(我看不到它说明了解决问题的方法)

我这样做并得到此错误:

$ git update-index --assume-unchanged web.config
fatal: Unable to mark file web.config
  1. 文件已添加到存储库

  2. 它不在 .git/info/exclude

  3. .gitignore不在(是,但是我取出来了,然后使用git add -f web.config,commit 强制添加了web.config 并将这些更改推送到了仓库中)

  4. 当我执行Git ls文件-o时,它不存在

那我该怎么办呢?


1
重新阅读参考问题中接受的答案:它不应出现在的输出中git ls-files -o。如果是这样,则不在仓库中。
eckes 2012年

我的错字,它是不是在列表中,它是最肯定的回购
莫文蔚

Answers:


108

我遇到了与您相同的问题,并且遵循了上面指示的相同的四个步骤,并且得到了相同的结果。这包括执行时列出了​​我的文件的事实git ls-files -o。但是,就我而言,我还尝试git update-index --assume-unchanged对执行时未列出的文件执行ls-files -o,但仍然收到相同的错误“ fatal: Unable to mark file”。

我以为这可能是一个错误,因此下载了最新版本的git,但这并没有帮助。

我终于意识到,该命令区分大小写!这包括完整路径和文件名。 在更新目录的路径以便使用正确的大小写指定完整路径之后,该命令将正确执行。

请注意,这是用于Windows的Git,因此您的结果可能会因其他平台而异。


4
非常感谢SOOOO!这工作了!我想我以前使用的是所有小写字母,或者将其cd到该文件夹​​,然后尝试使用此命令。
卡伦

如果文件将更改,则这是错误的。该命令是用户对Git的承诺,它不必浪费时间声明文件来检测文件是否已更改(对于慢速文件系统;-)。最终,其中一个Git命令将引起注意,您会感到惊讶。文档正在更新以澄清这一点。
菲利普·奥克利

1
谢谢,这间接地帮助我发现了项目中的一些错误的Shell脚本。如果路径不存在,将失败!:)
uchuugaka

另请注意,此命令不适用于未版本控制的文件。如果存储库中不存在某个文件,则可以在.gitignore中忽略该文件,男孩,我觉得键入该文件很愚蠢,但我认为它可能会对像我这样愚蠢的人有所帮助。:)
杰西·艾维

只是为了澄清某些注释所暗示的含义,如果您使用的Windows Shell允许您摆脱CD大小写不匹配的情况,则会出现此错误。给git文件的完整路径(使用正确的大小写),或者cd备份,然后再次向下(再次,在每个阶段使用正确的大小写)。
dlf

54

我在Mac上遇到了同样的问题。区分大小写对我来说不是问题-问题是我需要首先重置git:

问题:

 git update-index --assume-unchanged index.php
 fatal: Unable to mark file index.php

解:

git reset HEAD
Unstaged changes after reset:
M   index.php
git update-index --assume-unchanged index.php

2
我在Mac上遇到相同的问题,建议的解决方法都没有对我有用。任何想法?我试图仅在我的计算机上暂时停止跟踪目录,该目录的名称为intellij_idea_project_files /。显然,此目录中的所有文件均已正确标记,但其中一个文件为my_project_name.iml。
Javad Sadeqzadeh,2015年

1
有同样的问题,这是对我
有用

我也在Mac上,对我来说,“解决方案”是删除文件。(我会将其发布为答案,但我不确定会发生什么情况,也许以后再说。)发生了一些奇怪的事情。Git表示文件已更改(我想更改--skip-worktree)。我通过运行摆脱了本地更改,git restore .但是跳过仍然给出了错误。最后,我尝试删除该文件。令人震惊的是,git没有说发生了变化。很明显,自git明确跟踪它以来,发生了一件时髦的事,我确定删除了它,并且绝对没有说那是改变。
曼队长

25

在我的情况下,我标记的树是一个目录,而不是您所需要的文件,并且在其名称后缺少正斜杠。

不正确-

git update-index --assume-unchanged directory-name

正确-

git update-index --assume-unchanged directory-name/

注意的正斜杠(/)。


1
谢谢,但是当我这样做时,我得到“忽略路径目录名/”
damian

@damian指定完整的文件路径,而不是父目录。
Nahid

6

致命的:无法标记文件本地化/el-GR.js

您可以做的是:

  1. 移动到本地文件所在的正确路径(在GITBASH中)
  2. 更新索引 $git update-index --assume-unchanged <file name>

这对我有帮助!:)


2
$ git update-index --assume-unchanged ./.idea/vcs.xml fatal: Unable to mark file .idea/vcs.xml $ cd .idea git update-index --assume-unchanged .工作,谢谢!
AVProgrammer

4

如果路径中有空格,则即使您使用正确的大小写也可能会出现此错误。

这导致“致命”错误:

git update-index --assume-unchanged code/Solution Files/WebEssentials-Settings-json

要解决此问题,只需在路径周围添加引号。

git update-index --assume-unchanged "code/Solution Files/WebEssentials-Settings-json"

就我而言,我有/向后。
Erik Bergstedt

4

我的问题是,我尝试使用带*通配符的命令,假设它是递归的,但事实并非如此。

所以我所做的是

$ git reset HEAD
Unstaged changes after reset: 
M   .gradle/1.9/taskArtifacts/cache.properties.lock
M   .gradle/1.9/taskArtifacts/fileHashes.bin
M   .gradle/1.9/taskArtifacts/fileSnapshots.bin
M   .gradle/1.9/taskArtifacts/outputFileStates.bin
M   .gradle/1.9/taskArtifacts/taskArtifacts.bin

执行中

$ git update-index --assume-unchanged .gradle/1.9/taskArtifacts/*

然后为我工作,并没有导致OP和我的问题。


4

当我尝试取消跟踪* .orig文件时遇到了这个问题。

这是我为取消跟踪它们所做的:

$git reset -- *.orig

如果那不起作用:

$git clean -fd

5
要求人们执行命令而不告诉他们该命令将删除文件是很危险的。$ git clean -fd
HS Rathore

4

确保将文件添加到git repo中,如果没有将文件添加到git repo中,请尝试使用该文件。


3

--assume-unchanged与慢文件系统有关,用户承诺Git不需要检查此文件,因为Git可以假定其不变。但是某些命令仍然会检查并产生“惊奇”!

不要在变化的文件上使用。

很抱歉成为新闻的带头人(我正在准备一个补丁程序,以更改该文档)。


1
那么,应该如何更新文件以将其标记为“不跟踪我”呢?
javadba

@javadba参见stackoverflow.com/a/6964492/717355'git rm --cached filename'–
Philip Oakley,

thx-对此表示支持:我在这里发布后实际上已经使用过它。作品。
javadba

请注意,git rm --cached filename当其他人拉时,该文件将删除
Ryan Taylor

@RyanTaylor是的,对于用户来说,重要的是要意识到他们的命令在说什么,即“停止跟踪此命令,将其从我的修订版本中删除”。阅读了维护者的最新观点以及我的新补丁。.public
Philip Oakley,

3

就我而言,我尝试使用上述任何一种方法,但没有运气。

经过多次尝试,我只是想将我的文件添加到索引中。

git add myfile.php

吉特拒绝了这项行动,但他建议我强行采取行动。

git add myfile.php -f

那对我有用。



1

也许对某人有用。我遇到了同样的问题,没有语法问题,没有带空格的名称,没有路径问题,并且git reset命令不起作用。我是从apache www内的文件夹提交的,apache服务已停止。再次启动apache服务,错误消失了


1

使用此命令的一个常见错误是试图假设git已经没有跟踪文件或忽略了文件。

首先确保通过运行来跟踪文件

git ls-files | grep relative_path/to/file

如果未显示文件,则需要首先添加它:

git add relative_path/to/file

如果这显示了您的文件,或者您已经将该文件添加到git中,那么您应该能够正常运行git假定命令:

git update-index --skip-worktree relative_path/to/file

或文件夹

git update-index --skip-worktree relative_path/to/folder/

您可以通过运行检查是否假定您的文件被忽略

git ls-files -v | grep ^S

S字符代表跳过的文件。


0

对于所有未来的访客。以上都不解决我的问题。我意识到.gitignore文件必须放在正确的目录中。就我而言,一旦我移到.gitignore应用程序的根目录,问题就解决了。


0

检查要标记的文件是否存在并正确拼写,尤其是文件路径和文件分隔符。Windows系统和Linux系统的文件分隔符方向不同。


1
虽然没有错,但这个答案实际上并没有增加任何问题。您的所有建议已在现有答案中提出。
马特

0

我发现有时这不起作用,因为您已经将文件提交到.gitignore并进行了推或拉。您只需要进行推送,即使在本地修改文件时,在以后的提交中也应忽略文件。


0

我在Windows中遇到了与Cygwin相同的问题。提供完整的文件路径

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.