【问题标题】:Remove weird 'Iconr' file from the repository从存储库中删除奇怪的“Iconr”文件
【发布时间】:2014-04-30 15:54:56
【问题描述】:

在我的 git 存储库中,我在暂存区有一个奇怪的文件,它拒绝被还原、删除、提交 - 基本上我不能让它消失..

该文件必须是某个古老的 OS 9 文件在文件夹中放置多年。

几天前我已经删除了文件系统中的文件,所以现在 git 正在跟踪 Iconr 的删除。

但是,它卡在那里。

我通过 SourceTree(我的 git UI 客户端)得到的错误是

致命:pathspec 'folder/Iconr' 不匹配任何文件

知道如何让 git 完全忘记该文件吗?

【问题讨论】:

标签: macos git atlassian-sourcetree


【解决方案1】:

【讨论】:

  • 放大:添加“图标?”到 .gitignore 会导致 'Icon\r' 被忽略。自从 ?是单字符通配符,则 Iconx、Icon1 等名称也将被忽略。但是,“图标?”使用任何文本编辑器都很容易应用......并且足以满足许多用例。
  • 添加“图标?”进入 .gitignore 为我工作。 “Icon”或“Iconr”或“Icon\r”没有。
  • 这是一个比接受的答案更好的答案。 Icon\r 和其他几个变体是 OSX 文件放入目录中以表示自定义文件夹图标。有许多类似的变体,所有这些变体都有一个额外的字符,但这个答案涵盖了所有这些。
【解决方案2】:

最好恢复到命令行以获得更准确的错误消息。

您可以在此处尝试git add -u,然后是git commit,以便在存储库中注册该文件的删除。
以“git status says file is deleted but git rm says error: pathspec '…' did not match any files”为例。

您还可以预览 git clean 会提供什么:git clean -d -x -n(如“Why is there no “pathspec” when I try to remove a folder in Git?”中所述)

另一个问题是当该文件在您当前的分支中根本没有被跟踪时,而是在另一个分支中被跟踪。请参阅that answer 以检查是否是这种情况。

【讨论】:

    【解决方案3】:

    Icon^M-like 文件很可能是由某些外部应用程序创建的,例如 Folderol,它们会突出显示您的文件夹。

    您应该删除正在执行此操作的应用,或者在您的 .gitignore 文件中忽略它,例如

    printf "Icon\r\r" >> .gitignore
    

    这是一个shell命令。或者将其添加为Icon??,或者您可以通过Control-V 并点击Enter 来重现^M 特殊字符。

    相关:How to ignore Icon? in git

    如果您不想将此更改提交到您的存储库,或者将其添加到您的全局 .gitignore 或添加到 .git/info/exclude

    请参阅:Using Git / Ignoring files

    要自行删除文件,请尝试:

    find . -type f -name 'Icon?' -print -delete
    

    或者,如果它们是唯一未暂存的,请运行:git clean -f

    【讨论】:

    • 一个问号对我有用 find 。 -type f -name '图标? -print -delete
    【解决方案4】:

    作为一般解决方法,可以编辑 .gitignore 文件以完全忽略 Icon\r 文件,如此博客条目中所述:Git Tip: Ignoring Icon\r in .gitignore

    【讨论】:

      【解决方案5】:

      您可以使用通配符忽略任何级别的子文件夹上的Icon?

      // .gitignore
      **/Icon?
      

      通配符从 git 1.8.2 版本开始工作

      【讨论】:

      • 这里不需要通配符。如果您删除前导/,它将被递归搜索。
      【解决方案6】:

      SourceTree 中显示为“Iconr”的内容实际上是 Icon\r,其中 \r 是十六进制值 0x0d

      与 POSIX 正则表达式相比,.gitignore 文件名模式匹配受到限制。 Icon\rIcon\x0d 等正则表达式模式不适用于 SourceTree。

      简单忽略:在 .gitignore 文件中添加 Icon? 模式可以在 SourceTree 中忽略“Iconr”文件。

      警告:Icon? 使用 ?,这是一个单字符通配符。因此,Icon\r、“icona”、“icon3”和“Icons”等文件和文件夹将被Icon? 模式忽略。如果需要,请使用文件名“Icon01”、“icon02”、“iconaa”而不是“Icon1”、“icon2”、“icona”,并使用此解决方法将此类文件添加到 git。

      精确忽略:精确的Icon\r 文件名可以用二进制编辑器忽略。

      在 binhex 编辑器中,在 .gitignore 文件中添加 0a 49 63 6f 6e 0d 0d 0a。额外的 0as 是用于将 Icon\r\r 括起来的换行符,以便以后编辑其他 unix 文件。

      警告:如果使用精确值 49 63 6f 6e 0d,请注意不要将 \r 替换为 \n。换句话说,不要在设置为使用这种方法自动替换行分隔符的文本编辑器中编辑 .gitignore。

      注意:Simple IgnoreIcon? 对于大多数用例来说是方便且足够的。退出并重新启动 SourceTree 以查看更改生效。 macOS 的 git 默认不区分大小写。

      自定义文件夹/文件图标:每次将自定义图标添加到文件夹或文件时,都会创建一个 Icon\r 文件。例如,可以通过“获取信息”窗口添加自定义图标。以下是默认系统文件夹图标已替换为自定义文件夹图标的示例:

      Icon\r 文件可以通过文件/文件夹的“获取信息”窗口手动删除,或者通过调用 shell 命令删除 Icon\r 文件,如 kenorb 的回答中所述。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多