git update-index --assume-unchanged 返回错误

19

git update-index --assume-unchanged <filename>命令返回:fatal:无法标记文件<filename>

我需要做什么才能解决这个问题? 它在抱怨什么,为什么会这样?


2
你解决了吗?让我知道,这样我就可以更新答案,告诉你到底发生了什么。 - Pedro Nascimento
4个回答

16

它是否已添加到存储库,而不在.git/info/exclude.gitignore中?

如果答案是肯定的,则该文件不在存储库中,这就是错误的原因。

尝试运行git ls-files -o并查看文件是否存在。 它不应该存在。


如果您的文件已经被暂存,您仍然会收到相同的错误提示,因此您可能需要先执行 git reset HEAD <file> - DavidJ
我不得不更新.git/info/exclude文件以忽略该文件。不知道为什么它不能使用update-index。之前它一直很好用。 - Mejan

6
你正在运行 git update-index --assume-unchanged,因为你有文件已经提交到代码仓库中,但你想忽略本地更改。
正如 Pedro 指出的那样,导致错误的文件没有被提交到代码仓库中。(在 git ls-files -o 中显示,这意味着它未被跟踪。)
这可能是因为你正试图递归地忽略整个目录,如下所示:
find ./folder/ -type f | xargs git update-index --assume-unchanged

不仅该文件夹中的文件被修改,还创建了新文件(例如通过构建脚本)。

如果您确定要忽略所有已修改的文件,可以使用以下命令:

git ls-files -m | xargs git update-index --assume-unchanged

但是要注意,操作 --assume-unchanged 可能会很麻烦。考虑重新设计,使这些文件根本不需要在存储库中。然后您可以将它们添加到 .gitignore 中,并使用 git rm --cached 从存储库中删除它们。如果能够使这些文件既不在存储库中也不在用户的工作目录中,那就更理想了。例如,如果这些文件是作为构建过程的一部分创建的,您可以创建一个静态库,而不是让每个开发人员在本地运行构建过程。

1

对于那些试图排除整个目录的人:

我刚遇到了这个问题,感到相当困惑。我已经在.gitignore中添加了该目录,并且其中一个文件出现在git ls-files -o中。该目录的其他文件显示在git status中。

最后,我弄清楚了必须以不同的方式处理目录中的文件,因为其中一些文件已经被跟踪,而另一些文件则没有。因此,我只是对已经被跟踪的文件(在git status中显示为已修改的文件)使用了git update-index --skip-worktree <file>(在我的情况下更好的版本是git update-index --assume-unchanged <filename>,请参见here)。与在整个目录上调用此命令相比,这样做有效,因为我没有尝试排除尚未被跟踪但已被.gitignore排除的文件。我不必使用此命令来排除该目录中的其他文件,因为它们已经被.gitignore排除了。


0

首先,对您的文件进行分阶段处理。然后,在此之后运行--assume-unchanged命令。最后,取消分阶段处理


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接