Лучшее место / фаза для разрешения окончания строки символов '^ M' или '\ r'

2

Мне нужно реорганизовать файл, заменив коды сообщений с обновленными значениями. Мой исходный файл присутствует на сервере 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

  1. set ff = unix/set fileformat = unix
  2. set ff = dos/set fileformat = dos
  3. % s/\ r\n/\n/или% s/\ r//или% s/\ r//g
  4. dos2unix fileName
  5. perl -pi -e '/\ r//' или perl -pi -e 's/\ r\n/\n/'

Но все эти случаи он изменил весь файл как новый файл, а в git diff он показывает, что все новые изменения и старые, которые я не изменил, изменены. Есть ли способы решить эту проблему?

Я перешел к следующим вопросам из Stack Overflow:

  1. gVim показывает возврат каретки (^ M), даже если файловый режим явно DOS
  2. Преобразование окончаний строк DOS в окончание строк Linux в vim
  3. ^ M в конце каждой строки в vim
  4. Удалите строку в текстовом файле с помощью 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. Там, где я должен игнорировать пробелы и совершать и фиксировать незафиксированные изменения каждый раз, когда я совершаю это.

Btw, что ссылка Stack Overflow: добавьте только изменения без пробелов

  • 0
    Пожалуйста, уточните, что именно вы сделали. Если я правильно понимаю: 1) извлеченные файлы в Unix, 2) скопированы в Windows, 3) пробежались по файлу Java для изменения некоторых значений, 4) скопировали преобразованный файл обратно в Unix, 5) зафиксировали файл. Это правильное описание вашей временной шкалы? Или вы не фиксировали, а просто смотрели на diff из последнего коммита?
  • 1
    Я также фиксирую, проверьте, я обновил описание
Показать ещё 1 комментарий
Теги:
vim

1 ответ

3

Итак, ваша временная шкала, подтвержденная в комментариях, с тем, что происходит:

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^ вместо возврата.

  • 1
    Dos2unix не работает, он изменил весь файл
  • 1
    Пожалуйста, прочитайте весь ответ, а не сосредотачивайтесь на ключевых словах. Конечно, он изменяет весь файл, потому что весь файл «грязный» для Windows. Тот факт, что вы совершили это является проблемой. Единственный сценарий, когда вы не получаете изменения всего файла в истории, - это опция reset , но это немного ядерно - опасно, если у вас есть соавторы, которые уже извлекли ваши изменения. Нет другого способа не менять каждую строку в вашей истории, кроме переписывания истории - потому что вы помещаете ее в историю с этим коммитом.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню