А потом человек сделал ещё два коммита, уже по файлам с CRLF'ами.
Ситуацию надо исправлять, соответственно, в итоге хотелось бы иметь все те же коммиты, но без CRLF'нутых файлов.
Каким путем пошел я (абсолютно ебанутый):
1. Берем коммит, делаем на него
git checkout2. Фиксим crlf в файлах. Я делал так:
grep -r -l '\r' . | xargs sed -i '' -e 's|\r$||'3. Делаем
git add && git commit --amend, чтобы получить новый коммит, но уже без дерьма.4. Записываем хэш получившегося коммита.
5. Повторяем для всех коммитов до последнего.
6. Берем перый коммит, и делаем
git cherry-pick всех последующих исправленных коммитов.8. Перемещаем ветку на новую историю.
9. Форспуш.
10. ?????
11. Профит!
Вообще, вместо
cherry-pick, вероятно, достаточно было бы обычного ребейза, но не уверен.Также, возможно, можно собрать какую-то хитрую команду для гита (жду предложений в комменты :D), которая бы проходилась по коммитам и сама их исправляла, но способ выше был более прямолинейный и простой.
upd: в комментах подсказывают, что таки можно сделать нормально, через
git filter-branch: https://stackoverflow.com/a/2466992 И не забываем выдать человеку