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