git diff 显示完整文件已针对单行更改进行了更改,但仅针对目录中的少数文件
git diff is showing full file has changed for a single line change but only for few files in a directory
我在GIT中遇到了一个奇怪的问题。最近我们的代码库已经从 SVN 迁移到 GIT。因此,当我在本地克隆存储库并在文件中进行单行更改时,git diff 显示完整文件已更改(首先删除所有内容,然后再次添加所有内容)。但奇怪的是,并不是所有文件都这样。
例如我更改了(例如在一行后添加了 space)我的 app.js
、index.html
和 gruntfile.js
,它显示 app.js
的正确行差异和完整文件更改对于 index.html
和 gruntfile.js
我参考了许多 Whosebug 文章并将 core.autocrlf
设置为 true
和 false
两者,但设置的 none 有效。
另一件奇怪的事情是我也无法重置该文件。假设在上面的示例中,如果我执行 git reset --hard
,它不会 remove/revert 来自我本地的缺陷文件,这里 app.js
已被还原,但其他两个没有还原。最后我不得不使用 git checkout .
来还原所有文件。
更新:这是我在根目录下的.git属性文件内容。
* 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
对我来说,这听起来像是 CRLF 与 LF 行结尾的问题。
我相信 SVN 和 GIT 都将文本文件存储在它们的存储库中,并使用 LF 行结尾,并且在从工作副本中将文件签入和签出存储库时,它们都在 LF 和 CRLF 行结尾之间进行转换.
不幸的是,SVN 和 GIT 决定哪些文件是文本文件的方式不同,因此他们并不总是同意是否需要行结束转换。
GIT 非常擅长猜测,但允许使用属性进行控制 - 运行 "git help attributes" 以获得解释。
SVN 在单个文件上使用 svn 属性,这些属性要么必须手动设置,要么通过配置的自动道具规则设置。
我猜测这些文件最初是在 Windows 上提交给 SVN 的,而您在 Windows 上 运行ning GIT,并且您创建了GIT 存储库使用 "git svn".
如果是这样,那么我最好的猜测是您的 SVN 存储库没有设置 svn 属性,因此 SVN 在 SVN 存储库中存储了带有 CRLF 行结尾的文件而没有进行转换。如果您随后使用 "git svn" 将 SVN 存储库导入到新的 GIT 存储库中,那么 GIT 存储库还将包含 CRLF 行结尾。这不是 GIT 存储库中文本文件的预期格式,因此可能会导致问题。特别是,我认为 "git diff" 将存储库中已有的内容(使用 CRLF 行结尾)与将提交给存储库的内容(使用 LF 行结尾)进行比较,发现每一行都是不同的。
了解正在发生的事情的一种方法是将存储库克隆到 Linux 机器 core.autocrlf = false(或未设置)。在这种情况下,不会有任何 CRLF 行结束转换来混淆这件事,您可以看到检出文件中的行结束是什么。我猜他们会有 CRLF 行结尾,因为 CRLF 行结尾存储在 GIT 存储库中。
如果我的假设是正确的,那么我认为您有 2 个选择:
(1) 修复 GIT 存储库以包含 LF 而不是 CRLF 行尾。
在 Windows(core.autocrlf=true)我认为你可以通过触摸每个文件(不做任何更改)来做到这一点,然后提交所有 GIT 报告为已更改的文件。
在 Linux 上(使用 core.autocrlf=false)我认为你可以通过 运行ning dos2unix 对所有文本文件然后提交它们来做到这一点。
(2) 将所有文件视为二进制而不是文本,这样 GIT 根本不会尝试行结束转换。我认为您可以通过提交包含“* -text”(不带引号)的 .gitattributes 文件来做到这一点。这样做的缺点是在 Linux.
上签出时会得到 CRLF 行结尾
执行以下命令
cd repo<Project>
git config --global core.autocrlf true
这是 GitLab 的预期行为,在这种情况下没有任何问题。查看问题(https://gitlab.com/gitlab-org/gitlab-foss/-/issues/52936)。
我们可以跳过使用 GitLab UI 压缩产生的白色 space 更改。
步骤 hide/ignore 白色 space 更改。
- 转到您的合并请求。
- 导航以在部分之间切换。
- 点击设置按钮,从右侧的“部分之间切换”
- 取消选中选项“显示白色space 更改”
执行此操作后,比较部分将仅显示实际更改。以下是您参考的截图。
我在GIT中遇到了一个奇怪的问题。最近我们的代码库已经从 SVN 迁移到 GIT。因此,当我在本地克隆存储库并在文件中进行单行更改时,git diff 显示完整文件已更改(首先删除所有内容,然后再次添加所有内容)。但奇怪的是,并不是所有文件都这样。
例如我更改了(例如在一行后添加了 space)我的 app.js
、index.html
和 gruntfile.js
,它显示 app.js
的正确行差异和完整文件更改对于 index.html
和 gruntfile.js
我参考了许多 Whosebug 文章并将 core.autocrlf
设置为 true
和 false
两者,但设置的 none 有效。
另一件奇怪的事情是我也无法重置该文件。假设在上面的示例中,如果我执行 git reset --hard
,它不会 remove/revert 来自我本地的缺陷文件,这里 app.js
已被还原,但其他两个没有还原。最后我不得不使用 git checkout .
来还原所有文件。
更新:这是我在根目录下的.git属性文件内容。
* 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
对我来说,这听起来像是 CRLF 与 LF 行结尾的问题。
我相信 SVN 和 GIT 都将文本文件存储在它们的存储库中,并使用 LF 行结尾,并且在从工作副本中将文件签入和签出存储库时,它们都在 LF 和 CRLF 行结尾之间进行转换.
不幸的是,SVN 和 GIT 决定哪些文件是文本文件的方式不同,因此他们并不总是同意是否需要行结束转换。
GIT 非常擅长猜测,但允许使用属性进行控制 - 运行 "git help attributes" 以获得解释。
SVN 在单个文件上使用 svn 属性,这些属性要么必须手动设置,要么通过配置的自动道具规则设置。
我猜测这些文件最初是在 Windows 上提交给 SVN 的,而您在 Windows 上 运行ning GIT,并且您创建了GIT 存储库使用 "git svn".
如果是这样,那么我最好的猜测是您的 SVN 存储库没有设置 svn 属性,因此 SVN 在 SVN 存储库中存储了带有 CRLF 行结尾的文件而没有进行转换。如果您随后使用 "git svn" 将 SVN 存储库导入到新的 GIT 存储库中,那么 GIT 存储库还将包含 CRLF 行结尾。这不是 GIT 存储库中文本文件的预期格式,因此可能会导致问题。特别是,我认为 "git diff" 将存储库中已有的内容(使用 CRLF 行结尾)与将提交给存储库的内容(使用 LF 行结尾)进行比较,发现每一行都是不同的。
了解正在发生的事情的一种方法是将存储库克隆到 Linux 机器 core.autocrlf = false(或未设置)。在这种情况下,不会有任何 CRLF 行结束转换来混淆这件事,您可以看到检出文件中的行结束是什么。我猜他们会有 CRLF 行结尾,因为 CRLF 行结尾存储在 GIT 存储库中。
如果我的假设是正确的,那么我认为您有 2 个选择:
(1) 修复 GIT 存储库以包含 LF 而不是 CRLF 行尾。 在 Windows(core.autocrlf=true)我认为你可以通过触摸每个文件(不做任何更改)来做到这一点,然后提交所有 GIT 报告为已更改的文件。 在 Linux 上(使用 core.autocrlf=false)我认为你可以通过 运行ning dos2unix 对所有文本文件然后提交它们来做到这一点。
(2) 将所有文件视为二进制而不是文本,这样 GIT 根本不会尝试行结束转换。我认为您可以通过提交包含“* -text”(不带引号)的 .gitattributes 文件来做到这一点。这样做的缺点是在 Linux.
上签出时会得到 CRLF 行结尾执行以下命令
cd repo<Project>
git config --global core.autocrlf true
这是 GitLab 的预期行为,在这种情况下没有任何问题。查看问题(https://gitlab.com/gitlab-org/gitlab-foss/-/issues/52936)。 我们可以跳过使用 GitLab UI 压缩产生的白色 space 更改。 步骤 hide/ignore 白色 space 更改。
- 转到您的合并请求。
- 导航以在部分之间切换。
- 点击设置按钮,从右侧的“部分之间切换”
- 取消选中选项“显示白色space 更改”
执行此操作后,比较部分将仅显示实际更改。以下是您参考的截图。