Mercurial Subrepositories: предотвращает случайные рекурсивные коммиты и толчки - PullRequest
16 голосов
/ 01 февраля 2011

Я работаю в команде, в которой у нас есть код в ртутном репозитории с несколькими вложенными репозиториями:

main/
main/subrepo1/
main/subrepo1/subrepo2/

Поведение Mercurial по умолчанию состоит в том, что когда hg commit выполняется в "main", любые ожидающие изменения в подпозитариях "subrepo1" и "subrepo2" также будут зафиксированы. Аналогичным образом, при нажатии «main» любые исходящие коммиты в «subrepo1» и «subrepo2» также будут отправлены.

Мы обнаруживаем, что люди часто непреднамеренно фиксируют и отправляют изменения в свои подпапки (потому что они забыли, что внесли изменения, и hg status по умолчанию не показывает рекурсивные изменения). Мы также обнаруживаем, что такие глобальные коммиты / толчки почти всегда случайны в нашей команде.

Mercurial 1.7 недавно улучшил ситуацию с hg status -S и hg outgoing -S, которые показывают изменения в под-репозиториях; но тем не менее, это требует, чтобы люди обращали внимание.

Есть ли способ в Mercurial прервать hg commit и hg push, если есть изменения / коммиты в суб-репозиториях, которые в противном случае были бы зафиксированы / выдвинуты?

Ответы [ 5 ]

9 голосов
/ 04 августа 2011

Начиная с Mercurial 1.8 есть параметр конфигурации, который отключает рекурсивные фиксации .В родительских репозиториях .hg/hgrc вы можете добавить:

[ui]
commitsubrepos = no

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

8 голосов
/ 23 ноября 2011

Mercurial 2.0 автоматически запрещает вам фиксировать вложенные репозитории, если вы вручную не зададите аргумент --subrepos (или, альтернативно, -S) для commit.

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

# hg commit -m 'change main repo'
abort: uncommitted changes in subrepo hello
(use --subrepos for recursive commit)

Вы можете успешно выполнить фиксацию, добавив --subrepos к команде:

# hg commit --subrepos -m 'commit subrepos'
committing subrepository hello

С некоторыми вещами, которые следует соблюдать осторожность: если вы изменили ревизию , в которой в настоящее время находится под-репозиторий, но не содержимое под-репозитория, Mercurial с радостью подтвердит изменение версии без флага --subrepos. Кроме того, рекурсивные нажатия по-прежнему выполняются без предупреждения.

4 голосов
/ 01 февраля 2011

Одной из идей является использование URL-адресов, к которым у вас есть доступ только для чтения, в ваших .hgsub файлах.Затем, когда вы действительно хотите вставить подпункт, вы можете просто перейти в него и выполнить команду hg push THE_READ_WRITE_URL.

.
3 голосов
/ 01 февраля 2011

Одно из возможных решений, использующее идею VonC «pre-commit».

Установка двух скриптов;первый check_subrepo_commit.sh:

#!/bin/bash

# If the environment variable "SUBREPO" is set, allow changes.
[ "x$SUBREPO" != "x" ] && exit 0

# Otherwise, ensure that subrepositories have not changed.
LOCAL_CHANGES=`hg status -a -m`
GLOBAL_CHANGES=`hg status -S -a -m`
if [ "x${LOCAL_CHANGES}" != "x$GLOBAL_CHANGES" ]; then
    echo "Subrepository changes exist!"
    exit 1
fi
exit 0

второй, check_subrepo_push.sh:

#!/bin/bash

# If the environment variable "SUBREPO" is set, allow changes.
[ "x$SUBREPO" != "x" ] && exit 0

# Otherwise, ensure that subrepositories have not changed.
LOCAL_CHANGES=`hg outgoing | grep '^changeset:'`
GLOBAL_CHANGES=`hg outgoing -S | grep '^changeset:'`
if [ "x${LOCAL_CHANGES}" != "x$GLOBAL_CHANGES" ]; then
    echo "Global changes exist!"
    exit 1
fi
exit 0

Добавьте к своему .hgrc следующее:

[hooks]
pre-commit.subrepo = check_subrepo_commit.sh
pre-push.subrepo = check_subrepo_push.sh

Byпо умолчанию hg push и hg commit будут прерваны, если в под-репозиториях имеются ожидающие изменения.Выполнение такой команды:

SUBREPO=1 hg commit

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

2 голосов
/ 01 февраля 2011

Может быть хук pre-commit ( не precommit) может сделать для вас hg status -S и заблокировать коммит, если он обнаружит какие-либо изменения?

...