【问题标题】:How to weed out case-sensitivity issues in git on OS X?如何在 OS X 上清除 git 中的大小写敏感问题?
【发布时间】:2016-07-11 14:10:43
【问题描述】:

尝试时

git mv dir1/File.py dir2

我明白了

fatal: not under version control, source=dir1/File.py, destination=dir2/File.py

为了调试我运行

git ls-files | grep File.py

幸运的是我有alias grep="grep -i",问题很清楚。 file.py 受版本控制。 File.py 不是。

我猜我曾经从 shell 中将 file.py 重命名为 File.py(在 OS X 上,这通常需要通过第三个名称)。 Git 继续将这两个文件视为相同,因为 OS X 将它们视为一个。但是 git 拒绝移动文件,除非大小写也匹配。

我如何系统地确定 git repo 中是否存在类似的区分大小写的问题?

我使用OS X extended (Journaled) 的默认格式,它区分大小写,我想保持这种格式。

更新

我刚刚注意到这个relevant 帖子。

【问题讨论】:

    标签: git macos


    【解决方案1】:

    这有点老套,但在 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 匹配——错误的大小写。

    幸运的是,当我们使用 glob 时,这会有所不同:

    $ ls a.md*
    ls: a.md*: No such file or directory
    $ ls A.md*
    A.md
    

    这就是我们正在寻找的:通过ls the-file*,我们可以验证该确切名称是否真的存在。

    为此,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 .
    

    【讨论】:

      猜你喜欢
      • 2016-04-14
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多