【问题标题】:How to ignore Icon? in git如何忽略图标?在 git
【发布时间】:2013-07-07 12:48:03
【问题描述】:

在尝试使用 git 设置保管箱文件夹时,我看到了一个不是我创建的“Icon\r”文件。我尝试在 ~/.gitignore 文件中忽略它。但是添加 Icon\r Icon\r\r Icon? 根本不起作用。

【问题讨论】:

  • 其实Icon? 对我有用。
  • @johntex 这意味着您将忽略“图标”+任何后续字符。因此,名称为“图标”的文件夹也会被忽略,这可能很糟糕。
  • 我也有同样的问题,我有一个名为 icons 的目录以及一个名为 icons.svg 的精灵。我的解决方案是将!icons 添加到我的 .gitignore 文件中,以便允许目录和文件使用该名称而不会被忽略。文件夹图标仍会根据需要被忽略。
  • +1 对于那些启发我 ?"\r""\r\r"。很难找到这一点。我的情况不是针对 .gitignore ,而是在 PHP 中列出文件夹时。我将“Icon\r”和“Icon\r\r”都留在了我的排除列表中,因为单个\r 对我有用。 我会为 .gitignore 使用 printf 解决方案。干杯!

标签: macos git


【解决方案1】:

您也可以使用vim

  1. vim .gitignore
  2. 换行写Icon,然后
  3. ctrl+v 然后按 Enter
  4. 重复步骤 3
  5. 保存退出(快捷键:ZZ

现在你应该有Icon^M^M 并且它已经完成了:)

为了更智能的使用,您可以将其添加到~/.gitignore_global 中的 gitignore 全局配置文件中。

【讨论】:

  • 我不确定您是否需要第 4 步? $ find . -name "Icon^M^M" 什么也不给,但$ find . -name "Icon^M"./Icon。 gitignore 有什么不同吗?
  • 实际上,在我的系统上不起作用,^M 也不起作用
  • 谢谢!你知道为什么我们需要两个 ^M,当它出现在ls 结果中就像Icon? 和一个快速的git status 显示"Icon\r"?很奇怪。
  • 嗨@LukeDavis!可能 char ? 是多字节的?
  • 您可以(并且应该)使用ANSI-C Quoting 精确指定文件名;例如find . -name $'Icon\r'
【解决方案2】:

(根据 hidnexplanation 的建议,根据 robotspacer 的建议,这改进了原始答案。)

Icon? 是 OS X 文件夹图标的文件。 “?”是双回车的特殊字符(\r\r)。

要告诉git 忽略它,请打开终端并导航到您的存储库文件夹。然后输入:

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

如果文件不存在,将创建它,Icon\r\r 将是它的一行。如果文件确实存在,Icon\r\r 行将被附加到它。

【讨论】:

  • ? 代表单个回车。正如 hidn 的 answer 所解释的那样,双重 \r\r 之所以起作用,只是因为 git 将最后一个 \r 解释为 \r\n EOL 约定的一部分,并且确实是比 [\r] 更糟糕的选择。
  • 结合这两个建议,您可以使用它来将更安全的规则版本添加到现有文件中:printf "Icon[\r]" >> .gitignore
  • 我建议添加更多关于有多少文本编辑器(取决于它们的设置)可能会改变行尾的上下文。他们这样做是出于好意;例如本着标准化行尾的精神,但在这种情况下,它使编辑 .gitignore 文件变得更加困难。
  • 出于实际考虑(我们倾向于使用文本编辑器,而这些编辑器通常会“正确”行尾),这种方法很脆弱。我在stackoverflow.com/a/65429032/109618 建议了一个替代答案
  • 帖子顶部的原始答案(使用> 而不是>>)破坏了.gitignore 文件(如果它确实存在)。鉴于没有理由使用它(>> 在这两种情况下都有效),我只是删除了它。这可以保护那些在接受的答案中匆忙寻找第一块代码并盲目复制的用户。 不好意思地举手
【解决方案3】:

"Icon[\r]" 可能是更好的选择。
在 vim 中,你只需输入Icon[^M],即Icon[ 后跟 CtrlVEnter 然后 ]

"Icon\r\r" 的问题是 EOL 转换。

整行其实是"Icon\r\r\n",算行尾。根据您的设置,CRLF 可能会在提交时转换为LF,因此您的存储库实际上将具有"Icon\r\n"。假设您将更改同步到另一个存储库。您将在该工作目录中获得"Icon\r\n",它会忽略Icon,但不会忽略Icon^M。如果你进一步编辑.gitignore 并在那里提交,你最终会得到"Icon\n" - 完全失去\r

我在一个项目中遇到了这个问题,其中一些在 OS X 上开发,而一些在 Windows 上。通过使用方括号将\r 和行尾分开,我不必重复\r 两次,也不用担心EOL 转换。

【讨论】:

  • 本次讨论最简单的解决方案。感谢发帖!
  • 不幸的是无法让它工作,但@rjatkinson 的回答确实有效。 (虽然它可能只是我,但不是downvoting。)
  • TextMate 用户:输入Icon[,点击++Enter,输入]
  • 将以下行添加到 .gitattributes 文件以正确查看终端中的差异:/.gitignore text diff
【解决方案4】:

最好的地方是在你的全局 gitignore 配置文件中。您可以创建此文件,访问它,然后按照以下步骤进行编辑:

>> git config --global core.excludesfile ~/.gitignore_global

>> vim ~/.gitignore_global

i进入插入模式

在新行输入Icon

在同一行时,ctrl + v, enter, ctrl + v,输入

esc,然后按 shift + ; 然后输入 wq 然后点击进入

【讨论】:

  • 这个答案说明了要按什么键 - 但不是 什么 他们做什么 - 或者为什么他们是必要的。
  • +1 将其放入全局 gitignore 是“唯一一种真正明显的方法”。命令行上的printf "Icon\r\r" >> ~/.gitignore_global(如 eldes 的回答)将在不使用 vim 的情况下添加该行。
【解决方案5】:

关于命名(和引用)事物:首先,知道ANSI-C Quoting 可用于明确匹配 macOS 图标文件,将会有更多人受益。 Icon$'\r'$'Icon\r' 都可以在 Bash 和 Zsh 以及大多数其他现代 shell 中工作,我希望,比如 Fish。

保持您的 .gitignore 可编辑:虽然我对此处其他答案提供的字节级操作印象深刻,但这些方法在实践中很脆弱。简而言之,程序员倾向于使用文本编辑器,其中许多编辑器被配置为在保存文件时更改行尾。 (例如,请参阅此VS Code discussion about line ending normalization。)

您希望编辑器撤消您仔细的字节编辑吗?当然不是。所以也许你发现配置你的编辑器这样既实用又方便,这样它就不会影响行尾。您可能会查看(a)特定于编辑器的配置设置;或 (b) 跨编辑器配置(即EditorConfig)。

但这变得复杂而混乱。如果想要更简单、更灵活的方式,请在您的 .gitignore 文件中使用:

# .gitignore
Icon?
![iI]con[_a-zA-Z0-9]

模式说明:

  • 使用Icon?,因为gitignore 格式不支持\r 作为转义码。
  • 使用 [iI],因为 Git 可能区分大小写。
  • 使用[_a-zA-Z0-9]捕捉很多常见的ASCII字符;您可能想扩大范围。

您可以测试您的 gitignore 模式是否按预期工作:

git check-ignore -v *

例如,为了测试,将这些文件放在一个目录中:

-rw-r--r--@  Icon?
-rw-r--r--   icon8
drwxr-xr-x   icons
-rw-r--r--   iconography

...git check-ignore -v * 的结果是:

/Users/abc/.gitignore:3:Icon?   "Icon\r"
/Users/abc/.gitignore:4:![iI]con[_a-zA-Z0-9]    icon_
/Users/abc/.gitignore:4:![iI]con[_a-zA-Z0-9]    icons

这就是你想要的。

长期建议如果 Git 支持 .gitconfig 文件中的 \r 转义,这个问题将很容易解决。可以简单地写:

# .gitignore
Icon[\r]

所以我建议我们与Git community 合作并尝试实现这一目标。

(如果您确实想涉足并向 Git 提出补丁建议,请务必先阅读 。)

参考文献

来自gitignore documentation

否则,Git 将模式视为 shell glob:“*”匹配除“/”、“?”之外的任何内容匹配除“/”之外的任何一个字符,“[]”匹配选定范围内的一个字符。有关更详细的说明,请参见 fnmatch(3) 和 FNM_PATHNAME 标志。

有关 .gitignore 文件中方括号语法和否定语法的良好示例,请参阅 This linuxize.com article

对于那些想要深入了解 Git 源代码中模式匹配如何随时间变化的用户,您可以运行此search for uses of fnmatch in the git repository on GitHub

【讨论】:

  • 这个答案应该在最上面,接受的答案应该改成这个。如果您从命令行或使用文本编辑器(或仅后者)编辑 gitignore 文件,那确实是最好的。
  • 这个更健壮。
【解决方案6】:

图标?是 OSX 文件夹图标的文件。原来\r实际上是CRLF。所以我使用 ruby​​ 将行添加到.gitignore 文件。打开终端并导航到home 文件夹,然后:

> irb
>> f = File.open(".gitignore", "a+") #<File:.gitignore>
>> f.write("Icon\r\r")  # output a integer
>> f.close
>> exit

【讨论】:

    【解决方案7】:

    对我来说,这在 TextMate 中有效:Icon&lt;CR&gt;&lt;CR&gt;&lt;CR&gt; 是一个回车符,在键盘上的ctrl-alt-return 处。您还可以在标准 Character Viewer 应用程序中搜索 cr 找到它。请注意&lt;CR&gt; 是一个不可见 字符,因此只有在编辑器设置为显示它们时它才可见。

    【讨论】:

      【解决方案8】:

      我只是发布了一个更新答案,因为上面的答案对我不起作用,但实际上只是在我的 .gitignore 中添加 Icon? 就可以了。如果您在 Finder 上查看您的名称文件,它实际上就是它的显示方式。

      【讨论】:

      • 请注意,Icon? 也会忽略“图标”之类的内容。对于大多数工作的答案,你的行尾应该是LF,但在mac上它是CR,AFAIK。它还取决于你的 git 的行尾转换设置。之所以这样显示,是因为很多应用程序都使用“?”作为任何不可打印字符的占位符。
      【解决方案9】:

      Icon[\r] 对我不起作用。我不得不在.gitignore...中使用以下内容...

      Icon*
      

      我还在我的 Settings > Core > Ignored Names in Atom 中添加了 Icon*...

      .git, .hg, .svn, .DS_Store, ._*, Thumbs.db, desktop.inis, Icon*
      

      【讨论】:

        猜你喜欢
        • 2014-11-12
        • 1970-01-01
        • 2010-11-02
        • 2011-10-19
        • 2011-09-11
        • 1970-01-01
        • 2014-06-15
        • 1970-01-01
        • 2013-11-14
        相关资源
        最近更新 更多