Git clean不能删除文件

3
git reset --hard HEAD

给我的是
git status

# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   "LIFE/uploads/docs/Community_Plan_onlineA\314\203\342\200\240%92.pdf"
nothing added to commit but untracked files present (use "git add" to track)

通常情况下,执行清理操作可以删除这个未跟踪的文件。

git clean -df

Removing "LIFE/uploads/docs/Community_Plan_onlineA\314\203\342\200\240%92.pdf"

然而,我正在遇到这个问题。

git status

# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    "LIFE/uploads/docs/Community_Plan_online\303\203\342\200\240%92.pdf"
#
no changes added to commit (use "git add" and/or "git commit -a")

请注意文件名略有不同(_Plan_online\303而不是_Plan_onlineA\314)。是什么导致这个文件被卡住了?我正在使用OSX并设置了core.autocrlf=false。
1个回答

2

实际上它并没有被卡住——你有一个名为LIFE/uploads/docs/Community_Plan_online\303\203\342\200\240%92.pdf的跟踪(提交)文件。暂存删除并提交即可将其清除。

Git有时会受到大小写不敏感的文件系统的影响。你正在处理两个带有HFS+视为大小写等效的两个不同Unicode字符的文件名。在某些情况下,Git认为它们是不同的文件,而在其他情况下则认为它们是相同的文件。

OS-X默认文件系统不区分大小写,并且它以分解的UTF-8(根据该答案,“规范化形式D”)存储文件名。因此,我认为'A\314'是HFS+使用带有组合变音符号的拉丁字母'A'的分解UTF-8。Git报告的'\303'代表带有波浪线的拉丁A。我猜这些字母在大小写不敏感的文件系统中被认为是等效的。

在第一个git status期间,我猜Git检查所有跟踪文件的状态,而HFS+报告一个大小写等效的文件名作为该文件名的存在。然后,Git寻找未跟踪的文件,并看到一个文件名与其跟踪文件列表中的任何文件名都不完全匹配。因此,Git仅报告未跟踪的文件。

在第二个git status期间,Git检查所有跟踪文件的状态,而HFS+没有报告与该文件名匹配的文件。因此,Git报告已删除一个跟踪文件。(当然,现在该文件已经消失,所以它不会被报告为未跟踪的文件。)

你没有说你使用的Git版本,但更新的Git版本可能会更好地处理这种情况。


1
感谢您的解释。我本来以为这与文件名编码有关,但您真的提供了一个很好的问题描述。我们在混合的Windows/Mac环境中工作,所以我怀疑该文件是从Windows先推送的。顺便说一下,这个问题在最新的git版本1.8.2中仍然存在。 - Bernard

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