Mercurial - как я могу создать a.zip файлов, измененных между двумя версиями?

У меня есть личный репозиторий Mercurial отслеживает некоторые изменения, над которыми я работаю. Я хотел бы поделиться этими изменениями с сотрудником, однако у них нет/не может быть Mercurial, поэтому мне нужно отправить весь набор файлов, и сотрудник объединится с их стороны. Я ищу способ извлечь "подсказку" версии подмножества файлов, которые были изменены между двумя номерами версий. Есть ли способ легко сделать это в Mercurial?

добавление баунти - Это все еще боль. Мы часто работаем с внутренними "клиентами", которые принимают наши выпуски исходного кода как a .zip, и тестирование небольшого исправления легче распространять как .zip overlay чем как патч (так как мы часто не знаем состояния их файлов).

9 ответов


лучший сценарий - оказать надлежащее давление на этих людей, чтобы получить Mercurial, но за исключением этого, патч, вероятно, лучше, чем сжатый набор файлов, так как патч будет отслеживать удаления и переименования. Если вы все еще хотите zip-файл, я написал короткий скрипт, который создает zip-файл:

import os, subprocess, sys
from zipfile import ZipFile, ZIP_DEFLATED

def main(revfrom, revto, destination, *args):
    root, err = getoutput("hg root")
    if "no Merurial repository" in err:
        print "This script must be run from within an Hg repository"
        return
    root = root.strip()

    filelist, _ = getoutput("hg status --rev %s:%s" % (revfrom, revto))
    paths = []

    for line in filelist.split('\n'):
        try:
            (status, path) = line.split(' ', 1)
        except ValueError:
            continue
        if status != 'D':
            paths.append(path)

    if len(paths) < 1:
        print "No changed files could be found."
        return

    z = ZipFile(destination, "w", ZIP_DEFLATED)
    os.chdir(root)
    for path in paths:
        z.write(path)
    z.close()

    print "Done."


def getoutput(cmd):
    p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    return p.communicate()


if __name__ == '__main__':
    main(*sys.argv[1:])

использование будет nameofscript.py fromrevision назначения torevision. Е. Г., nameofscript.py 45 51 c:\updates.zip

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

Примечание: это должно выполняться из рабочего каталога в репозитории.


хорошо. hg export $base:tip > patch.diff будет производить стандартный файл Patch, доступно для большинства инструментов.

в частности, GNU patch команда может применить весь патч к предыдущим файлам. Разве этого недостаточно? Я не вижу, зачем вам нужен набор файлов: для меня, применение патча, кажется, проще, чем извлечение файлов из ZIP и скопировать их в нужное место. плюс, если у вашего сотрудника есть локальные изменения, вы их перезапишете. Вы не используете контроль версий инструмент, чтобы прямо заставить другого человека слиться вручную изменения, верно? Пусть patch бороться с этим, честно :)


в UNIX это можно сделать с помощью:

hg status --rev 1 --rev 2 -m -a -n | xargs zip changes.zip

Я также внес расширение, см. расширение hgexportfiles на bitbucket для получения дополнительной информации. Расширение export files работает с заданной редакцией или диапазоном ревизий и создает набор измененных файлов в указанном каталоге. Это легко zip каталог как часть сценария.


насколько мне известно, для этого нет удобного инструмента (хотя плагин mercurial может быть выполнимым). Вы can экспорт исправления для набора файлов с помощью hg export from:to (откуда и выявить изменения.) Если вам действительно нужны все файлы, как видно на подсказке, вы, вероятно, могли бы взломать что-то вместе на основе вывода hg diff --stat -r from:to, который выводит список файлов с аннотациями о том, сколько строк было изменено, например:

 ...
 src/test/scala/RegressionTest.scala                        |  25 +++++++++++++----------
 src/test/scala/SLDTest.scala                               |   2 +-
 15 files changed, 111 insertions(+), 143 deletions(-)

если ни один из ваших файлов содержащие пробелы или специальные символы в их именах, вы можете использовать что-то вроде:

hg diff -r156:159 --stat | head - --lines=-1 | sed 's!|.*$!!' | xargs zip ../diffed.zip

Я оставлю дело со специальными символами в качестве упражнения для читателя ;)


вот маленький bash скрипт, который будет делать работу, по крайней мере, если вы работаете в среде Linux. Это не имеет абсолютно никаких проверок, что так когда-либо и, скорее всего, сломается, когда вы переместили файл, но это начало.

:
zipChanges.sh REVISION REPOSITORY DESTINATION
zipChanges.sh 3 /home/hg/repo /home/hg/files.tgz

код:

#!/bin/sh
REV=
SRC_REPO=
DST_ZIP=

cd $SRC_REPO
FILES=$(hg status --rev  $SRC_REPO | cut -c3-)

IFS=$'\n'
FILENAMES=""
for line in ${FILES}
do
    FILENAMES=$FILENAMES" \""$SRC_REPO"/"$line"\""
done

CMD="tar czf \"$DST_ZIP\" $FILENAMES"

eval $CMD

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

http://www.simianenterprises.co.uk/blog/mercurial-export-changed-files-80.html

хотя это не позволяет вам выбрать конечную ревизию на данный момент, было бы очень легко добавьте это при использовании источника, однако перед извлечением файлов вам придется вручную обновить целевую ревизию. При необходимости вы можете даже Мод его, чтобы создать zip вместо папки файлов (что также приятно и легко вручную zip)

надеюсь, это поможет вам или кому-либо еще, кто хочет эту функцию.


Я только что внес расширение здесь https://sites.google.com/site/alessandronegrin/pack-mercurial-extension


недавно я столкнулся с этой проблемой. Мое решение:

hg update null
hg debugsetparents (starting revision)
hg update (ending revision)

это приведет к удалению всех отслеживаемых файлов, которые не были изменены между этими двумя версиями. Вам придется удалить все неотслеживаемые файлы самостоятельно. После этого, местное отделение будет находиться в несогласованном состоянии; вы можете исправить это, выполнив hg debugrebuildstate (или просто удаление локальной ветви, если она вам больше не нужна).