什么';Git的最佳CRLF(回车、换行)处理策略是什么?

什么';Git的最佳CRLF(回车、换行)处理策略是什么?,git,cross-platform,newline,eol,Git,Cross Platform,Newline,Eol,我尝试提交带有CRLF结尾行的文件,但失败了 我花了整整一天的时间在我的Windows电脑上尝试不同的策略,几乎被吸引住不再尝试使用Git,而是尝试 每个答案只能分享一个最佳实践。不要转换行尾。解释数据不是VCS的工作——只是存储和版本化数据。每个现代文本编辑器都可以同时读取两种行尾。尝试将core.autocrlf配置选项设置为true。还可以查看core.safecrlf选项 实际上,它听起来像是core.safecrlf可能已经在您的存储库中设置好了,因为(强调我的): 如果当前设置cor

我尝试提交带有CRLF结尾行的文件,但失败了

我花了整整一天的时间在我的Windows电脑上尝试不同的策略,几乎被吸引住不再尝试使用Git,而是尝试


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

不要转换行尾。解释数据不是VCS的工作——只是存储和版本化数据。每个现代文本编辑器都可以同时读取两种行尾。

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

实际上,它听起来像是
core.safecrlf
可能已经在您的存储库中设置好了,因为(强调我的):

如果当前设置core.autocrlf不是这种情况,git将拒绝该文件

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


最后,我觉得简单地“使用你得到的”和在Windows上使用LF终止的行的建议将导致比它解决的问题更多的问题。Git有上面的选项来尝试以合理的方式处理行结束符,因此使用它们是有意义的。

除非您真的知道自己在做什么,否则您几乎总是想要
autocrlf=input

以下是一些附加上下文:

如果愿意,它应该是
core.autocrlf=true
DOS结束或
core.autocrlf=input
如果您愿意 unix新行。在这两种情况下,您的Git存储库都将 只有LF是正确的。唯一的
core.autocrlf=false的参数是自动的吗
启发式可能会错误地将某些二进制文件检测为文本
然后你的磁贴就会损坏。所以
core.safecrlf
选项用于在以下情况下警告用户 发生了不可逆转的变化。事实上,有两种 不可逆变化的可能性——混合 以文本文件结尾的行,在此规范化中为 可取,因此可以忽略此警告,或 (不太可能)Git错误地检测到您的 作为文本的二进制文件。然后您需要使用属性来 告诉Git这个文件是二进制文件


上面的段落最初是从gmane.org上的一个线程中提取出来的,但后来就消失了。

使用
core.autocrlf=false
在我的项目中签出所有文件后,立即停止所有文件被标记为更新。开发团队的另外两名成员也在使用Windows系统,因此没有使用混合环境,但存储库附带的默认设置总是将所有文件标记为克隆后立即更新

我想底线是找到什么CRLF设置适合您的环境。特别是在我们Linux机器上的许多其他存储库中,设置
autocrlf=true
会产生更好的结果


20多年后,我们仍然在处理操作系统之间的线端差异。。。悲哀。

在问了这个问题差不多四年之后,我终于 找到了一个让我完全满意的答案

有关详细信息,请参见github:help的指南

Git允许您设置 回购协议直接使用
.gittattributes
文件。此文件已提交到 回购和覆盖
core.autocrlf
设置, 允许您确保所有人的行为一致 用户,无论其git设置如何

因此

这样做的好处是,您的产品线结束了 配置现在随存储库和您一起移动 不需要担心是否有合作者 具有正确的全局设置

下面是一个
.gittributes
文件的示例

#自动检测文本文件并执行LF规范化
*文本=自动
*.cs文本差异=csharp
*.java text diff=java
*.html text diff=html
*.css文本
*.js文本
*.sql文本
*.csproj文本合并=联合
*.sln文本合并=联合下线=crlf
*.docx diff=astextplane
*.DOCX diff=astextplane
#绝对路径和全局路径都正常
/**/postinst*文字下线=lf
#不以/开头的路径相对于.gittributes文件夹进行处理
相对/path/*.txt文本下线=lf
对于最流行的编程语言有一个方便的解决方案。让你开始是很有用的

一旦您创建或调整了
.gittributes
,您就应该一次性执行一次

请注意,在应用程序中打开项目的Git repo后,应用程序可以建议并创建一个
.gittributes
文件。要尝试此操作,请单击齿轮图标(在右上角)>存储库设置…>行尾和属性。系统将要求您添加推荐的
.gittributes
,如果您同意,应用程序还将对存储库中的所有文件执行标准化

最后,文章 提供更多背景信息并解释Git是如何发展的 在手头的事情上。我认为这是必要的读数。

您的团队中可能有使用EGit或JGit(Eclipse和TeamCity等工具使用它们)提交更改的用户。那么你就不走运了,@gatinueta在这个答案的评论中解释道:


如果团队中有人使用Egit或JGit,则此设置不会完全满足您的要求,因为这些工具只会忽略.gittributes并愉快地签入CRLF文件

比如,一个技巧可能是让他们在另一个客户机中提交更改。当时我们的团队在许多用例中更喜欢该工具而不是Eclipse的EGit


谁说软件很容易-/

获得合作的两种备选策略
find . -type f -not -path "./.git/*" -exec dos2unix {} \;
git commit -a -m 'dos2unix conversion'
git config --global core.autocrlf input
git config --global core.safecrlf true
find . -type f -not -path "./.git/*" -exec dos2unix {} \;
git commit -a -m 'dos2unix conversion'
echo "* text=auto" > .gitattributes
git add .gitattributes
git commit -m 'adding .gitattributes for unified line-ending'
*   text=auto
Hello\r\nWorld
Hello\nWorld
Hello\r\nWorld
Hello\nWorld
*.java          text !eol # Don't do auto-detection. Treat as text (don't set any eol rule. use client's)
*.jpg           -text     # Don't do auto-detection. Treat as binary
*.sh            text eol=lf # Don't do auto-detection. Treat as text. Checkout and add with eol=lf
*.bat           text eol=crlf # Treat as text. Checkout and add with eol=crlf
git config core.autocrlf
git config --global core.autocrlf
git config --system core.autocrlf
git config --local core.autocrlf
git config --show-origin core.autocrlf
# Always checkout with LF
*.sh            text eol=lf
# Always checkout with CRLF
*.bat           text eol=crlf