【问题标题】:git update-index --assume-unchanged returns "fatal unable to mark file"git update-index --assume-unchanged 返回“致命的无法标记文件”
【发布时间】:2012-10-06 21:42:13
【问题描述】:

我遇到了与this 帖子上的 OP 相同的问题,但我不明白标记为正确的答案(我看不出它解释了如何解决这种情况)

我这样做并得到这个错误:

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

  2. 它不在.git/info/exclude

  3. 它不在.gitignore 中(它是,但我把它拿出来,然后强制 web.config 使用git add -f web.config 添加,已提交,并且 将这些更改推送到 repo)

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

那么我可以做些什么来解决?

【问题讨论】:

  • 重新阅读引用问题中接受的答案:它不应出现在git ls-files -o 的输出中。如果是这样,它不在 repo 中。
  • 我的错字,它不在列表中,它肯定在 repo 中

标签: git


【解决方案1】:

我遇到了和你一样的问题,按照你上面提到的四个步骤,得到了同样的结果。这包括我的文件在执行git ls-files -o 时被列出的事实。但是在我的情况下,我也尝试对执行ls-files -o 时未列出的文件执行git update-index --assume-unchanged,但我仍然收到相同的错误“fatal: Unable to mark file”。

我以为可能是bug,下载了最新版的git,但是没有用。

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

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

【讨论】:

  • 非常感谢!这行得通!我想我之前使用的是全小写,或者 cd 到文件夹然后尝试使用这个命令。
  • 如果文件会改变,那么这是错误的。该命令是用户对 Git 的承诺,它不必浪费周期来声明文件以检测它是否已更改(对于慢速文件系统;-)。最终,其中一个 Git 命令会注意到,您会感到惊讶。正在更新文档以澄清这一点。
  • 谢谢,这间接帮助我在项目中发现了一些糟糕的 shell 脚本。如果路径不存在,这将失败! :)
  • 另请注意,此命令不适用于未版本控制的文件。如果你有一个在存储库中不存在的文件,它可以在 .gitignore 中被忽略,男孩我觉得打字很傻,但我认为它可能会帮助像我这样愚蠢的人。 :)
  • 只是为了澄清一些 cmets 所暗示的内容,如果您使用的是允许您摆脱 cd 中大小写不匹配的 Windows shell,您将收到此错误。要么给 git 文件的完整路径(使用正确的大小写),要么 cd 向上然后再向下(再次,在每个阶段都使用正确的大小写)。
【解决方案2】:

如果您的路径有空格,即使您的大小写正确,您也可能会收到此错误。

这会导致“致命”错误:

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

要修复它,只需在路径周围添加引号。

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

【讨论】:

  • 在我的情况下,我有 / 向后。
【解决方案3】:

我在 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

【讨论】:

  • 我在 Mac 上遇到了同样的问题,建议的解决方法都不适合我。任何想法?我试图仅在我的机器上暂时停止跟踪目录,该目录的名称是 intellij_idea_project_files/。显然,该目录中的所有文件都已正确标记,除了一个,即 my_project_name.iml。
  • 遇到了同样的问题,这是对我有用的解决方案,而不是区分大小写的解决方案
  • 我也在 Mac 上,对我来说,“解决方案”是删除文件。 (我会将此作为答案发布,但我不确定发生了什么,也许稍后会发生。)发生了一些奇怪的事情。 Git 说文件已更改(我想--skip-worktree)。我通过运行git restore . 摆脱了本地更改,但跳过仍然给出了错误。最后我尝试删除文件。令人震惊的是,git 并没有说有变化。很明显,发生了一些奇怪的事情,因为 git 肯定在跟踪它,我肯定删除了它,它肯定没有说这是一个变化。
【解决方案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 和我的问题。

【讨论】:

    【解决方案5】:

    --assume-unchanged 是关于慢速文件系统的,用户承诺 Git 不需要检查这个文件,因为 Git 可以假设它没有变化。但是一些命令仍然会检查并产生“惊喜”!

    不要用于更改的文件。

    很抱歉成为那个消息的带来者(我正在处理一个补丁来更改那个文档)。

    【讨论】:

    • 那么应该如何更新文件以将其标记为“不要跟踪我”?
    • @javadba 见stackoverflow.com/a/6964492/717355'git rm --cached 文件名'
    • thx - 对此表示赞同:我在此处发布后实际上已使用它。工作。
    • 注意git rm --cached filename会在别人pull时删除文件
    • @RyanTaylor 是的,让用户意识到他们的命令在说什么很重要,即“停止跟踪此内容,将其从我的修订版中删除”。阅读维护者的最新观点和我的新补丁..public-inbox.org/git/20161101210448.4692-1-philipoakley@iee.org/…
    【解决方案6】:

    确保您已签入“web.config”。

    如果不是,您将收到此错误消息。

    【讨论】:

      【解决方案7】:

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

      这就是我为取消追踪他们所做的:

      $git reset -- *.orig
      

      如果这不起作用:

      $git clean -fd
      

      【讨论】:

      • 要求人们执行命令而不告诉他们该命令将删除文件是危险的。 $git clean -fd
      • 在你的评论 Rathore 之前我很愚蠢地运行了这个命令。我所有的文件都被删除了!!
      • 应该去掉删除文件的命令!
      【解决方案8】:

      致命:无法标记文件 Localization/el-GR.js

      你可以做的是:

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

      这对我有帮助! :)

      【讨论】:

      • $ git update-index --assume-unchanged ./.idea/vcs.xml fatal: Unable to mark file .idea/vcs.xml $ cd .idea git update-index --assume-unchanged . 工作,谢谢!
      • AVProgrammer 的解决方案在 OS X 上对我有用
      【解决方案9】:

      确保文件已添加到git repo,如果没有将文件添加到git repo,然后尝试它会起作用。

      【讨论】:

        【解决方案10】:

        在我的例子中,我标记的树是一个目录,而不是你的例子中的一个文件,我在它的名字后面缺少了正斜杠。

        不正确 -

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

        正确 -

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

        注意末尾的正斜杠(/)。

        【讨论】:

        • 谢谢,但是当我这样做时,我得到“忽略路径目录名/”
        • @damian 指定完整文件路径而不是父目录。
        • 如果我这样做,我会得到 damian 所做的。除了我的文件是文件而不是文件夹。
        【解决方案11】:

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

        【讨论】:

          【解决方案12】:

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

          【讨论】:

            【解决方案13】:

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

            【讨论】:

            • 虽然没有错,但这个答案并没有真正为问题添加任何内容。您的所有建议都已在现有答案中提出。
            【解决方案14】:

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

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

            git add myfile.php
            

            Git 拒绝了这个动作,但他建议我强制执行。

            git add myfile.php -f
            

            这对我有用。

            【讨论】:

              【解决方案15】:

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

              【讨论】:

                【解决方案16】:

                我在 Windows 中遇到了与 cygwin 相同的问题。给出完整的文件路径

                【讨论】:

                  【解决方案17】:

                  使用此命令的一个常见错误是试图假设 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 字符代表跳过的文件。

                  【讨论】:

                  • 在我的例子中,该文件已经在排除的扩展名列表中。
                  【解决方案18】:

                  有同样的问题,没有其他工作(我的文件被跟踪,而不是在 gitignore 中)。我意识到我从上面几行的终端输出中复制了文件名,这使得它在文件名之后复制了空格。即使看起来没有空间,最后我还是有很多空间。因此,仅复制文件路径并将其保存在双引号中,这会有所帮助。 我也先做了一个git reset HEAD

                  git update-index --assume-unchanged "app/src/main/java/com/username/projectName/Utils.kt"
                  

                  【讨论】:

                    【解决方案19】:

                    所以我在使用这个时遇到了同样的错误:

                    git update-index --assume-unchanged appsettings.Development.json
                    

                    所以我改成

                    git update-index --assume-unchanged appsettings.development.json
                    

                    我其实一开始尝试了很多方法,但最终还是使用了这个。所以我猜它区分大小写

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-06-16
                      • 2018-03-03
                      • 2013-04-27
                      • 2011-08-31
                      • 2012-08-30
                      • 1970-01-01
                      相关资源
                      最近更新 更多