[devel] perl.git rewrite history

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Ср Сен 20 08:54:03 MSD 2006


Первый блин всегда комом.  Я решил переписать историю коммитов (но не
сами файлы-объекты) в 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 -- как фарфор из глины), которые уже умеют
делать всякие там штучки-дрючки.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20060920/5e074637/attachment-0001.bin>


Подробная информация о списке рассылки Devel