我尝试使用以crlf结尾的行提交文件,但失败了。

我花了一整天的时间在我的Windows电脑上尝试不同的策略,几乎要停止尝试使用Git,而是尝试使用Mercurial。

如何正确处理CRLF行结束符?


当前回答

在混合环境(微软+ Linux + Mac)中获得一致的行结束符的两种替代策略:

A.全局所有存储库设置

将所有转换为一种格式 找到。-type f -not -path "./。Git /*" -exec dos2unix {} \; Git commit -m 'dos2unix转换' 设置的核心。在Linux/UNIX上为输入,在MS Windows上为true(存储库或全局) Git配置——全局核心。autocrlf输入 可选地,设置核心。将Safecrlf设置为true(停止)或warn(歌唱:),以添加额外的保护,比较反向换行转换是否会产生相同的文件 Git配置——全局核心。safecrlf真实

B.或根据存储库设置

将所有转换为一种格式 找到。-type f -not -path "./。Git /*" -exec dos2unix {} \; Git commit -m 'dos2unix转换' 向存储库添加一个.gitattributes文件 Echo "* text=auto" > .gitattributes Git添加.gitattributes Git提交-m '为统一的行结束添加。Git属性'

不要担心二进制文件——git应该对它们足够聪明。


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

其他回答

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

这只是一个变通的解决方案:

在正常情况下,使用git附带的解决方案。这些在大多数情况下都很有效。如果您通过设置.gitattributes在Windows和Unix系统上共享开发,则强制到LF。

以我为例,有10个程序员在Windows上开发一个项目。该项目与CRLF进行了核对,没有强制到LF的选项。

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

我的解决方案:

windows机器: 让一切顺其自然吧。什么都不关心,因为你是一个默认的windows“独狼”开发人员,你必须处理这样的问题:“在这个广阔的世界上没有其他系统了,是吗?”

unix机器上

Add following lines to a config's [alias] section. This command lists all changed (i.e. modified/new) files: lc = "!f() { git status --porcelain \ | egrep -r \"^(\?| ).\*\\(.[a-zA-Z])*\" \ | cut -c 4- ; }; f " Convert all those changed files into dos format: unix2dos $(git lc) Optionally ... Create a git hook for this action to automate this process Use params and include it and modify the grep function to match only particular filenames, e.g.: ... | egrep -r "^(\?| ).*\.(txt|conf)" | ... Feel free to make it even more convenient by using an additional shortcut: c2dos = "!f() { unix2dos $(git lc) ; }; f " ... and fire the converted stuff by typing git c2dos

在混合环境(微软+ Linux + Mac)中获得一致的行结束符的两种替代策略:

A.全局所有存储库设置

将所有转换为一种格式 找到。-type f -not -path "./。Git /*" -exec dos2unix {} \; Git commit -m 'dos2unix转换' 设置的核心。在Linux/UNIX上为输入,在MS Windows上为true(存储库或全局) Git配置——全局核心。autocrlf输入 可选地,设置核心。将Safecrlf设置为true(停止)或warn(歌唱:),以添加额外的保护,比较反向换行转换是否会产生相同的文件 Git配置——全局核心。safecrlf真实

B.或根据存储库设置

将所有转换为一种格式 找到。-type f -not -path "./。Git /*" -exec dos2unix {} \; Git commit -m 'dos2unix转换' 向存储库添加一个.gitattributes文件 Echo "* text=auto" > .gitattributes Git添加.gitattributes Git提交-m '为统一的行结束添加。Git属性'

不要担心二进制文件——git应该对它们足够聪明。


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

试着设定核心。自专制配置选项为true。还要看看核心。safecrlf选项。

实际上它听起来像核心。Safecrlf可能已经在你的存储库中设置了,因为(强调我的):

如果这不是当前设置的核心的情况。专制者,git将拒绝文件。

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

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

使用核心。当我在Visual Studio 2010项目中检出文件时,selflf =false会阻止所有文件被标记为更新。开发团队的另外两名成员也使用Windows系统,因此混合环境没有发挥作用,但存储库附带的默认设置总是将所有文件标记为克隆后立即更新。

我认为最重要的是找到适合您的环境的CRLF设置。特别是在我们的Linux盒子上的许多其他存储库中,设置selff = true会产生更好的结果。

20多年后,我们仍然在处理操作系统之间的行尾差异……伤心。