Подтвердить что ты не робот

Преобразование git кодировки файла репозитория

У меня есть большой репозиторий CVS, содержащий файлы в ISO-8859-1 и вы хотите преобразовать его в git.

Конечно, я могу настроить git на использование ISO-8859-1 для кодирования, но я хотел бы иметь его в utf8.

Теперь с помощью таких инструментов, как iconv или recode, я могу преобразовать кодировку для файлов в рабочем дереве. Я мог бы совершить это с сообщением типа converted encoding.

Теперь мой вопрос: есть ли возможность конвертировать всю историю? Либо при преобразовании из cvs в git, либо позже. Моей идеей было бы написать script, который считывает каждое сообщение в репозитории git и преобразует его в utf8 и фиксирует его в новом репозитории git.

Это возможно (я не уверен в хэш-кодах и о том, как пройти через фиксации, ветки и теги). Или есть инструмент, который может обрабатывать что-то вроде этого?

4b9b3361

Ответ 1

Вы можете сделать это с помощью git filter-branch. Идея состоит в том, что вы должны изменить кодировку файлов в каждом коммите, переписывая каждую фиксацию по ходу.

Сначала напишите script, который изменяет кодировку каждого файла в репозитории. Это может выглядеть так:

#!/bin/sh

find . -type f -print | while read f; do
        mv -i "$f" "$f.recode.$$"
        iconv -f iso-8859-1 -t utf-8 < "$f.recode.$$" > "$f"
        rm -f "$f.recode.$$"
done

Затем используйте git filter-branch для запуска этого script снова и снова, один раз для фиксации:

git filter-branch --tree-filter /tmp/recode-all-files HEAD

где /tmp/recode-all-files - это выше script.

Сразу после того, как репозиторий обновлен с CVS, вы, вероятно, имеете только одну ветвь в git с линейной историей до начала. Если у вас несколько ветвей, вам может понадобиться усилить команду git filter-branch для редактирования всех коммитов.