[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