【问题标题】:How to configure git / PhpStorm to ignore CRLF changes (if file content is identical)如何配置 git / PhpStorm 以忽略 CRLF 更改(如果文件内容相同)
【发布时间】:2022-10-13 01:47:49
【问题描述】:

我对 PhpStorm 和 git 有疑问。

每次我从例如添加文件时我的服务器的备份档案,PhpStorm 将所有文件显示为已更改,即使唯一的更改是行尾且没有内容。

我注意到这是因为我的 git 配置为使用 CRLF 检出文件和 LF 用于 repo 中的文件(这就是我想要的)。

现在问题来了,当我添加已经有 LF 换行符的文件时,所有这些文件都显示为“已修改”。当我对这些文件中的任何一个执行git add 时,换行符在文件系统中转换,并且 git/PhpStorm 发现这些文件与 repo 相同,并从“更改”列表中删除该文件。

但是当我添加一个包含数千个文件的整个目录时,手动添加所有没有真正改变的文件是一件很痛苦的事情。我无法添加整个文件夹,因为我首先想删除所有文件更改,然后查看文件内容中有哪些真正的更改。

我目前的配置是:

core.autocrlf=true
core.safecrlf=false

我的问题是:

有没有办法禁用文件显示为“已更改”的功能,即使将它们添加到 git 不会添加任何更改(但保持 Windows 中的文件具有 CRLF 和 repo LF 中的文件的行为)?

我已经发现我可以通过设置core.safecrlf=false 来禁用命令行git 中的"LF will be replaced by CRLF" 警告。但是这些文件在 PhpStorm 和git status 中仍然显示为“已更改”。

我为命令行 git 发现了一个类似的问题:Git status ignore line endings / identical files / windows & linux environment / dropbox / meld,但没有一个解决方案对我有用。

【问题讨论】:

  • 我认为您有工作流程问题,而不是 Git 或 PhpStorm 问题。为什么您是否经常将数千个文件从您的 Linux 服务器复制到您的 Windows 机器上? LF 到 CRLF 的转换仅在您执行 git add 时完成,正如您已经发现的那样。为什么你不能做一个git add . 来进行这种转换,删除所有只编辑了换行符的文件,然后做一个git reset 来查看剩余的更改?您是否考虑过运行一个命令行工具来为您进行这种转换?
  • @CodeCaster 1. 大多数情况下,我们在创建新存储库并用旧存档文件的内容填充它时,或者当我们需要将服务器文件的状态与存储库中的状态进行比较时,都会遇到这个问题。我用 git add && git reset 尝试了你的建议。它解决了一些问题,但仅适用于非常少量的文件。其余的仍然列在 phpstorm 和命令行 git 中。目前我尝试编写一个脚本,遍历所有文件并自动检查它们。我只是希望任何 git 配置或一个不错的单行命令都有更好的方法
  • 与实际问题有点无关,但仍然:1)那些文件是什么类型的(PHP / HTML / JS / etc)? 2) 为什么不将它们全部使用LF 并仅将CRLF 用于特定于Windows 的文件(例如web.config,如果您使用的是IIS Web 服务器等)并尽量不使用任何行尾转换?我的观点:PHP 可以很好地处理 LF 和 CRLF,无论是在 Linux/Mac 上的 Windows 上。大多数文本编辑器/工具也将处理 LF 文件(除非它可能是标准记事本)。这适用于您的代码/工作流程吗?
  • @LazyOne 文件主要是 php、html、js、css 和其他一些文本类型(svg、less、json、txt 等)。禁用行尾转换是我上一家公司的方式,但在目前的公司中,大多数人都使用 windows,因此所有类似文本的文件都应该与 windows 换行符一起存储在工作目录中。

标签: git intellij-idea phpstorm core.autocrlf


【解决方案1】:

我找到了一种有用的方法,并使用Git status ignore line endings 的答案编写了一个脚本,它遍历所有文件并为每个没有内容更改的文件触发行转换。

git status | grep modified | cut -d' ' -f 4- | while read x; do

  echo -e -n "checking $x                                                                   
"
 if [ "$(git --no-pager diff --ignore-cr-at-eol -- $x)" ]; then
    echo "modified: $x"
 else
   ## Add files to trigger auto clrf convert
   #git add $x
   # restore repo-state of this file to remove it from changes list
   git checkout HEAD -- $x
 fi
done

它包含更改的文件内容,并从更改列表中删除具有相同内容的文件。

它工作得很好,但需要一段时间才能运行,所以我仍然愿意寻求更好的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 2010-12-07
    • 2020-12-30
    相关资源
    最近更新 更多