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)。是什么导致这个文件粘住?我正在使用 core.autocrlf=false 使用 OSX

4

1 回答 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+,使用分解的UTF-8作为拉丁语'A'和一个组合变音符号(上面的反逗号?)。Git 报告的 '\303' 表示带有波浪号的拉丁语 A。我猜这些字母在不区分大小写的文件系统上被认为是等效的。

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

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

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

于 2013-04-04T23:15:26.933 回答