如果将.gitattributes
文件添加到给定目录,其内容完全如下:
*.txt text
是否有可能将新文件或先前规范化的文件(例如所有LF行结束符)提交到该目录而不规范化?也就是说,在启用.gitattributes
并指定text
模式后,是否有可能将新的CRLF行结尾引入存储库?
.gitattributes
文件是一个绝对万无一失的方法来防止新的CRLF行被提交到包含.gitattributes
文件的目录中的*.txt
文件中吗?我想说服我的同事,.gitattributes
文件是完全足够的,并且进一步排除crlf的措施(例如服务器端钩子)是不必要的。
答案应该确认不可能覆盖.gitattributes
指定的行结束行为,或者提供一个反例来解释如何绕过.gitattributes
文件并潜入一些CRLF行结束。
不容易通过gitattributes
,因为负模式是禁止的。
事实上,这几天(2013年3月)有一个补丁被提议使.gitattributes
中的!pattern
非致命。
所以你需要把一个全局规则像*.txt
只在.gitattributes
文件存在的子目录中知道,你不需要CRLF。
并保留更多细粒度的text
规则在.gitattributes
中存在于混合内容的目录。
kostmo在评论中提到了EGit漏洞421364:
在实现之前,我建议这样设置:
- 对于每个Eclipse项目,转到
Properties > Resource
并将"New text file line delimiter
"更改为Other: Unix
。提交结果.settings/org.eclipse.core.runtime.prefs
文件。- 不要为Git配置任何
.gitattributes
或"core.autocrlf
"。
这意味着文件在工作目录中的行尾与存储库中的行尾相同。Git和EGit不会转换任何文件内容。1。,在Eclipse中创建的所有新文件都将具有正确的(
LF
)行尾,即使是由Windows上的用户创建的。对于已经在存储库中使用
CRLF
的文件,您可以修复它们并提交结果。我建议在命令行中使用dos2unix
或fromdos
。
注意:这个问题(bug 421364)刚刚(2014年3月25日)被Lars Vogel重新确认为bug 342372的副本。
所以,JGit对.gitattributes
的支持是"分配的",但是它的实现是
正在审核实施情况(2015年1月):
- "review 1614" 添加对
.gitattributes
的基本支持
解析和处理
.gitattributes
文件的核心类,包括支持在WorkingTreeIterator和dirCacheIterator中读取属性。
- "review 35377" 增加treewalk的git属性计算
将
getAttributes
特性添加到树遍历中。
属性的计算需要由TreeWalk
完成,因为它需要一个WorkingTreeIterator
和一个DirCacheIterator
。
2018年8月更新:上面提到的bug (bug 342372)依赖于JGit bug 537410,该bug刚刚被解决。"JGit rebase和stash不保留行结束s"
JGit commit 4027c5c (from review 127290)应该会修复这个问题。问题是
ResolveMerger
在processEntry()
期间不记得CheckoutMetadata
(JGit存储过滤器和eol属性)的文件,然后在checkout()
中检查它们,忽略任何属性或过滤器。
ResolveMerger.cleanUp()
也有同样的问题。
感谢Thomas Wolf,他是JGit的活跃贡献者。
这给了埃及希望:
一般来说,EGit将所有这些在staging/merge/checkout中的eol处理留给JGit。
EGit唯一需要关心的地方是在比较框架中,当它必须自己读取索引项时,它已经正确地处理了CheckoutMetadata
。
再次解释一下,这个。gitattributes文件是一个绝对万无一有的方法吗
。Git提供了很多便利,使日常任务变得简单,并在有问题的事情上设置了减速带,但它不会限制你对自己的repo的控制。
我想说服我的同事,.gitattributes文件是完全足够的,并且进一步排除crlf的措施(例如服务器端钩子)是不必要的。
它们是必要的。没有人能控制别人在自己的仓库里做什么。
git update-index --cacheinfo
100644,`git hash-object -w --no-filters path/to/file`,path/to/file
From git hash-object docs
——没有滤
按原样对内容进行散列,忽略属性机制选择的任何输入过滤器,包括行尾转换。如果文件是从标准输入中读取的,那么这总是隐含的,除非给出了——path选项。