[devel] .gear/rules tar:, diff: и .gitattributes export-ignore
Sergey Vlasov
vsu на altlinux.ru
Пт Янв 14 16:09:28 UTC 2011
On Fri, Jan 14, 2011 at 05:49:51PM +0300, Dmitry V. Levin wrote:
> On Fri, Jan 14, 2011 at 05:03:58PM +0300, Sergey Vlasov wrote:
> > On Fri, Jan 14, 2011 at 03:26:45PM +0200, Sergey Shilov wrote:
> > > Начиная с версии R13B03 апстрим переехал на https://github.com/erlang/otp.git
> > > :-)
> >
> > Ага, и там есть файл .gitattributes:
> >
> > .gitattributes export-ignore
> > .gitignore export-ignore
> >
> > Вот как раз из-за этого файла (а не .gitignore) git archive и выбрасывает
> > из создаваемого архива файлы, для которых указан атрибут export-ignore.
> >
> > Явной опции для отключения этой функции у git archive нет, но можно перед
> > его вызовом вписать в .git/info/attributes строку:
>
> Но, поскольку локальные изменения в .git/info/ не передаются при git push
> и git fetch, это не очень удобно использовать при распределенной
> разработке с использованием gear.
Я имел в виду, что это можно делать в gear (правда, сейчас там создаются
только временные GIT_OBJECT_DIRECTORY и GIT_INDEX_FILE, но в принципе
отсюда уже недалеко и до создания полноценного временного репозитория со
своим .git/info/attributes). Это, кроме всего прочего, устранит возникшую
сейчас зависимость поведения gear от содержимого .git/info/attributes в
локальном репозитории.
Хотя вообще это не очень красивый объезд. Ну и export-ignore - это не
единственный атрибут, обрабатываемый git archive; есть ещё export-subst,
приводящий к изменению содержимого файлов при экспорте, что точно так же
может приводить к генерации в дальнейшем патчей, не накладывающихся на
результат git archive.
Вообще эту проблему можно решать несколькими способами:
1) Создавать в gear временный репозиторий с .git/info/attributes, в
котором принудительно сбрасывать атрибуты export-ignore и
export-subst. Плюсы: можно реализовать уже сейчас, изменяя только
gear (не требуется патчить сам git). Минусы: если апстрим при выпуске
релизов использует git archive, генерируемый gear архив перестанет
совпадать с апстримным (в случае использования export-ignore будет
содержать лишние файлы, для export-subst - нераскрытые шаблоны); при
появлении в новой версии git нового атрибута, обрабатываемого git
archive, придётся вновь исправлять gear.
2) Добавить в git archive опцию --ignore-attributes, полностью
отключающую обработку атрибутов. Этот вариант отличается от 1) только
большей устойчивостью к возможным будущим изменениям в git archive;
однако появляется требование использования вместе с gear и новой
версии git. Правда, можно добавить в gear ещё и определение наличия в
используемой версии git archive нужной опции, и работу по варианту 1)
в случае её отсутствия.
3) Можно пойти другим путём - решить, что не только команда tar в
.gear/rules должна обрабатывать .gitattributes, но и команды diff
должны давать результат, соотвествующий команде tar. Например, можно
при формировании diff использовать не git diff-tree, а извлечь через
git archive оба дерева и применить к ним обычный diff. В этом случае
получаемый diff не будет содержать файлов, исключённых через
export-ignore (если они исключены в обеих версиях), а также будет
содержать раскрытые шаблоны для export-subst. Существенные недостатки
такого варианта тоже очевидны - в первую очередь это скорость работы
(распаковка архивов с последующим сравнением всех файлов может занять
значительное время), также пропадает возможность получения diff в
формате git для последующего применения через git apply (например, при
модификации бинарных файлов или символических ссылок). Можно,
конечно, ввести в набор команд .gear/rules в дополнение к обычному
diff отдельную команду, работающую через git archive, для применения
только в случаях, когда используется .gitattributes.
4) Для ускорения работы варианта 3) можно попытаться добавить в git
diff-tree код для обработки .gitattributes способом, аналогичным git
archive, но это будет существенно сложнее, чем отрывать обработку
атрибутов от git archive.
5) Ничего не делать, предложить мантейнерам пакетов, столкнувшимся с
проблемой, паковать tar: @name на -@version на -@release@ без выделения
патчей в src.rpm.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : отсутствует
Тип : application/pgp-signature
Размер : 189 байтов
Описание: Digital signature
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20110114/20c0d3f5/attachment-0001.bin>
Подробная информация о списке рассылки Devel