В любом случае, автоматически объединить или объединить hgtags (Mercurial)? - PullRequest
6 голосов
/ 01 марта 2011

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

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

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

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

Ответы [ 5 ]

8 голосов
/ 02 марта 2011

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

[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

Ветви видны в выводе из расширения graphlog :

@  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
3 голосов
/ 08 октября 2012

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

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

2 голосов
/ 01 марта 2011

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

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

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

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

1 голос
/ 24 ноября 2011

Вот простой инструмент слияния в 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)
0 голосов
/ 20 марта 2013

Предложение в https://stackoverflow.com/a/9783478/1183010:

hgtags.merge.template: changeset = "{tags}" tag = "{node} {tag} \ n"

[инструменты слияния] hgtags.executable = hg hgtags.args = log -r "tagged ()" --style hgtags.merge.template> $ output hgtags.premerge = False

[шаблоны слияния] .hgtags = hgtags

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

...