git update-index --assume-unchanged <filename>
返回fatal: Unable to mark file <filename>
。
我需要做什么来解决这个问题?它在抱怨什么,为什么?
它是否添加到存储库中,而不是 in.git/info/exclude
和 on .gitignore
?
如果其中任何一个的答案是肯定的,那么文件不在存储库中,这就是错误的原因。
试试看git ls-files -o
文件是否存在。不应该。
您正在运行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
可能会很痛苦。
考虑重新工作,以便这些文件根本不需要在 repo 中。然后你可以将它们添加到你的.gitignore
并从存储库中删除它们git rm --cached
。
如果您可以将文件保留在 repo 和用户工作目录之外,那可能是理想的。例如,如果文件是作为构建的一部分创建的,您可以创建一个静态库,而不是让每个开发人员在本地运行构建过程。
对于那些有这个问题试图排除整个目录的人:
我刚遇到这个问题,很困惑。我在 .gitignore 中添加了目录,其中一个文件出现在 .gitignore 中git ls-files -o
。该目录的其他文件显示在git status
.
我终于发现我必须以不同的方式处理目录中的文件,因为其中一些已经被跟踪,而另一些则没有。所以我只是在已经跟踪的文件上使用git update-index --skip-worktree <file>
了(在我的情况下是更好的版本git update-index --assume-unchanged <filename>
,请参见这里git status
)(那些显示为被修改的文件)。与在整个目录上调用此命令相比,这很有效,因为我没有尝试排除尚未跟踪且已被 .gitignore 排除的文件。这个目录中的其他文件我不必用这个命令排除,因为它们已经被 .gitignore 排除了。