如何在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存储库中的文件列表,但无法找到同名文件。
这些是您需要修复的文件
限制:在某些情况下,该命令可能无法正常工作:
- 如果有多个文件的开头相同
- 如果文件名中有换行符
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存储库中的文件列表,但无法找到同名文件。
这些是您需要修复的文件
限制:在某些情况下,该命令可能无法正常工作:
- 如果有多个文件的开头相同
- 如果文件名中有换行符
git ls-files | xargs -I{} sh -c 'ls "{}"* &>/dev/null || echo {}' | xargs rm
git checkout .