В любом случае, автоматически объединить или объединить hgtags (Mercurial)?

Мы пытаемся запустить задание chron, которое автоматически преобразует отдельные модули CVS в ртутные модули и, наконец, объединяет эти преобразованные ртутные модули в одно ртутное хранилище.

Я пытался найти способы автоматического слияния.hgtags (из преобразованных репозиториев hg) без запроса окна пользователя (таким образом, использование в задании chron).

Есть ли способ сообщить mercurial при использовании hg merge, чтобы просто взять локальный файл и добавить его во входящий файл?

спасибо за любую информацию или любые предложения

5 ответов

Да, вы можете настроить инструмент слияния, как описывает Кртек. Я только что попробовал, и это работает:

[merge-tools]
merge-tags.executable = cat
merge-tags.args = $local $other | sort -u >> $output

[merge-patterns]
.hgtags = merge-tags

Поместите это в свой .hg/hgrc файл на сервере и будущие слияния будут просто добавлять теги. Что происходит то hg merge выполнит

cat /tmp/hgtags.local /tmp/hgtags.other | sort -u >> .hgtags

где первый аргумент cat это локальная версия .hgtags файл, а второй аргумент - это версия, с которой вы сливаетесь.

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

Это моя тестовая сессия. Я начинаю с создания хранилища с двумя головами:

$ hg init
$ echo a > a.txt
$ hg add a.txt
$ hg commit -m a
$ echo b > b.txt
$ hg add b.txt
$ hg commit -m b
$ hg tag b
$ hg update 0
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
$ echo c > c.txt
$ hg add c.txt
$ hg commit -m c
created new head           
$ hg tag c

Ветви видны в выходных данных расширения графа:

@  changeset:   4:54c5397a23a4
|  tag:         tip
|  user:        Martin Geisler <mg@aragost.com>
|  date:        Wed Mar 02 11:45:20 2011 +0100
|  summary:     Added tag c for changeset aff5fe9be7d9
|
o  changeset:   3:aff5fe9be7d9
|  tag:         c
|  parent:      0:0db5fae8b6cc
|  user:        Martin Geisler <mg@aragost.com>
|  date:        Wed Mar 02 11:45:17 2011 +0100
|  summary:     c
|
| o  changeset:   2:a9af8514a64e
| |  user:        Martin Geisler <mg@aragost.com>
| |  date:        Wed Mar 02 11:45:02 2011 +0100
| |  summary:     Added tag b for changeset 0518533f37f6
| |
| o  changeset:   1:0518533f37f6
|/   tag:         b
|    user:        Martin Geisler <mg@aragost.com>
|    date:        Wed Mar 02 11:44:44 2011 +0100
|    summary:     b
|
o  changeset:   0:0db5fae8b6cc
   user:        Martin Geisler <mg@aragost.com>
   date:        Wed Mar 02 11:44:33 2011 +0100
   summary:     a

Существует конфликт в .hgtags файл:

$ hg cat -r 2 .hgtags
0518533f37f6f37edbea5b46d9af2192f69ddecd b
$ hg cat -r 4 .hgtags
aff5fe9be7d9b021e55dfb522b29fd03cbcf5cb7 c

но объединение все еще неинтерактивно:

$ hg merge
merging .hgtags
1 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

Вы можете увидеть, как файлы были добавлены:

$ cat .hgtags
aff5fe9be7d9b021e55dfb522b29fd03cbcf5cb7 c
0518533f37f6f37edbea5b46d9af2192f69ddecd b

sort -mu дал мне то, что я хочу. Эта команда не сортирует, но удаляет дубликаты.

sort -u время взлома заказа.

Оконная подсказка появится только в том случае, если в вашем файле.hgtags возник конфликт, что должно быть довольно редко. Тем не менее, вот, возможно, идея, которая будет работать.

Mercurial позволяет использовать инструмент слияния, отличный от внутреннего, для получения дополнительной информации см. Раздел MergeToolConfiguration. Вы также можете изменить mergetool через командную строку с помощью --tool вариант (см. hg merge --help).

Может быть, вы можете написать небольшую программу, которая будет служить специальным инструментом слияния для.hgtags, которые будут делать именно то, что вы хотите, т.е. добавлять локальный файл во входящий файл. Затем вы можете изменить свой hgrc для использования этого нового инструмента при объединении.hgtags.

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

Вот простой инструмент слияния в Python. Он также пытается сохранить существующий порядок строк в файле.hgtags.

Применяются те же предостережения, что и в ответе Мартина.

import sys
from heapq import merge

local = sys.argv[1]
other = sys.argv[2]
output = sys.argv[3]

merged_tags = merge(file(local).readlines(), file(other).readlines())

unique_tags = []
for tag in merged_tags:
    if tag not in unique_tags:
        unique_tags.append(tag)

file(output, 'w').writelines(unique_tags)

Предложение в /questions/29243935/kak-avtomaticheski-obedinithgtags-v-mercurial/29243950#29243950:

hgtags.merge.template: changeset = "{tags}" tag = "{узел} {тег} \ n"

[merge-tools] hgtags.executable = hg hgtags.args = log -r "tagged ()" --style hgtags.merge.template> $ output hgtags.premerge = False

[merge-pattern] .hgtags = hgtags

работает для нас.

Другие вопросы по тегам