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.