为什么还要关心git中的换行转换?为什么不一路二进制?

时间:2013-11-04 15:00:48

标签: git newline

简短问题:

我可以通过使用.gitattributes并将有问题的文件设置为二进制来解决我的各种Git行结束跨平台转换问题吗?我无法控制回购或用户设置。

另外:对于面向Web的Windows开发,CRLF仍然需要吗?大多数工具都有自动检测或切换模式的选项,并且似乎只适用于LF。

(删除咆哮)

注意:我已经在SO上阅读了很多(全部?)答案,请阅读help,阅读book并在此处花费太多时间。

更新:

我不是在看this help file而是在.gitattributes中提到取消设置text

  

取消设置

     

取消设置路径上的text属性会告诉git在签入或结帐时不要尝试任何行尾转换。

为什么“help.github.com”和“git-scm.com”都没有提到这个可能的解决方案超出了我的范围,但描述看起来不错。

但github的帮助确实提到它粗略,这就是为什么我认为这就是我想要的。

  

二进制设置是-text -diff

的别名

我打算尝试一下,如果有问题就更新。

更新2:

有效!在.gitattributes中使用*.txt -text可以解决问题:没有转换但仍然是diffable和line / char摘要等)

4 个答案:

答案 0 :(得分:1)

您可以配置git以在添加内容时将CRLF转换为LF,而不是相反:

git config --global core.autocrlf input

git-config(1)

的相关文档
  

<强> core.autocrlf
  将此变量设置为“true”几乎与在所有文件上将text属性设置为“auto”几乎相同,只是不保证文本文件的规范化:不会触及存储库中包含CRLF的文件。如果要在工作目录中具有CRLF行结尾,请使用此设置,即使存储库没有标准化的行结尾。 此变量可以设置为输入,在这种情况下不执行输出转换。

或者在这个SO答案中进行更深入的解释:git replacing LF with CRLF

答案 1 :(得分:1)

我认为,如果你把所有内容都变为二进制,那么你提交的内容将不再是行差异,这会阻止git diffgit log --stat或者像工作那样。您最好的选择是确保所有文件都保存为LF,使用core.autocrlf输入强制所有文件转换为LF,或者只是尝试使用不同的VCS,如果它给您带来了很多麻烦。

答案 2 :(得分:0)

你可以尝试一下,看看它是如何起作用的:

git config core.autocrlf false          # no automatic eol munging
git config core.whitespace cr-at-eof    # diff ignores trailing CR
git config branch.<name>.mergeoptions -Xignore-space-at-eol

并且最好避免text中的显式.gitattributes属性(这会在结帐时强制执行eol转换,但转换后的版本不会无偿地重新检入)。

See the merge doc for the effects of that branch config,(加the config docs),它对我来说似乎很有效。或者只在遇到麻烦时手动指定它。

如果你有其他工具无法处理混合或外来的eols,你仍然需要解决它们的限制,可能是在他们需要的文件上加上明确的eol属性。我自己将其作为一个每回购的东西,这是一个本地问题,如果工具得到修复就会消失。

答案 3 :(得分:0)

我在我的问题中更新了:在-text中使用.gitattributes来使git将文件作为文本进行操作,但不进行任何行转换。它仍将显示差异(以及相关的更改摘要):

*.txt    -text