是否有可能提交一个违反.gitattributes指定的行结束行为的文件?



如果将.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:

在实现之前,我建议这样设置:

  1. 对于每个Eclipse项目,转到Properties > Resource并将"New text file line delimiter"更改为Other: Unix。提交结果.settings/org.eclipse.core.runtime.prefs文件。
  2. 不要为Git配置任何.gitattributes或" core.autocrlf "。
    这意味着文件在工作目录中的行尾与存储库中的行尾相同。Git和EGit不会转换任何文件内容。

1。,在Eclipse中创建的所有新文件都将具有正确的(LF)行尾,即使是由Windows上的用户创建的。

对于已经在存储库中使用CRLF的文件,您可以修复它们并提交结果。我建议在命令行中使用dos2unixfromdos

注意:这个问题(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"

问题是ResolveMergerprocessEntry()期间不记得CheckoutMetadata (JGit存储过滤器和eol属性)的文件,然后在checkout()中检查它们,忽略任何属性或过滤器。

ResolveMerger.cleanUp()也有同样的问题。

JGit commit 4027c5c (from review 127290)应该会修复这个问题。
感谢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选项。

最新更新