【发布时间】:2019-03-24 01:11:43
【问题描述】:
我需要通过用更新的值替换消息代码来重构文件。我的原始文件存在于 Ubuntu 服务器中,我可以将其作为 Windows 文件进行挂载和访问。我在 Ubuntu Server 中通过 git 克隆它,然后将文件移动到 Windows 和 Windows 中,借助小型 Java 程序重构值并编写它。然后在 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 for '^M' 或 '\r' 存在的问题,我实际上没有这样做,据我所知,我知道这是因为我已经打开并与一些编辑器一起工作离开那些行结束。由于文件重构会由于意外字符而在 Ubuntu 中编译时导致问题。我遵循了我之前学习并在 Stack Overflow 中找到的以下方法。
我在 vim 中调整了以下选择
- set ff=unix /set fileformat=unix
- set ff=dos /set fileformat=dos
- %s/\r\n/\n/ 或 %s/\r// 或 %s/\r//g
- dos2unix 文件名
- perl -pi -e 's/\r//' 或 perl -pi -e 's/\r\n/\n/'
但所有这些情况都将 整个文件 更改为新文件,并且在 git diff 中显示所有更改都是新更改,而我没有更改的旧更改已更改。 有没有办法解决这个问题?
我已经从 Stack Overflow 解决了以下问题:
- gVim showing carriage return (^M) even when file mode is explicitly DOS
- Convert DOS line endings to Linux line endings in vim
- ^M at the end of every line in vim
- Remove a line in text file with java.BufferedReader
- https://its.ucsc.edu/unix-timeshare/tutorials/clean-ctrl-m.html
- https://www.garron.me/en/bits/get-rid-m-characters-vim.html
但他们都没有以积极的方式帮助我。
更新
最后,在遵循另一个 Stack Overflow 问题的说明后,该问题谈到在提交级别中省略,这将跳过添加空格并解决了我的问题,但这也有一些缺陷,因为它具有相同文件的某些部分未提交的(实际上属于空格中省略的)。
我实际上不知道如何处理这个问题,因为我必须对几个分支进行更改,所有这些可能会或可能不会遇到这个问题。有没有比在 git commit 级别做更简单的方法。每次我这样提交时,我都必须忽略空白并提交和存储未提交的更改。
顺便说一句,这个 Stack Overflow 链接:Add only non-whitespace changes
【问题讨论】:
-
请准确说明你做了什么。如果我理解正确:1)在 Unix 上签出文件,2)复制到 Windows,3)运行 Java 文件以更改一些值,4)将转换后的文件复制回 Unix,5)提交文件。这是对您的时间线的正确描述吗?还是您没有提交,只是查看了与上次提交的差异?
-
我也提交了,检查我是否更新了描述
-
readLine 不会读取 CR 字符,为什么要在 java 中这样做?