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

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

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


当前回答

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

详见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。

谁说软件很简单?: - /

其他回答

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

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

详见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

除非你真的知道你在做什么,否则你几乎总是需要selff =input。

下面是一些附加的上下文:

It should be either core.autocrlf=true if you like DOS ending or core.autocrlf=input if you prefer unix-newlines. In both cases, your Git repository will have only LF, which is the Right Thing. The only argument for core.autocrlf=false was that automatic heuristic may incorrectly detect some binary as text and then your tile will be corrupted. So, core.safecrlf option was introduced to warn a user if a irreversable change happens. In fact, there are two possibilities of irreversable changes -- mixed line-ending in text file, in this normalization is desirable, so this warning can be ignored, or (very unlikely) that Git incorrectly detected your binary file as text. Then you need to use attributes to tell Git that this file is binary.

上面这段话最初是从gmane.org上的一个帖子中截取的,但现在已经删除了。

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

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

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

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

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