如何在OS X上消除git中的区分大小写问题?

如何在OS X上消除git中的区分大小写问题?,git,macos,Git,Macos,尝试时 git mv dir1/File.py dir2 我明白了 要调试,我运行 git ls-files | grep File.py 幸运的是,我有别名grep=“grep-I”,问题很清楚文件.py受版本控制文件.py不是 我猜我曾经从shell中将file.py重命名为file.py(在OSX上,这通常需要使用第三个名称)。Git继续将这两个文件视为同一个文件,因为OSX将它们视为一个文件。但git拒绝移动文件,除非案例也匹配 我如何系统地确定git回购中是否存在类似的案例敏感性问

尝试时

git mv dir1/File.py dir2
我明白了

要调试,我运行

git ls-files | grep File.py
幸运的是,我有
别名grep=“grep-I”
,问题很清楚<代码>文件.py受版本控制<代码>文件.py不是

我猜我曾经从shell中将
file.py
重命名为
file.py
(在OSX上,这通常需要使用第三个名称)。Git继续将这两个文件视为同一个文件,因为OSX将它们视为一个文件。但git拒绝移动文件,除非案例也匹配

我如何系统地确定git回购中是否存在类似的案例敏感性问题

我使用的默认格式是
OSXextended(Journaled)
,它不区分大小写,我希望保持这种格式

更新


我刚刚注意到了这篇文章。

这有点粗糙,但在Bash中应该可以使用:

git ls-files | xargs -I{} sh -c 'ls "{}"* &>/dev/null || echo {}'
目标是运行一个命令,显示文件的实际情况

考虑这一点:

$ ls
A.md
我们有一个名为
a.md
的文件。但是:

$ ls a.md
a.md
什么?即使实际名称是
A.md
, shell将其与
a.md
——错误的大小写匹配

幸运的是,当我们使用globs时,情况会有所不同:

$ ls a.md*
ls: a.md*: No such file or directory
$ ls A.md*
A.md
这就是我们要寻找的:通过执行
ls文件*
,我们可以验证该确切名称是否确实存在

为此,Bash的
nocaseglob
选项必须是
off

shopt -u nocaseglob
位于最顶端的命令将针对存储库中的每个文件运行此shell:

ls "{}"* &>/dev/null || echo {}
这里,
{}
是循环迭代中的文件名, 我们尝试执行一个
ls{}*
,丢弃命令的输出, 如果命令失败,我们将打印我们尝试的文件名。 如果文件不存在,则命令失败: 例如,因为文件名的大小写不同

顶部命令的输出将是Git存储库中的文件列表,但无法找到同名文件。 这些是您需要修复的文件

限制:在某些情况下,该命令可能无法正常工作:

  • 如果有多个文件的开头相同
  • 如果文件名中有换行符
最后,您可以更改文件的大小写,而无需在Finder中使用第三个中间名称

如果工作树中没有更改,则修复名称的简单方法是将其从工作区中删除,然后签出:

git ls-files | xargs -I{} sh -c 'ls "{}"* &>/dev/null || echo {}' | xargs rm
git checkout .

这有点骇客,但在Bash中应该可以使用:

git ls-files | xargs -I{} sh -c 'ls "{}"* &>/dev/null || echo {}'
目标是运行一个命令,显示文件的实际情况

考虑这一点:

$ ls
A.md
我们有一个名为
a.md
的文件。但是:

$ ls a.md
a.md
什么?即使实际名称是
A.md
, shell将其与
a.md
——错误的大小写匹配

幸运的是,当我们使用globs时,情况会有所不同:

$ ls a.md*
ls: a.md*: No such file or directory
$ ls A.md*
A.md
这就是我们要寻找的:通过执行
ls文件*
,我们可以验证该确切名称是否确实存在

为此,Bash的
nocaseglob
选项必须是
off

shopt -u nocaseglob
位于最顶端的命令将针对存储库中的每个文件运行此shell:

ls "{}"* &>/dev/null || echo {}
这里,
{}
是循环迭代中的文件名, 我们尝试执行一个
ls{}*
,丢弃命令的输出, 如果命令失败,我们将打印我们尝试的文件名。 如果文件不存在,则命令失败: 例如,因为文件名的大小写不同

顶部命令的输出将是Git存储库中的文件列表,但无法找到同名文件。 这些是您需要修复的文件

限制:在某些情况下,该命令可能无法正常工作:

  • 如果有多个文件的开头相同
  • 如果文件名中有换行符
最后,您可以更改文件的大小写,而无需在Finder中使用第三个中间名称

如果工作树中没有更改,则修复名称的简单方法是将其从工作区中删除,然后签出:

git ls-files | xargs -I{} sh -c 'ls "{}"* &>/dev/null || echo {}' | xargs rm
git checkout .