Первый блин всегда комом. Я решил переписать историю коммитов (но не сами файлы-объекты) в perl.git. На это есть две мелкие причины: 1) В некоторых commit message вместо \n стоят \r. gitk от этого плющит. Соответственно нужно применить фильтр (если совсем правильно) perl -0777 -pe 's/\r\n/\n/g;s/\n\r/\n/g;s/\r/\n/g' 2) Нужно заменить committer email: at@localhost.localdomain => at@altlinux.ru. И ещё. 3) Для названий браней и тагов хочу сделать s/perl-//. В общем дальше я собрался написать как я с этим трахался и спросить всё ли сделал правильно, но вроде всё получилось. Самое неприятное что в cherry-picked коммитах пришлось в тексте заменять название tree-ish скорее вручную чем автоматически. Т.к. git-push не умеет удалять старые бранчи и таги, я сделал git-rm-db и сейчас заливаю по новой. Типа прошу прощения за причиненные неудобства и всё такое. Зато я примерно понял как устроен git. Сейчас попробую объяснить, может кому-нибудь от этого будет просветление. git -- это дерево объектов. Дерево означает что один объект содержит ссылки на другие объекты вниз по дереву. Объекты бывают двух типов: blob (файлы) и tree (структура каталогов, в которые надо сувать файлы). tree содержит ссылки на блобы. Ещё бывают объекты типа commit; каждый новый commit описывает трансформацию дерева относительно предыдущего коммита. В объекте commit содержится ссылка на предыдущий коммит и ссылка на дерево, которое перекрывает этот предыдущий коммит. Всё что новое дерево не перекрывает -- всё то остается от дерева из старого коммита. Так, имея на руках коммит, можно пройтись вниз по дереву к предыдущему коммиту и т.д., т.е. полностью развернуть дерево исходников. Далее, есть два типа ссылок, осмысленных для пользователя: heads и tags. Heads -- это бранчи, каждый бранч содержит ссылку на какой-либо корневой узел в дереве. Когда мы коммитим в бранч, корневой узел заменятся очередным коммитом, а старое значение бранча подшивается в новый корневой узел в качестве родительского. То есть наслаивается примерно как сосульки растут вверх, сталагмиты что ли. Вершина такой сосульки называется head. Таг -- это просто указатель на какой-либо коммит. Слабый таг сразу указывает на коммит, а сильный таг -- это отдельный объект типа tag, в котором есть ссылка на коммит. Ну вот и всё. Все базовые средства git (plumbing) как раз непосредственно работают с этим деревом. А из этих базовых средств уже делают утилиты (porcelain -- как фарфор из глины), которые уже умеют делать всякие там штучки-дрючки.