git diff显示完整文件已更改,仅更改了一行,但仅目录中的几个文件已更改

Deb*_*der 4 git github bitbucket

我在GIT中遇到了一个奇怪的问题。最近,我们的代码库已从SVN迁移到GIT。因此,当我在本地上克隆存储库并且在文件中进行单行更改时,git diff显示整个文件已更改(首先删除了所有内容,然后再次添加了所有内容)。但是奇怪的是,并不是所有文件都发生了。

例如,我已经改变(如行后添加一个空格)本人app.jsindex.htmlgruntfile.js在那里它显示了正确的路线DIFF app.js和完整的文件变化index.htmlgruntfile.js

我已经引用了许多stackoverflow文章,并设置core.autocrlftruefalse,但是所有设置都不起作用。

另一个奇怪的事情是我也无法重置该文件。假设在上面的示例中,如果执行git reset --hard,则不会从本地删除/还原有缺陷的文件,此处app.js已还原,但其他两个未还原。最后,我不得不使用git checkout .还原所有文件。

更新:这是我的.gitattribute文件内容,位于根目录中。 * text=auto

这是我在根目录下的.editorconfig文件。

root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.md]
trim_trailing_whitespace = false
Run Code Online (Sandbox Code Playgroud)

Ras*_*vee 6

这是 GitLab 的预期行为,在这种情况下没有任何问题。请参阅问题(https://gitlab.com/gitlab-org/gitlab-foss/-/issues/52936)。我们可以使用 GitLab UI 跳过压缩中的那些空白更改。隐藏/忽略空白更改的步骤。

  1. 转到您的合并请求。
  2. 导航以在部分之间进行更改。
  3. 单击“在部分之间更改”右侧的设置按钮
  4. 取消选中“显示空白更改”选项

执行此操作后,比较部分将仅显示真正的更改。以下是您参考的屏幕截图。

在此输入图像描述


小智 5

这听起来像CRLF vs LF行尾对我来说是个问题。

我相信SVN和GIT都将文本文件存储在带有LF行尾的存储库中,并且当从工作副本中检入和检出存储库中的文件时,它们都在LF和CRLF行尾之间进行转换。

不幸的是,SVN和GIT具有不同的方式来确定哪些文件是文本文件,因此它们并不总是就是否需要行尾转换达成共识。

GIT非常擅长猜测,但是允许使用属性进行控制-运行“ git help属性”以获得解释。

SVN在单个文件上使用svn属性,这些属性要么必须手动设置,要么通过已配置的自动道具规则设置。

我猜想这些文件最初是在Windows上提交给SVN的,您正在Windows上运行GIT的,并且您是使用“ git svn”创建了GIT存储库的。

如果是这样,那么我最好的猜测是您的SVN储存库未设置svn属性,因此SVN将具有CRLF行尾的文件存储在SVN储存库中,而没有进行转换。然后,如果您使用“ git svn”将SVN储存库导入到新的GIT储存库中,则GIT储存库还将包含CRLF行尾。这不是GIT存储库中文本文件的预期格式,因此可能会导致问题。特别是,我认为“ git diff”将存储库中已有的内容(具有CRLF行结尾)与将提交给存储库的内容(具有LF行结尾)进行比较,发现每一行都是不同的。

了解发生了什么的一种方法是将存储库克隆到具有core.autocrlf = false(或未设置)的Linux计算机上。在这种情况下,不会有任何CRLF行尾转换引起混淆,您可以看到检出文件中的行尾是什么。我的猜测是,由于GLF存储库中存储的CRLF行尾,它们将具有CRLF行尾。

如果我的假设正确,那么我认为您有两种选择:

(1)修复GIT存储库,使其包含LF而不是CRLF行尾。在Windows上(使用core.autocrlf = true),我认为您可以通过触摸每个文件(不进行任何更改),然后提交GIT报告为已更改的所有文件来执行此操作。在Linux上(使用core.autocrlf = false),我认为您可以通过在所有文本文件上运行dos2unix然后提交来实现。

(2)将所有文件都视为二进制文件而不是文本文件,以使GIT根本不尝试行尾转换。我认为您可以通过提交包含“ * -text”(不带引号)的.gitattributes文件来实现。这样做的缺点是在Linux上签出时会得到CRLF行尾。


Man*_*era 5

执行以下命令

cd repo<Project>
git config --global core.autocrlf true
Run Code Online (Sandbox Code Playgroud)

  • 虽然这可能会回答作者的问题,但它缺少一些解释性词语和文档链接。如果没有一些短语,原始代码片段不是很有帮助。请编辑您的答案。 (3认同)