Переписать историю git, чтобы заменить все CRLF на LF?

Я собираюсь перенести частный репозиторий Git из win32 box в Ubuntu. Хотя я могу сделать окончательный коммит dos2unix, но я хотел бы переписать всю историю, поэтому некоторые Git GUI будут корректно отображать log/diff. Например, gitg вставит пустые строки для каждого CR/LF.

24
задан Xiè Jìléi
16.11.2022 2:42 Количество просмотров материала 2557
Распечатать страницу

3 ответа

можно использовать git filter-branch, что с --tree-filter опции и задание --all для филиала.

вот пример (запускается в пустой директории с текстовым файлом Unix типа:

Приготовление:

$ hexdump -C testfile 
00000000  61 0d 0a 62 0d 0a 63 0d  0a                       |a..b..c..|
00000009

$ git init
Initialized empty Git repository in /home/seigneur/tmp/a/.git/

$ git add testfile && git commit -m "dos file checked in"
[master (root-commit) df4970f] dos file checked in
 1 files changed, 3 insertions(+), 0 deletions(-)
 create mode 100644 testfile

команды:

$ git filter-branch --tree-filter 'git ls-files -z | xargs -0 dos2unix' -- --all

выход:

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

I сильно рекомендуем сделать полную резервную копию заранее. Запуск этого с вашей машины Linux (если у вас нет хорошая настройка оболочки в среде windows), вероятно, проще.

Edit: преобразование было отменено в первый раз.

20
отвечен Mat 2022-11-17 10:30

мат ответ прибил вопрос прямо на голову. К сожалению, на Ubuntu Linux, начиная с версии 10.04 (Lucid Lynx), команды dos2unix/unix2dos больше не доступны и были заменены на fromdos/todos. Кроме того, оба набора команд преобразования имеют различную степень незнания существования двоичных файлов, таким образом, если ваше хранилище содержит изображения, шрифты и т. д. они будут повреждены этим процессом.

Я в состоянии найти обходной путь для проблемы повреждения двоичного файла, который использует команду Linux "файл", чтобы правильно идентифицировать и обрабатывать только текстовые файлы, как показано ниже. Команда ниже использует опцию --tag-name-filter для сохранения существующих тегов путем их перемещения во вновь измененные коммиты. Также он использует флаг --force, чтобы гарантировать, что команда будет работать в том случае, если вы запустили tree-filter в своем репозитории раньше.

git filter-branch --force --tree-filter 'git ls-files | xargs file | sed -n -e "/.*: .*text.*/s/\(.*\): .*//p" | xargs fromdos' --tag-name-filter cat -- --all
5
отвечен mgorovoy 2022-11-17 12:47

и без каких-либо дополнительных инструментов (например, 'fromdos', 'dos2unix' и т. д.):

git filter-branch --force --tree-filter 'git ls-files | xargs file | sed -n -e "/.*: .*text.*/s/\(.*\): .*//p" | xargs -0 sed -i"" -e "s/"$(printf "5")"$//"' --tag-name-filter cat -- --all

кроссплатформенная (ОС Х, то FreeBSD, Linux) в аналоговый 'fromdos', 'dos2unix':

sed -i'' -e 's/'"$(printf '5')"'$//'

возможно, полезно 'unix2dos':

sed -i '' -e 's|$|'"`printf '5'`"'|' file.name

если вы абсолютно уверены, что вы делаете, вы можете использовать эту простую встроенную команду для удаления "/r" из всех файлов в текущем каталоге ".":

find . -type f -exec sed -i'' -e 's/'"$(printf '5')"'$//' {} \;
3
отвечен METAJIJI 2022-11-17 15:04

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх