Переписать историю мерзавцев, чтобы заменить все CRLF на LF?
32
Я собираюсь перенести частный репозиторий Git из win32 box в Ubuntu. Хотя я могу сделать окончательный коммит dos2unix, но я бы хотел переписать всю историю, поэтому некоторые графические интерфейсы Git будут отображать log / diff правильно. Например, gitg вставит пустые строки для каждого CR / LF.
Rewrite df4970f63e3196216d5986463f239e51eebb4014 (1/1)dos2unix: converting file testfile to Unix format ...
Ref 'refs/heads/master' was rewritten
$ hexdump -C testfile
00000000 61 0a 62 0a 63 0a |a.b.c.|
00000006
Я настоятельно рекомендую сделать полное резервное копирование заранее . Выполнение этого с вашей машины Linux (если у вас не установлена хорошая оболочка в вашей среде Windows), возможно, проще.
Редактировать: конверсия была изменена в первый раз.
Спасибо, этот пост мне очень помог. У меня было несколько файлов с пробелами в имени, немного изменение оригинальной команды зафиксировал его: git filter-branch --tree-filter 'git ls-files -z | xargs -0 dos2unix' -- --all. Флаги -zи -0скажите git ls-filesи xargsраспечатать и интерпретировать nullкак конец строки.
Иван
Другая альтернатива команде dos2unix - полагаться на сам git:git filter-branch --prune-empty --tree-filter 'git add --renormalize .' -- --all
Vilmantas Baranauskas
6
Ответ Мэта прибил проблему прямо на голову. К сожалению, в Ubuntu Linux, начиная с версии 10.04 (Lucid Lynx), команды dos2unix / unix2dos больше не доступны и были заменены на fromdos / todos. Кроме того, оба набора команд преобразования имеют различную степень незнания о существовании двоичных файлов, поэтому, если ваш репозиторий содержит изображения, шрифты и т. Д., Они будут испорчены этим процессом.
Мне удалось найти обходной путь для проблемы повреждения двоичных файлов, которая использует команду Linux file для правильной идентификации и обработки только текстовых файлов, как показано ниже. В приведенной ниже команде используется параметр --tag-name-filter для сохранения существующих тегов путем их перемещения в новые исправленные коммиты. Также он использует флаг --force, чтобы гарантировать, что команда будет работать в том случае, если вы ранее запускали tree-filter в своем хранилище.
Если вы абсолютно уверены, что делаете, вы можете использовать эту простую встроенную команду для удаления "/ r" из всех файлов в текущем каталоге ".":
find . -type f -exec sed -i'' -e 's/'"$(printf '\015')"'$//' {} \;
git filter-branch --tree-filter 'git ls-files -z | xargs -0 dos2unix' -- --all
. Флаги-z
и-0
скажитеgit ls-files
иxargs
распечатать и интерпретироватьnull
как конец строки.git filter-branch --prune-empty --tree-filter 'git add --renormalize .' -- --all
Ответ Мэта прибил проблему прямо на голову. К сожалению, в Ubuntu Linux, начиная с версии 10.04 (Lucid Lynx), команды dos2unix / unix2dos больше не доступны и были заменены на fromdos / todos. Кроме того, оба набора команд преобразования имеют различную степень незнания о существовании двоичных файлов, поэтому, если ваш репозиторий содержит изображения, шрифты и т. Д., Они будут испорчены этим процессом.
Мне удалось найти обходной путь для проблемы повреждения двоичных файлов, которая использует команду Linux file для правильной идентификации и обработки только текстовых файлов, как показано ниже. В приведенной ниже команде используется параметр --tag-name-filter для сохранения существующих тегов путем их перемещения в новые исправленные коммиты. Также он использует флаг --force, чтобы гарантировать, что команда будет работать в том случае, если вы ранее запускали tree-filter в своем хранилище.
источник
И без каких-либо дополнительных инструментов (таких как 'fromdos', 'dos2unix' и т. Д.):
Кроссплатформенный (OS X, FreeBSD, Linux) полезный аналог 'fromdos', 'dos2unix':
Возможно полезный 'unix2dos':
Если вы абсолютно уверены, что делаете, вы можете использовать эту простую встроенную команду для удаления "/ r" из всех файлов в текущем каталоге ".":
источник
sed
вызов может быть заменен на более короткий:sed -n -e "s/\(.*\): .*text.*/\1/p"