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