解决“ ^ M”或“ \ r”字符行结尾的最佳位置/阶段

时间:2018-10-19 07:07:10

标签: java git vim

我需要通过用更新的值替换消息代码来重构文件。我的原始文件存在于Ubuntu服务器中,我可以将其作为Windows文件安装和访问。我通过Ubuntu服务器中的git克隆它,然后在小型Java程序的帮助下将文件移动到Windows和Windows中,然后重构该值并将其写入。然后在Windows中打开文件,然后将要复制的文件粘贴到Ubuntu服务器中(因为复制替换,或者随着所有内容的更改而移动替换显示git diff)。

以下是我用来进行重构的Java代码。

        ruleInBR = new BufferedReader(new FileReader(ruleIn));
        ruleOutBW = new BufferedWriter(new FileWriter(ruleOut));
        csvOutBW = new BufferedWriter(new FileWriter(csvOut));

        String readRule = "";
        int lineNo = 1;

        while((readRule = ruleInBR.readLine()) != null)
        {
            if(details.get(lineNo) != null)
            {
                AlterValuePair<String> avPair = details.get(lineNo);
                String renamedRule = readRule.replace(avPair.getOldValue(),avPair.getNewValue());
                String trimRenamedRule = renamedRule.replace("\r","");
                csvOutBW.write(lineNo + ", " + avPair.getOldValue() + ", " + avPair.getNewValue() +"\n");
                ruleOutBW.write(trimRenamedRule + "\n");
                count++;
            }
            else {
                String trimReadRule = readRule.replace("\r","");
                ruleOutBW.write(trimReadRule +"\n");

            }
            lineNo++;
        }

但是在GitDiff中,我遇到了git diff是否存在'^ M'或'\ r'的问题,但实际上我并没有这样做,据我所知,这是因为我已经与一些编辑人员接触并合作过使这些行结束。由于文件重构会由于意外字符而在Ubuntu中编译时引起问题。我遵循了以前学习并在Stack Overflow中找到的以下方法。

我在vim中适应了以下选择

  1. set ff = unix / set fileformat = unix
  2. 设置ff = dos / set fileformat = dos
  3. %s / \ r \ n / \ n /或%s / \ r //或%s / \ r // g
  4. dos2unix文件名
  5. perl -pi -e's / \ r //'或perl -pi -e's / \ r \ n / \ n /'

但是在所有这些情况下,它都会更改整个文件作为新文件,并在git diff中显示所有更改都是新更改,而我未更改的旧更改已更改。 有什么办法可以解决这个问题?

我从堆栈溢出中遇到了以下问题:

  1. gVim showing carriage return (^M) even when file mode is explicitly DOS
  2. Convert DOS line endings to Linux line endings in vim
  3. ^M at the end of every line in vim
  4. Remove a line in text file with java.BufferedReader
  5. https://its.ucsc.edu/unix-timeshare/tutorials/clean-ctrl-m.html
  6. https://www.garron.me/en/bits/get-rid-m-characters-vim.html

但是他们都没有以积极的方式帮助我。

更新

最后,按照另一个堆栈溢出问题的说明进行操作,该问题涉及省略提交级别,这将跳过添加空格,从而解决了我的问题,但是由于存在相同文件的某些部分,因此也存在一些缺陷没有提交(实际上属于空白中省略的)。

我实际上不知道如何处理此问题,因为我必须对多个分支进行更改,而所有这一切可能也可能不一定要解决此问题。有没有简单的方法,而不是在git commit级别上做。每当我这样提交时,我都必须忽略空白,然后提交并存储未提交的更改。

此“堆栈溢出”链接为:Add only non-whitespace changes

1 个答案:

答案 0 :(得分:3)

因此,正如评论中所确认的,您的时间表与发生的事情有关:

1)在Unix上签出文件。该文件具有Unix行尾(LF)。

2)复制到Windows。该文件仍然具有Unix行结尾。

3)遍历Java文件以更改某些值。读取文件时,即使它最初不包含CR(仅包含LF),也尝试从中剥离CR。但即使它确实包含CR,也无法使用,因为根据BufferedReader.readLine文档,您会得到没有行尾的字符串。您使用\n将行写入新文件; Java将\n理解为“行终止符”,这使得Windows上的Java在每行写入的if的两个分支中都写入Windows行尾(CR LF)-即两个更改的行以及您打算复制而没有更改的行)。现在,该文件的所有行上都包含Windows(CR LF)结尾。

4)将转换后的文件复制回Unix。行的结尾是Windows(CR LF)。

5)提交了文件。由于您是在Linux上提交文件的,因此我认为未设置git在提交过程中剥离它们。因此,每行更改都会提交文件:实质性地更改了某些行,但琐碎地更改了某些行(仅更改了行终止符)。

现在您处于一种情况,如果您尝试恢复Unix行终止符,则实际上是在更改整个文件-因为每一行都需要更改,甚至只需更改一点即可。

其他选项:

如果您已经推送了更改,则显而易见的方法是git revert提交(它看起来也像更改整个文件,但至少很明显是还原),然后重新运行Java程序在Unix计算机上,或者在复制回Unix计算机之后但在提交之前执行dos2unix file

如果您尚未推送更改,则可以撤消git reset --hard HEAD^而无需恢复。