git 如何处理数千个只有eol字符CRLF / LF差异的文件?

kknvjkwl  于 2023-02-28  发布在  Git
关注(0)|答案(1)|浏览(217)

我从一个合作者那里通过手动传输收到了文件,也就是说,不是通过git方式,也不是通过合并请求,我想把这些文件放到我的工作树中。

  1. EOL的角色不尊重我的政策,那就是:
  • CRLF用于工作目录中的大多数文件格式;
  • 本地和远程存储库中的LF。

1.有数以千计的此类文件,其中绝大多数仅具有这些EOL差异,且少于一百个具有有意义的差异。
下面是我的尝试:

  • 我尝试过不同的git设置:
  • git config --get core.autocrlf=true将CRLF放在工作目录中,将LF放在本地和远程存储库中,如Git replacing LF with CRLF中所述,之后我完成了重正化以及git rm --cached -r .git reset --hard;
  • 使用additional C# settingseol=crlf将. gitattributes设置为this template one,以确保这些设置不会丢失,如使用Git处理CRLF(回车,换行)的策略是什么?中所述--但基本上这并没有增加任何内容;
  • whitespace = cr-at-eol,这样git diff就可以忽略eol字符的差异,正如对Make 'git diff' ignore ^M的回答中所解释的那样。
  • 但是我的git GUI客户端SourceTree忽略了这些设置,仍然会列出成千上万的文件更改,它可以不显示差异,但仍然会列出Force SourceTree ignore line endings in git files中所示的文件,所以我尝试了其他几个设置,但我没有发现任何设置会跳过只包含eol字符更改的文件:SourceTree,SmartGit,Gittyup,GitHub Desktop,GitAhead,TortoiseGit,GitGUI,Git Extensions. GitAhead在这个例子中是最好的,因为它会将文件差异列表中只有eol字符差异的文件折叠起来.但是它仍然会列出这些差异,而且总体上非常慢.

以下是我看到的策略:
1.手动审查所有的文件-我宁愿不;
1.查找一个git GUI客户端,跳过只有eol字符差异的文件;
1.在适当的文件格式上使用记事本++等工具将所有LF替换为CRLF;
1.创建一个分支,在其中添加数千个文件,然后将其合并到我的开发分支中,在此过程中强制本地和远程存储库中的所有eol字符为LF。
有更好的主意吗?
当然,下次我必须这么做的时候,我会鼓励我的合作者使用git向我发送文件!

ljsrvy3e

ljsrvy3e1#

您可以移动文件夹中的文件,并使用这段代码将crlf转换为lf。
这将递归读取所有文件,将crlf更改为lf并保存。

确保文件适合内存

const fs = require('fs');
const path = require('path');

const directoryPath = 'path/to/directory';

// Function to recursively read all files in a directory
function readDirectory(directoryPath) {
  fs.readdir(directoryPath, (err, files) => {
    if (err) {
      console.error(err);
      return;
    }

    files.forEach((file) => {
      const filePath = path.join(directoryPath, file);
      fs.stat(filePath, (err, stat) => {
        if (err) {
          console.error(err);
          return;
        }

        if (stat.isDirectory()) {
          readDirectory(filePath); // Recursively read subdirectories
        } else {
          replaceCRLF(filePath); // Replace CRLF in files
        }
      });
    });
  });
}

// Function to replace CRLF with LF in a file
function replaceCRLF(filePath) {
  fs.readFile(filePath, 'utf8', (err, data) => {
    if (err) {
      console.error(err);
      return;
    }

    const newData = data.replace(/\r\n/g, '\n'); // Replace CRLF with LF
    if (newData !== data) {
      fs.writeFile(filePath, newData, 'utf8', (err) => {
        if (err) {
          console.error(err);
          return;
        }

        console.log(`Replaced CRLF with LF in file: ${filePath}`);
      });
    }
  });
}

readDirectory(directoryPath);```

相关问题