在尝试使用 git 设置保管箱文件夹时,我看到了一个不是我创建的“Icon\r”文件。我尝试在 ~/.gitignore 文件中忽略它。但是添加Icon\r
Icon\r\r
Icon?
根本不起作用。
9 回答
你也可以使用vim。
vim .gitignore
- 在新行中写入
Icon
,然后 - 按ctrl+v然后按Enter
- 重复步骤 3
- 保存并退出(快捷键ZZ:)
现在你应该已经Icon^M^M
完成了:)
为了更智能地使用,您可以将其添加到 .gitignore 全局配置文件中~/.gitignore_global
。
(根据hidn的解释,根据robotspacer的建议,这改进了原始答案。)
这Icon?
是 OS X 文件夹图标的文件。" ?
" 是双回车 ( \r\r
) 的特殊字符。
要告诉git
忽略它,请打开终端并导航到您的存储库文件夹。然后输入:
printf "Icon\r\r" >> .gitignore
如果文件不存在,它将被创建并Icon\r\r
成为它的一行。如果文件确实存在,则该行将Icon\r\r
附加到它。
"Icon[\r]"
可能是一个更好的选择。
在 vim 中,您只需输入Icon[^M]
,Icon[
后面跟着CtrlV, Enterthen ]
。
问题"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 转换。
最好的地方是在你的全局 gitignore 配置文件中。您可以创建此文件,访问它,然后按照以下步骤进行编辑:
>> git config --global core.excludesfile ~/.gitignore_global
>> vim ~/.gitignore_global
按下i进入插入模式
Icon
在新行上键入
而在同一行,ctrl+ v, enter, ctrl+ v,enter
按esc, 然后shift+;然后输入wq然后点击enter
关于命名(和引用)事物:首先,更多人会因为知道ANSI-C 引用可用于明确匹配 macOS 图标文件而受益。Icon$'\r'
or和都$'Icon\r'
可以在 Bash 和 Zsh 以及大多数其他现代 shell 中工作,我希望,比如 Fish。
保持您的 .gitignore 可编辑:虽然我对此处其他答案提供的字节级操作印象深刻,但这些方法在实践中很脆弱。简而言之,程序员倾向于使用文本编辑器,其中许多编辑器被配置为在保存文件时更改行尾。(例如,请参阅this 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
这就是你想要的。
长期建议\r
如果 Git 支持.gitconfig 文件中的转义,这个问题将很容易解决。可以简单地写:
# .gitignore
Icon[\r]
所以我建议我们与Git 社区合作并尝试实现这一目标。
(如果您确实想涉足并向 Git 提出补丁建议,请务必阅读第一的。)
参考
否则,Git 将模式视为 shell glob:“*”匹配除“/”、“?”之外的任何内容 匹配除“/”之外的任何一个字符,“[]”匹配选定范围内的一个字符。有关更详细的说明,请参见 fnmatch(3) 和 FNM_PATHNAME 标志。
有关 .gitignore 文件中方括号语法和否定语法的良好示例,请参阅这篇 linuxize.com 文章。
对于那些想要深入了解 Git 源代码中模式匹配如何随时间变化的人,您可以在 GitHub 上的 git 存储库中运行此搜索以查找使用fnmatch
。
图标?是 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
我只是发布一个更新答案,因为上面的答案对我不起作用,但实际上只是添加Icon?
了我的.gitignore
工作。如果您在 Finder 上查看您的名称文件,它实际上就是它的显示方式。
Icon[\r]
对我不起作用。我不得不在.gitignore
...中使用以下内容
Icon*
我还添加Icon*
到我的 Settings > Core > Ignored Names in Atom...
.git, .hg, .svn, .DS_Store, ._*, Thumbs.db, desktop.inis, Icon*