Mercurial: получать измененные файлы из ревизии? - PullRequest
2 голосов
/ 13 ноября 2010

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

Что мне делать?

Спасибо

Ответы [ 3 ]

4 голосов
/ 13 ноября 2010

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

Затем вы должны использовать hg status, чтобы показать имена файлов, которые были изменениями. Обычно вы используете hg status, чтобы увидеть, какие файлы являются изменениями по сравнению с родительской версией рабочей копии, но вы можете передать --rev в статус, чтобы увидеть изменения между любыми двумя ревизиями!

Так что используйте

$ hg status --change tip

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

 $ hg pull
 $ hg status --rev .:tip

, чтобы увидеть, какие файлы будут изменены, когда вы выполните hg update после извлечения. Обновление перенесет вас из текущего родительского рабочего каталога, обозначенного ., в tip, при условии, что вы находитесь в той же названной ветви, что и tip. В противном случае hg update приведет вас к самому лучшему набору изменений в вашей текущей ветке.

2 голосов
/ 13 ноября 2010

Вы можете использовать шаблон для hg log или hg tip для получения всех имен файлов:

hg tip --template '{files}'

или для получения, например, всех файлов, измененных / добавленных / измененных набором изменений 5:

 hg log -r5  --template '{files}'

Вы можете прочитать больше о шаблонах Mercurial: полное руководство, Глава 11. Настройка вывода Mercurial или краткая справка с помощью hg help templating`

Если вы хотите что-то сделатьк файлам, например, через grep:

hg tip --template '{files}' | xargs grep foo  

Осторожно, это приведет к разрыву с именами файлов, содержащими пробелы!

Для обработки всех видов имен файлов требуется нечто более сложное (спасибо mg на #mercurial за подсказку):

Нам нужны многострочные стили для этого предположения, что файл с именем zerosep содержит:

changeset = "{files}"
file = "{file}\0"

Затем вы можете использовать это для создания \0 отдельного списка имен файлов и обработки его с помощью xargs -0:

hg tip --style zerosep | xargs -0 grep foo

Информацию о том, как это работает, можно найти в: Вывод списка файлов в несколько строк

1 голос
/ 13 ноября 2010

У Мартина есть правильный способ получить список того, какие файлы изменились в ревизии, и я проголосовал за его ответ, но просто для того, чтобы объяснить, почему ваш вопрос немного не так:

В Mercurial каждая локация имеет полную копию со всеми изменениями. Если вы собираетесь использовать Mercurial для развертывания на своем сервере, вам придется клонировать все на свой сервер - один раз. После этого push / pull будут перемещаться только по (сжатым) наборам изменений, которых у сервера еще нет.

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

Лично у меня все в порядке с полной историей на моих серверах, и просто делаю hg pull ; hg update на сервере для каждого нового развертывания. Это аккуратно и эффективно.

...