Мне нужно реорганизовать файл, заменив коды сообщений с обновленными значениями. Мой исходный файл присутствует на сервере Ubuntu, который я могу подключить и получить в виде файлов Windows. Я клонировал его через git в Ubuntu Server, а затем переместил файл в Windows и Windows, с помощью небольшой Java-программы реорганизовал значение и запустил его. Затем откройте файл в окнах и файл, чтобы скопировать вставку файла на сервере Ubuntu (поскольку копировать замену или переместить замену файла show 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 он показывает, что все новые изменения и старые, которые я не изменил, изменены. Есть ли способы решить эту проблему?
Я перешел к следующим вопросам из Stack Overflow:
Но никто из них не помог мне в позитивном ключе.
ОБНОВИТЬ
Наконец, после выполнения инструкции из другого вопроса о переполнении стека, в котором говорится об исключении на уровне фиксации, который пропустит добавление пробелов и который немного изменит мои проблемы, но также имеет некоторые недостатки, поскольку в нем есть некоторые части тех же файлов, которые не являются (фактически принадлежит пропущенным в пробеле).
Я не знаю, как это сделать, поскольку я должен вносить изменения в несколько ветвей, и все это может или не должно пройти эту проблему. Есть ли какой-либо простой способ, а не делать на уровне git commit. Там, где я должен игнорировать пробелы и совершать и фиксировать незафиксированные изменения каждый раз, когда я совершаю это.
Btw, что ссылка Stack Overflow: добавьте только изменения без пробелов
Итак, ваша временная шкала, подтвержденная в комментариях, с тем, что происходит:
1) проверил файлы в Unix. Файл имеет окончание строки Unix (LF).
2) скопирован в Windows. Файл все еще имеет окончание строки Unix.
3) просмотрел файл Java, чтобы изменить некоторые значения. Когда вы читаете файл, вы пытаетесь удалить из него CR, хотя он не содержит CR
в первую очередь (только LF); но даже если он содержит CR, это не сработает, потому что вы получите строку без окончаний строки, согласно документации BufferedReader.readLine
. Вы пишете строки в новый файл с \n
; Java понимает \n
как "конец терминатора строк", что заставляет Java-on-Windows записывать окончания строк Windows (CR LF) на каждую написанную строку (в обеих ветвях if
- т.е. как на измененных строках, так и на тех, которые вы просто намереваются копировать без изменений). Файл теперь содержит финальные строки Windows (CR LF) на всех его строках.
4) скопировал преобразованный файл обратно в Unix. Конечными линиями являются Windows (CR LF).
5) передал файл. Поскольку вы перенесли файл в Linux, я предполагаю, что git не был настроен, чтобы разбить их во время фиксации. Таким образом, файл, полученный с каждой строкой, изменился: некоторые строки существенно, но некоторые строки тривиально (только с изменением терминатора строк).
Теперь вы находитесь в ситуации, когда, если вы попытаетесь вернуть терминаторы линии Unix обратно, вы фактически меняете весь файл - потому что каждая строка должна быть изменена, даже немного.
Другие опции:
Если вы уже внесли изменения, очевидным способом было бы git revert
эту фиксацию (которая также будет выглядеть как изменение всего файла, но, по крайней мере, это как бы очистить его от возврата), то либо перезапустите программу Java в Unix машина или dos2unix file
после копирования на Unix-машину, но перед фиксацией.
Если вы не нажали изменения, вы можете уйти с git reset --hard HEAD^
вместо возврата.
reset
, но это немного ядерно - опасно, если у вас есть соавторы, которые уже извлекли ваши изменения. Нет другого способа не менять каждую строку в вашей истории, кроме переписывания истории - потому что вы помещаете ее в историю с этим коммитом.