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

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

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


当前回答

这是Windows和Visual Studio用户与Mac或Linux用户共享代码的两个选项。要了解更详细的解释,请阅读gitattributes手册。

* text = auto

在你的repo .gitattributes文件中添加:

*   text=auto

这将正常化所有的文件与LF行结束在回购。

取决于您的操作系统(核心。eol设置),工作树中的文件将被标准化为基于Unix系统的LF或基于Windows系统的CRLF。

这是Microsoft . net回购所使用的配置。

例子:

Hello\r\nWorld

将在回购中始终归一化为:

Hello\nWorld

签出时,Windows中的工作树将被转换为:

Hello\r\nWorld

签出时,Mac中的工作树将保留为:

Hello\nWorld

注意:如果您的repo已经包含了未规范化的文件,那么当您下次对这些文件进行任何更改时,git状态将显示这些文件已完全修改,这可能会让其他用户稍后合并他们的更改。有关详细信息,请参见更改行结束符后刷新存储库。

核心。独裁者= true

如果文本在. Git attributes文件中未指定,Git使用核心。selflf配置变量,以确定是否应该转换文件。

对于Windows用户,git配置——global core。专制是一个很好的选择,因为:

文件只有在添加到repo时才被归一化为LF行结束符。如果在repo中有未规范化的文件,此设置将不会触及它们。 所有文本文件都转换为工作目录中的CRLF行结束符。

这种方法的问题在于:

If you are a Windows user with autocrlf = input, you will see a bunch of files with LF line endings. Not a hazard for the rest of the team, because your commits will still be normalized with LF line endings. If you are a Windows user with core.autocrlf = false, you will see a bunch of files with LF line endings and you may introduce files with CRLF line endings into the repo. Most Mac users use autocrlf = input and may get files with CRLF file endings, probably from Windows users with core.autocrlf = false.

其他回答

在提出这个问题近四年后,我终于 找到了一个让我完全满意的答案!

详见github:帮助指南 处理行结束。

的行结束属性 对象中的文本属性直接回购 .gitattributes文件。该文件被提交 回购和覆盖核心。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

对于最流行的编程语言,有一个方便的.gitattributes文件集合。这对你的入门很有用。

一旦创建或调整了.gitattributes,就应该执行一劳永逸的行尾重新规范化。

请注意,在应用程序中打开项目的Git repo后,GitHub桌面应用程序可以建议并创建一个.gitattributes文件。要尝试这一点,请单击齿轮图标(在右上角)> Repository settings…>行结束符和属性。你会被要求添加推荐的.gitattributes,如果你同意,应用程序也会对存储库中的所有文件进行规范化。

最后一篇文章是《注意你的底线》 提供了更多的背景知识,并解释了Git是如何发展的 手头的事情。我认为这是必读的。

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

如果您的团队中有人使用Egit或JGit,则此设置将不能完全满足您的要求,因为这些工具将忽略.git属性并愉快地检入CRLF文件https://bugs.eclipse.org/bugs/show_bug.cgi?id=342372

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

谁说软件很简单?: - /

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

在正常情况下,使用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

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

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

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

在混合环境(微软+ 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有上述选项来尝试以合理的方式处理行结束符,因此使用它们是有意义的。