Является ли Mercurial .hgignore единственным вариантом для обработки сотен временных файлов, созданных при компиляции?

Я искал в Google и ТАК ищу кого-то, кто задал этот вопрос, но я подхожу совершенно пустым. Я заранее прошу прощения за длинный обходной путь задать вопрос. (Если бы я смог понять, как инкапсулировать проблему, возможно, мне бы удалось найти ответ.)

Как в Mercurial управляют большими проектами, когда в процессе сборки / компиляции генерируются сотни временных файлов для достижения конечного результата ?? Является ли .hgignore единственным ответ?

Пример сценария:

У вас есть проект, который хочет использовать какой-то пакет с открытым исходным кодом для какой-то функции, и его нужно скомпилировать из исходного кода. Итак, вы идете за посылкой. un-.tgz, а затем вставьте его в собственный репозиторий Mercurial, чтобы вы могли начать отслеживать изменения. Затем вы вносите все свои изменения и запускаете сборку.

Вы тестируете свой конечный результат, довольны результатами и готовы выполнить фиксацию обратно в свой локальный клон репозитория. Итак, вы делаете hg status, чтобы проверить свои изменения перед фиксацией. hg status Результаты заставят вас немедленно начать использовать все те слова, которые заставили бы вашу мать стыдиться - потому что теперь у вас есть экраны и экраны «строительного мусора».

В качестве аргумента скажем, что этот пакет - MySQL или Apache: что-то, что

  1. вы не контролируете и будете регулярно менять,
  2. оставляет много мусора во многих местах, и
  3. нет гарантии, что этот мусор не будет меняться каждый раз, когда вы получаете новую версию из внешнего источника.

Вау что? Над конкретным проектом, вызывающим эту тревогу, будут работать несколько разработчиков в разных физических местах, поэтому он должен быть максимально простым. Если будет слишком много усилий, они не будут этого делать, и у нас возникнет более серьезная проблема. (К сожалению, некоторые старые собаки не хотят учиться новым трюкам ...)

Одно из предложенных решений заключалось в том, что им просто нужно было бы зафиксировать все локально, прежде чем делать make, так что у них есть «чистый лист», из которого они затем должны будут клонировать, чтобы фактически выполнить сборку. Это было выброшено как (а) слишком много шаги, и (б) нежелание портить историю кучей «пора создавать сейчас» ревизий.

Кто-то еще предложил, чтобы весь мусор просто фиксировался в репозитории Mercurial. Я категорически против этого, потому что в следующий раз эти файлы появятся как «измененные» и, следовательно, будут включены в список файлов набора изменений.

Мы не можем быть единственными, кто столкнулся с этой проблемой. Так какое же «правильное» решение? Наш единственный выход - попытаться создать очень интеллектуальный .hginore файл? Это беспокоит меня, потому что если я скажу Mercurial «игнорировать все в этом каталоге, о котором я вам еще не говорил», то что произойдет, если следующий примененный патч добавит файлы в этот игнорируемый каталог? (Mercurial никогда не увидит этот новый файл, верно?)

Надеюсь, это не совсем глупый вопрос с очевидным ответом. Я уже много раз компилировал что-то из исходников, но мне никогда не приходилось применять контроль версий поверх этого. К тому же мы новички в Mercurial.


person JNeefer    schedule 15.09.2009    source источник
comment
Вы упоминаете Apache и PHP, вызывающие множество ошибок - вносите ли вы изменения в те пакеты, которые необходимо зарегистрировать?   -  person Will Bickford    schedule 16.09.2009
comment
Понятия не имею, это вне моей компетенции. Что-то о какой-то настраиваемой библиотеке или что-то подобное, чтобы приложение могло взаимодействовать с более низким уровнем системы, или о каком-то волшебном вуду в этом роде. Мне было поручено выяснить, как заставить вещи работать в Mercurial, и я наткнулся на этот беспорядочный сбой при сборке, преследуя это. Спасибо.   -  person JNeefer    schedule 16.09.2009
comment
Что вас так беспокоит в .hgignore? Он существует по этой причине   -  person basszero    schedule 16.09.2009
comment
О, у меня вообще нет проблем с .hgignore - я просто очень осторожен и хотел бы знать все мои варианты, и поэтому хотел знать, как другие люди решают эту проблему. Я не хочу, чтобы в .hgignore случайно появилось чрезмерное RegExp, из-за которого важные вещи (которые могут быть добавлены позже в обновлении пакета) не будут замечены и, следовательно, не будут добавлены, так что, когда кто-то пытается проверьте это, он не будет собираться / работать должным образом. (Ну, это работает на МОЕЙ машине! Найти нелегко ... По крайней мере, по моему опыту.)   -  person JNeefer    schedule 16.09.2009
comment
JNeefer, мне просто любопытно? Почему вам пришлось поместить исходный код проекта с открытым исходным кодом в свой проект? Не могли бы вы просто скомпилировать двоичные файлы и поместить их в свой исходный код? Просто пытаюсь узнать здесь что-то новое. Сет   -  person Seth Spearman    schedule 19.07.2010
comment
@JNeefer сработало ли решение Мартина (или любое другое) для вас? Если да, вам следует зайти и отметить лучший ответ как принятый.   -  person Chris R    schedule 19.07.2010
comment
@Seth - Им не нравится, когда здесь скомпилированы двоичные файлы, им нужен исходный код, поэтому они знают, из чего был создан двоичный файл, и имеют его, если им потребуется перекомпилировать с другими параметрами.   -  person JNeefer    schedule 07.10.2010
comment
@Chris - Решение, которое в конечном итоге было реализовано, представляло собой двухуровневую структуру Mercurial (3 уровня, если считать удаленного мастера), в которой есть первичный локальный клон, в котором выполняется работа, а затем этот субклонируется, а сборка выполняется во второй копии. Это действительно требует, чтобы работа была зафиксирована локально, чтобы ее мог подхватить субклон, но он выполняет свою работу. (Я лично также использую расширение коллапса для Mercurial, поэтому, когда я закончу, я могу объединить все мои локальные коммиты в один набор изменений, чтобы вернуться на главный сервер.)   -  person JNeefer    schedule 07.10.2010


Ответы (6)


Два варианта:

  1. Наилучший вариант - сделать сборку вне дерева, если можете. Это сборка, в которой объектные файлы размещаются вне дерева исходных текстов. Некоторые системы сборки, такие как CMake, поддерживают это напрямую. Что касается других систем, вам нужно быть удачливым, так как апстрим-проект должен был добавить поддержку для этого в своих Makefile или аналогичных.

  2. Более общий вариант - указать Mercurial игнорировать определенные типы файлов, а не целые каталоги. По моему опыту, это хорошо работает.

Чтобы проверить второй вариант, я хотел скомпилировать Apache. Однако для этого требуется APR, поэтому я протестировал его. После проверки в чистом apr-1.3.8.tar.bz2 я сделал ./configure; make и посмотрел на результат hg status. Первые несколько узоров были легкими:

syntax: glob

*~
*.o
*.lo
*.la
*.so
.libs/*

Остальные новые файлы выглядят так, как будто они являются конкретными файлами, созданными в процессе сборки. Их тоже легко добавить:

% hg status --unknown --no-status >> .hgignore

Это также добавило .hgignore, поскольку я еще не запланировал его добавление. Удалив это, я получил этот .hgignore файл:

syntax: glob

*~
*.o
*.lo
*.la
*.so
.libs/*
.make.dirs
Makefile
apr-1-config
apr-config.out
apr.exp
apr.pc
build/apr_rules.mk
build/apr_rules.out
build/pkg/pkginfo
config.log
config.nice
config.status
export_vars.c
exports.c
include/apr.h
include/arch/unix/apr_private.h
libtool
test/Makefile
test/internal/Makefile

Я считаю, что это довольно надежный способ сделать это в Mercurial или любой другой системе контроля версий, если на то пошло.

person Martin Geisler    schedule 16.09.2009
comment
Мартин, это именно то, что нужно. Я не думал, что спецификации полного пути работают (а документ .hgignore немного расплывчат по этому вопросу), но он явно работает, по крайней мере, с Hg 1.3.1. JNeefer, это ваше решение! - person Chris R; 16.09.2009
comment
Крис Р: Да, .hgignore документация немного тонкая. Я думаю, что ключевой частью является это предложение: например, предположим, что у нас есть неотслеживаемый файл file.c в a/b/file.c внутри нашего репозитория. Mercurial проигнорирует file.c, если какой-либо шаблон в .hgignore совпадает с a/b/file.c, a/b или a. (из selenic.com/mercurial/hgignore.5.html) - person Martin Geisler; 17.09.2009
comment
Спасибо за детальную работу и показ здесь результатов - отличный ответ, заслуживающий галочки, imho. - person tex; 02.10.2010

Лучшим решением было бы исправить процесс сборки, чтобы он вел себя «хорошо», а именно позволял вам указать какой-то отдельный каталог для хранения промежуточных файлов (который затем можно было бы полностью игнорировать с помощью очень простой записи .hgignore. .. или даже не в структуре каталогов с контролем версий.

person Amber    schedule 15.09.2009
comment
См. Мой комментарий к Уиллу ниже. Мы не поддерживаем процесс сборки программного обеспечения с открытым исходным кодом, вызывающего проблему. Поэтому, хотя технически мы могли решить проблему, на самом деле не идеально делать (и поддерживать) такие модификации таких вещей, как apache или php ...: - / - person JNeefer; 16.09.2009

Как бы то ни было, я обнаружил, что в этой ситуации умный .hgignore - единственное решение, которое до сих пор работало для меня. Благодаря включению поддержки регулярных выражений это очень мощно, но также и сложно, поскольку шаблон, который не работает в одном каталоге, вполне может быть источником в другом.

По крайней мере, вы можете зайти в .hgignore и поделиться им со своими разработчиками. Таким образом, работа выполняется только один раз.

[Edit] По крайней мере, однако, возможно - как отмечал выше Мартин Гейслер - указать полный путь в вашем файле .hgignore; вы можете, следовательно, иметь test/Makefile в .hgignore, но Mercurial по-прежнему будет замечать новый test2/Makefile

Его процесс создания файла должен дать вам почти то, что вы хотите, и вы можете настроить это оттуда.

person Chris R    schedule 15.09.2009
comment
В этом и заключается проблема (шаблоны для сопоставления мусора в одном каталоге будут соответствовать вещам, которые являются источником в другом каталоге). Но помимо этой простой проблемы есть чистое количество хлама. Текущий статус hg | wc -l (в каталоге, который не внес изменений и выполнил одну сборку) показывает более 7500 отдельных фрагментов разброса на 4 уровня. Мне нужно найти способ уберечь эту ерунду от регистрации и при этом не потерять новые вещи / изменения, которые появятся вместе с обновлениями пакетов. Арг! - person JNeefer; 16.09.2009

Один из вариантов - очистить рабочий каталог после проверки сборки.

make clean
hg status

Конечно, вы можете не захотеть очищать свой проект, если на его сборку уходит больше нескольких минут.

person Will Bickford    schedule 15.09.2009
comment
Проблема не в нашем собственном программном обеспечении. Он красиво строится и изолирует любой мусор. Проблема заключается в том, что пакеты происходят не из нашего источника. Как только я буду поддерживать такие вещи, как apache и php, чтобы сделать их «make clean» на самом деле «чистыми», тогда 75% моей проблемы будут решены. Но поскольку они создают хлам, я застрял. (И да, на создание проекта уходит больше «нескольких» минут. - person JNeefer; 16.09.2009

Если файлы, которые вы хотите отслеживать, уже известны hg, вы можете игнорировать все. Затем вам нужно использовать hg import для добавления патча, а не просто использовать команду patch (поскольку hg нужно знать, нужно ли отслеживать какие-то новые файлы).

person tonfa    schedule 15.09.2009
comment
Хм ... Звучит многообещающе! Я прочитаю Mercurial «импорт» по сравнению с «патчем» и посмотрю, является ли это работоспособным решением для этой ситуации. Я опубликую продолжение, когда узнаю больше. Спасибо! - person JNeefer; 16.09.2009
comment
Хорошо, я сейчас нахожусь на пути к Mercurial Queues, это то, что вы имели в виду? Первая страница 12 главы книги О'Рейли о Mercurial описывает часть моей проблемы: у вас есть исходное дерево «восходящего потока», которое вы не можете изменить; вам нужно внести некоторые локальные изменения в верхнее дерево восходящего потока; и вы хотели бы иметь возможность хранить эти изменения отдельно, чтобы вы могли применять их к более новым версиям исходного кода. Так является мысль, что, используя этот другой способ управления файлами / изменениями (hg import?), Мусор может оставаться в рабочем каталоге, имея ВСЕ рабочий каталог .hgignore'd? - person JNeefer; 16.09.2009

Как насчет сценария оболочки (или любого другого), который рекурсивно просматривает ваш каталог сборки, находит каждый файл, созданный после запуска процесса сборки, и перемещает все эти файлы (конечно, вы можете указать исключения) в подкаталог cruft_dir. Тогда вы можете просто поместить cruft_dir/* в .hgignore.

РЕДАКТИРОВАТЬ: я забыл добавить, но это довольно очевидно, что этот сценарий оболочки запускается автоматически, как только ваша сборка завершается. Возможно, она даже вызывается последней командой в вашем файле Makefile / ant / any.

person Yawar    schedule 17.09.2009