git - 最好的CRLF ( Carriage Return Line Feed ) 处理策略?

  显示原文与译文双语对照的内容

我试过用CRLF-ending行提交文件,但失败了。

我花了整整一个工作日 Windows 电脑尝试不同的策略,和几乎停止试图使用git,而是尝试水银。

每个答案只能共享一个最佳实践。

时间:

问这个问题几乎 4年之后,我终于发现答案,完全满足我!

看到的细节 github:help处理线末梢指南。

国际工作组致youtoline——化学特性考试和测验科直接利用了波attribute案文 in .gitattributes 牵头机构。 这里文件被提交到存储库并覆盖 core.autocrlf 设置,使你能够确保所有用户的行为一致,而不管他们的git设置。

因此

这样做的好处是,你的行配置现在与存储库一起运行,你不需要担心协作者是否有正确的全局设置。

这里是 .gitattributes 文件的示例


# Auto detect text files and perform LF normalization
* text=auto

*.cs text diff=csharp
*.java text diff=java
*.html text diff=html
*.css text
*.js text
*.sql text

*.csproj text merge=union
*.sln text merge=union eol=crlf

*.docx diff=astextplain
*.DOCX diff=astextplain

# absolute paths are ok, as are globs
/**/postinst* text eol=lf

# paths that don't start with/are treated relative to the. gitattributes folder
relative/path/*.txt text eol=lf

现在,我建议你下载 GitHub Windows,并在其中打开一个你的库,以查看它为你的项目推荐的.gitattributes 。文件。

创建了 .gitattributes 文件后,请确保执行存储库列表的once-and-for-all re-normalization 。

最后,介意你的专栏文章的结尾提供更多背景,并解释Git如何在手边的问题上发展。 我认为这种需要阅读 。

更新

你的团队中可能有使用EGit或者 JGit ( 像 Eclipse 和TeamCity这样的工具使用它们)的用户提交他们的更改。 那么,就像 @gatinueta 在下面的回答中解释的那样,你将失去幸运:

如果你的团队里有人与Egit或者JGit合作,这个设置不会完全满足你的需求,因为这些工具只会忽略你的ignore 。gitattributes和 happily https://bugs.eclipse.org/bugs/show_bug.cgi?id=342372

一个技巧可能是让他们在另一个客户端提交他们的更改,比如 SourceTree 。 我们的团队当时喜欢使用 Eclipse的工具来支持很多用例。

谁说软件很容易? 以下:

不要把线的结局。并不是风投的工作解释数据--商店和版本。 每个现代文本编辑器都可以读取两种类型的行结束符。

应该是如果你喜欢 core.autocrlf=true dos结束或 core.autocrlf=input 如果你喜欢 unix-newlines 。 在这两种情况下,你的Git仓库只有 LF,这是正确的。 core.autocrlf=false的惟一参数是自动试探可能会自动检测一些二进制作为文本,然后你的磁贴会被破坏。 因此,引入 core.safecrlf 选项来警告用户是否发生了irreversable更改。 事实上,irreversable在文本文件中更改--混合line-ending有两种可能性,在这种规范化中是可取的,所以这个警告可以被忽略,或者( 非常不太可能) 不正确检测到你的二进制文件作为文本。 然后你需要使用属性告诉Git这个文件是二进制的。

Hat提示 http://thread.gmane.org/gmane.comp.version-control.git/79726/focus=79755

就像其他人所评论的,如果上面的内容不清楚,你几乎总是想要 autocrlf=input,除非你真的知道自己在做什么。

两个可选策略混合 env(ms + linux + mac) 得到关于line-endings一致:

A 。全局每个档案库设置

1 ) 所有转换为一种格式


find. -type f -not -path"./.git/*" -exec dos2unix {} ;
git commit -a -m 'dos2unix conversion'

2 )设置 core.autocrlfinput 女士在linux/unix或 true Windowns ( 存储库或者全局)


git config --global core.autocrlf input

3 ) [ Optional ] 将 core.safecrlf 设置为 true ( 要停止) 或者 warn ( 要唱歌:) 以添加额外的保护,如果反向的换行符转换会导致相同的文件


git config --global core.safecrlf true


或者每个存储库设置

1 ) 所有转换为一种格式


find. -type f -not -path"./.git/*" -exec dos2unix {} ;
git commit -a -m 'dos2unix conversion'

2 )回购.gitattributes 文件添加到你


echo"* text=auto">. gitattributes 
git add. gitattributes 
git commit -m 'adding. gitattributes for unified line-ending'

不要担心你的二进制文件- git应该足够聪明


关于 safecrlf/autocrlf变量的更多信息

尝试将 core.autocrlf 配置选项设置为 true 。 还可以查看 core.safecrlf 选项。

实际上,你的知识库中可能已经设置了 core.safecrlf,因为( 强调挖掘):

如果这不是核心的当前设置。autocrlf,git将拒绝该文件。

如果是这样,那么你可能需要检查你的文本编辑器是否配置为使用一致的行尾。 如果文本文件包含了LF和CRLF行结尾的混合,则可能会遇到问题。

最后,我觉得简单的"使用所给内容"和使用 Windows 终止行的建议会导致更多问题。 Git有上面的选项来尝试以合理的方式处理行尾,所以使用它们是有意义的。

核心。autocrlf=false阻止所有的文件被标记为尽快更新我在vs2010检查出来的项目。 其他 2dev团队的成员也使用 Windows 系统混合环境没有发挥作用,但默认设置,与回购标志着所有文件更新后立即克隆。

猜测底线是找出CRLF设置对你的环境是什么作用。 特别是在我们的Linux盒的其他许多仓库中设置 autocrlf = 真会产生更好的结果。

20+年后,我们仍然在处理操作系统之间的行结束差异。。 sad 。

这只是一个工作区解决方案:

在普通情况下,使用git附带的解决方案。 大多数情况下这些工作都很好。 如果你通过在 Windows 和Unix系统上共享 。gitattributes 来共享的开发。

在我的例子中,> 10程序员在 Windows 开发一个项目。 这个项目是检入和crlf力量如果没有选项。

一些设置在我的机器内部写了,没有任何对LF格式的影响,因此一些文件在每个小文件更改时都被全局改变为 LF 。

我的解决方案:

Windows-Machines:,让所有的东西都 as 。 不要担心,因为你是默认的Windows'孤狼'开发人员,你必须这样处理: "世界上没有其他系统,是"?

Unix-Machines

  1. 添加以下行( 这里命令列表列出所有已经更改的换句话说,修改/新文件) [alias] 配置的部分:

    "f ( ) ) = { git状态 --porcelain | egrep R"^ ( | ) 。* ( 。[a-zA-Z] ) *"| 剪切 -c 4 - ;TimeoutException"? !

  2. 所有这些改变了文件转化为dos格式:

    unix2dos $(git lc )

  3. 可选。。

    a ) 为这个操作创建一个 git 钩子来自动执行这个过程

    使用参数并包含它并修改grep函数,以便只匹配特定文件名 e.g.:

    - | egrep R"^ ( | ) 。* 。( txt|conf )"| 。。

    你可以使用一个额外的快捷键,让它更加方便:

    c2dos ="f ( ) ) { unix2dos $(git lc ) ;};" !

    。然后通过键入来激发已经转换的内容

    git c2dos

...