如何让Git真正忽略行尾?

29
我该如何告诉Git真正不关心行结尾?保留原来的LF或CRLF,并以相同的方式检查它们?
我正在使用带有git-tf的Git存储库,以将其检入TFS存储库。 我的团队其余成员仅使用TFS。
鉴于这种情况,有时他们会在不知情的情况下更改行结尾。 例如,最近一个第三方工具规范化了其行结尾和其他更改。 我们的存储库已更新这些更改,现在由于不同的行结尾,文件在我的目录中显示为具有更改。
我真正想要的是,在这个特定的存储库中,让Git假装行结尾更改不存在。 如果它是LF,请将其保留为LF。 如果它是CRLF,请将其保留为CRLF。
我需要哪些设置或组合设置才能实现这一点?

你找到解决方法了吗?已经快一年了,我还是处于同样的困境。我正在使用git并使用git-tf进行工作流程。我偶尔提交到TFS(git tfs rcheckin)。这会破坏TFS中的行尾(转换为LF)。 - Chetan
1个回答

25

供日后参考:最稳定的实现方法是使用一个被提交到git仓库根目录下的.gitattributes文件。

该文件应包含以下内容:

# no eol conversions!
* -text

这意味着以下内容:

  • [*]:这是一个文件过滤器,匹配任何文件
  • [-text]:在签入和签出时不尝试进行任何行末转换

注意:“text = auto”表示:对已检出的文件(看起来像文本)使用本机行末格式,并在内部将其存储为“LF”。

这很强大,因为克隆存储库的每个人都将使用相同的设置。(使用core.autocrlf时情况并非如此。)

另请参阅Git gitattributes 文档 (effects: text)。


4
哇塞!为什么TFS默认没有这个功能!非常感谢你。 - regisbsb
这对我不起作用(在macOS上的SourceTree GUI)。我尝试匹配任何.c文件并使Git忽略行尾。在.gitattributes文件中检查了*.c -text**/*.c -text,两者都不起作用。在我更改.c文件中的行尾后,Git仍然会选择它。还尝试了一个新的存储库检出。有什么想法吗? - Paco1
1
@Paco1 所描述的更改告诉 Git 不要操作行尾。Git 保留提交时的行尾。因此,它不会产生您期望的效果。 - rvdginste
哦,我明白了。我以为我的问题和 OP 的问题很相似,只是方向相反(存储库中的行尾符与本地不同)。 - Paco1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接