【问题标题】:Git CRLF changes showing up in git statusGit CRLF 更改显示在 git status 中
【发布时间】:2014-06-11 20:37:31
【问题描述】:

我知道有很多类似的问题/答案,但是我找不到这个问题的具体答案。我们是一家 .net 商店,正在使用 git。

我想要一种在执行 git 状态时忽略对文件的 CRLF (^M) 更改的方法。在开发过程中,其他进程偶尔会修改文件并注入 CRLF,最终导致它们在 git 状态完成时显示为已修改。我的 .gitattributes 文件中有“* text=auto”行,以便在结帐/提交时标准化行尾,但这不是我想要的。我还尝试将以下内容添加到 git config (core.whitespace=cr-at-eol) 但它们仍然显示为已修改。

如何告诉 git 忽略对 CRLF (^M) 的所有更改?

【问题讨论】:

  • 那些偶尔修改文件的进程除了注入随机CRs之外,难道不做任何事情吗?

标签: git


【解决方案1】:

您不能忽略 git status 的文件更改类型。您可以使用 .gitignore 忽略整个文件。您可以使用各种空白选项来转换提交的内容、突出显示的内容(红色)或在差异和提交视图中完全显示的内容。

您不能忽略这些文件更改的原因是:

  • 跟踪文件更改是版本控制的重点。
  • Git 使用内容的SHA1 哈希表示文件内容独立于路径。您的 ^M 会影响该 SHA1,因此它不可避免地很重要。

简而言之,您可能需要修复其他流程或开发清理后流程。或者,您可以使用:

git diff-files --name-status --ignore-space-at-eol

这不是 status 的完美模拟,但它可能足以满足您的需求。为方便起见,您甚至可以通过添加到您的 .gitconfig 中来构建 git-alias'd "statusx" 命令:

[alias]
    statusx = diff-files --name-status --ignore-space-at-eol

如果证明不够用,还有一些额外的空格选项:--ignore-space-change--ignore-all-space。详情请见git diff --help

【讨论】:

  • 嗨乔,我有一种感觉,我所要求的是不可能的。感谢您提供澄清和一些替代方案。事实上,我们刚刚发现这些 ^M 变化的来源是 nuget,所以我将从这个角度工作。再次感谢。 pampanotes.tercerplaneta.com/2012/07/…
【解决方案2】:

您可以尝试测试.gitattributes 文件中的-crlf 属性:

*.cs -crlf

.gitattributes man page 也提到了-text,但这会使您的源文件成为二进制文件(无差异)。

否则,core.eol are directives 用于控制 eol 样式。
更精确的是than core.autocrlf,也就是presented here

【讨论】:

  • 感谢您的回复!据我了解, .gitattributes 文件仅在提交时修改(规范化)文件。我正在寻找在执行 git 状态时会忽略 ^M 对文件的更改的东西。我也玩过 core.eol 和 core.autocrlf 设置,但我再次认为这不是我正在寻找的解决方案。也许我在要求 git 做一些不可能的事情? Git 状态显示索引和当前 HEAD 之间的差异。我想要一种方法让 git 只忽略涉及 ^M 的更改,并且在执行 git 状态时不显示这些更改。
  • @user3731545 -crlf 属性应该在 git status 期间忽略 eol。
猜你喜欢
  • 2013-01-11
  • 1970-01-01
  • 2015-11-02
  • 2019-04-14
  • 2013-04-01
  • 2013-08-27
  • 2012-06-15
  • 2011-01-02
相关资源
最近更新 更多