我需要通过用更新的值替换消息代码来重构文件。我的原始文件存在于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中适应了以下选择
但是在所有这些情况下,它都会更改整个文件作为新文件,并在git diff中显示所有更改都是新更改,而我未更改的旧更改已更改。 有什么办法可以解决这个问题?
我从堆栈溢出中遇到了以下问题:
但是他们都没有以积极的方式帮助我。
更新
最后,按照另一个堆栈溢出问题的说明进行操作,该问题涉及省略提交级别,这将跳过添加空格,从而解决了我的问题,但是由于存在相同文件的某些部分,因此也存在一些缺陷没有提交(实际上属于空白中省略的)。
我实际上不知道如何处理此问题,因为我必须对多个分支进行更改,而所有这一切可能也可能不一定要解决此问题。有没有简单的方法,而不是在git commit级别上做。每当我这样提交时,我都必须忽略空白,然后提交并存储未提交的更改。
此“堆栈溢出”链接为:Add only non-whitespace changes
答案 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^
而无需恢复。