Git clean 不删除文件

标签 git

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

最佳答案

它并没有真正卡住 - 您有一个名为 LIFE/uploads/docs/Community_Plan_online\303\203\342\200\240%92.pdf 的跟踪(提交)文件。暂存删除并提交删除。

Git 有时会被不区分大小写的文件系统欺骗。您正在处理两个具有两个不同 Unicode 字符的文件名,HFS+ 认为它们是大小写等效的。 Git 在某些情况下认为它们是不同的文件,有时在其他情况下认为它们是同一个文件。

OS-X 默认文件系统不区分大小写,它在 decomposed UTF-8 中存储文件名。 (根据该答案的“规范化形式 D”)。所以我认为 'A\314' 是 HFS+,它使用分解的 UTF-8 作为 pull 丁语 'A' 和组合变音标记(上面的反向逗号?)。 Git 报告的 '\303' 代表带有波浪号的 pull 丁字母 A。我猜这些字母在不区分大小写的文件系统上被认为是等价的。

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

在第二次 git status 期间,Git 检查所有跟踪文件的状态,HFS+ 报告没有与文件名匹配的文件。因此 Git 报告跟踪的文件已被删除。 (当然,既然文件没有了,就不报未追踪文件了。)

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

关于Git clean 不删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15810338/

相关文章:

git - 获取 Git 提交,进行更改,然后重新提交

node.js - 安装 PhoneGap 得到 "error not found: git"

git - 如何在 Git 中完全用远程分支替换本地分支?

git - 重组项目文件夹后丢失 git 历史记录

git - 在不初始化 .gitignore 的情况下将现有项目添加到 Github

git - git文件夹是独立的吗?

git - 尝试备份 Gitlab 时出错

android - 当前目录上的符号链接(symbolic link)级别太多?

git ls-files 按修改时间排序

git - 检查 gitignore 将跟踪哪些文件