.gitattributes使用“* text=auto”过滤器的技巧问题

3
在跨平台项目中,如何为所有文本文件正确配置CRLF规范化,使用“text=auto”将其与“smudge”和“clean”过滤器一起配置特定文件的“*.h filter=myfilter”?
示例:
# my .gitattributes
* text=auto           # in case people don't have core.autocrlf set
*.h filter=myfilter   # filter for header files

在添加了*.h filter=myfilter之后,我收到了如下警告信息:
warning: LF will be replaced by CRLF in foo.h.
The file will have its original line endings in your working directory.
如果我删除*.h filter=myfilter,那么警告就会消失。为什么?这一行是否禁用了*.h文件的CRLF规范化?
更新
关于警告,过滤器使用sed替换文件头注释中的标记。当在Windows上运行时,sed会将CRLF转换为LF。这就是警告的来源。解决方法是以二进制模式运行sed--binary)。
1个回答

3
一些实验产生了相当混乱的结果。 gitattributes文档 首先就指出:
当多个模式匹配路径时,后面的行会覆盖前面的行。这种覆盖是针对每个属性进行的。
(强调是我的)这明确意味着,虽然 *.h filter=myfilter 覆盖了任何早期的 filter 设置匹配,但它不应影响任何早期的 * text=... 设置。
实际的签入和签出过程似乎表现良好:早期的 * text=<whatever> 是被遵守的。
然而,其他命令似乎将 filter 视为覆盖了 text。(这似乎是警告的来源。)
在这种情况下,您可以通过编写以下内容来解决问题:
*.h text=auto filter=myfilter

但总的来说,这似乎违反了记录下来的行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接