Как восстановить построчную историю обвинений git после того, как окончания строк были изменены на CR?

Несколько разработчиков внесли свой вклад в проект в течение нескольких лет. Несколько коммитов назад один коммит изменил окончание строк в одном файле с нашего стандартного LF (0x10) на CR (0x13). Причина неизвестна.

Команда git log -p -- filename показывает, что в каждом последнем коммите 1 строка была удалена, 1 добавлена. Строка — это все содержимое файла с символами ^M вместо разрывов строк.

Умные редакторы кода, такие как VSCode, по-прежнему могут правильно отображать код, разбитый на строки. GitLens «История файлов» правильно отображает различия, возникшие в результате коммита. Но построчное обвинение недоступно.

Я могу исправить окончание строк обратно на LF с помощью VSCode (два клика), но после этого меня будут винить за каждую строку в файле.

Кажется возможным исправить это, вручную просматривая каждый коммит, восстанавливая его различия и каким-то образом вручную приписывая вину за измененные строки автору коммита. Своего рода повторение изменений, но с правильными окончаниями строк.


Как восстановить авторов по строкам, взяв какой-нибудь старый коммит в качестве отправной точки и применив различия из каждого коммита, поскольку окончания строк были нарушены?

Существует возможность игнорировать определенные коммиты при назначении вины.

jthill 04.07.2024 20:06

Спасибо @jthill. Следуя вашему предложению, я прочитал статью о переключателе --ignore-rev и файле .git-blame-ignore-revs. Моя задача — не пропустить определенные коммиты или скрыть изменение форматирования, а восстановить и заново построить построчную вину, которая потеряна из-за неправильного форматирования ранее.

Serge 04.07.2024 20:19

«Несколько коммитов назад один коммит изменил окончание строк в одном файле с нашего стандартного LF (0x10) на CR (0x13). Причина неизвестна». Ну, ты не должен был этого допустить. Поезд уже ушел со станции. Это может быть одна из тех редких ситуаций, когда необходимо удалить этот коммит из существования (или заменить его коммитом, который этого не делает). Всем придется выбросить свои клоны и клонировать заново после внесения исправления. Черт возьми, может быть, даже это не решит проблему с обвинением.

matt 05.07.2024 00:39

используйте git blame -w.

eftshift0 05.07.2024 08:44
git blame -w приписывает каждую строку последнему редактору файла: поскольку с точки зрения GIT каждое небольшое редактирование меняет все содержимое файла. При использовании разрывов строк ^M git считает файл состоящим из одной строки. Это проблема.
Serge 05.07.2024 09:51

нашел этот скрипт, который исправляет проблему и историю EOL github.com/eantoranz/conflict_book/blob/main/scripts/… Подробная статья: ezconflict.com/en/conflictsse16.html Но это решение не помогает работа над проектом с участием нескольких разработчиков после объединения проблемных коммитов, много коммитов и веток назад. Так что, думаю, я просто исправлю файл и объявлю построчную вину утраченной.

Serge 05.07.2024 15:20

Это больше похоже на то, что вы хотите переписать историю коммитов с исправленными разрывами строк. Такое ужасное изменение должно было быть уловлено обзором.

j6t 06.07.2024 08:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы сделать это локально,

mkdir -p .git/info
echo "* diff=crnl" >.git/info/attributes
git config diff.crnl.textconv "sed -Ez 's,\r\n?,\n,g'"

что приведет к тому, что любой запуск различий, контролируемых Git, в этом конкретном репозитории сначала преобразует символы новой строки Mac или Windows в символы новой строки Unix.

Шаблон подстановочных знаков может заходить слишком далеко. Если у вас есть проверенные двоичные файлы, вам захочется найти лучший набор совпадающих шаблонов.

изменить: тестовый пример:

sh -x <<\EOD
cd `mktemp -d`; git init
seq 5 >file; git add .; git commit -am-
sed 1s,^,x, -i file; git commit -am1x
tr \\n \\r <file | tee file; git commit -am croops
sed s,5,x5, -i file; git commit -am5x
git blame file
mkdir -p .git/info; echo '* diff=crnl' >.git/info/attributes
git config diff.crnl.textconv "sed -Ez 's,\r\n?,\n,g'"
git blame file
EOD

Спасибо за современное решение! Мне нужно узнать об алгоритмах сравнения в git. git-scm.com/docs/…

Serge 12.07.2024 11:29

Другие вопросы по теме