2011-05-26 2 views
1

Недавно наш проект переключился с SVN на Mercurial. В SVN, чтобы обновить наши файлы css/js, мы получаем последнюю измененную версию из каталога, в котором они проживают, и использовать его в качестве префикса для упакованных имен файлов.Получить все измененные файлы для данного каталога в филиале

Мы хотим использовать тот же метод в Mercurial. К сожалению, кажется, проще сказать, чем сделать, хотя это может быть вызвано нашим методом ветвления.

В двух словах у нас есть главная ветка (ствол). Каждые пару недель мы отправляемся из ствола, чтобы создать бета-версию продукта, которая в конечном итоге будет объединена в нашу прямую ветку.

Теперь на данный момент, мы, по существу, используя

hg log -b live some_folder/js 
hg log -b live some_folder/css 

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

Проблема, с которой мы сталкиваемся, заключается в том, что наши смены изменений не обнаруживаются с помощью этого метода. Поэтому, если мы объединимся в наборе изменений, который изменяет файл в some_folder/css, hg не считает его измененным, так как файл не был изменен в наборе изменений слияния, а в одном из смену, который объединяется.

Мы также попробовали revsets, чтобы попытаться разобрать журналы, но похоже, что у них такая же проблема. Единственный способ получить рт.ст. войти в список тех файлов, как измененное, кажется, использовать --stat вариант, но

hg log -b live --stat some_folder/css 

не показывает ни ревизии.

Я в точке, где я рассматриваю только с помощью

hg log -b live --stat 

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

Любые идеи относительно лучшего способа решения моей проблемы?

+0

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

+0

Мы просто хотим изменить номер версии, если файл был изменен в нашей прямой ветке. Иногда мы выталкиваем горячие исправления, которые вообще не изменяют css/js, и мы предпочли бы, чтобы нашим пользователям не пришлось загружать файлы снова без причины. –

ответ

0

В конце концов, не было простого способа сделать это, поэтому я прибегал к следующему методу: Захватите все журналы для филиала за последние x дней. Итерации по всем этим журналам с помощью команды stat и остановка первой ревизии, которая влияет на данную ветку.Если ни один из этих диапазонов дат не влияет на данный путь, возьмите следующие лог-файлы за следующие дни. Итак:

hg log -b live -r "reverse(date('2011-05-12 to 2011-05-26'))" --template "{node} " 

Тогда для каждой ревизией

hg st --change <the_changeset> -I "some_folder/css" 

Когда возвращается Отсутствует пустое значение, я остановить цикл и возвращает идентификатор набора изменений. Надеемся, что в какой-то момент revsets будут поддерживать повторение через сложенные изменения.

2

Я предостерег бы этот ответ, заявив, что на данный момент у меня нет Mercurial на этом ПК, поэтому не могу проверить команды, но он может по крайней мере указывать вам в полезном (?) Направлении.

Вы можете использовать hg status указав опцию --rev, чтобы получить список изменений между двумя версиями, поэтому с помощью пересмотра обозначений, вы могли бы сделать следующее:

hg status -b live --rev -2:-1 some_folder/css 

В теории (вот где я получаю вещи очень неверно :)), варианты означают:

--rev -2:-1 выбирает родительский элемент рабочего каталога (я предполагаю, что вы все равно останетесь после слияния) и сравнивает его со своим родителем (-2). Указав -b live, мы надеемся выбрать родителя в этой ветке, но, как я уже сказал, я не могу проверить это прямо сейчас.

Смежные вопросы