17

我在一个团队工作,我们在一个带有多个子存储库的 mercurial 存储库中有一个代码:

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

Mercurial 的默认行为是,当hg commit在“main”中执行 a 时,子存储库“subrepo1”和“subrepo2”中的任何未完成的更改也将被提交。同样,当“main”被推送时,“subrepo1”和“subrepo2”中的任何传出提交也将被推送。

我们发现人们经常不经意地在他们的子存储库中提交和推送更改(因为他们忘记了自己进行了更改,并且hg status默认情况下不显示递归更改)。我们还发现,这种全局提交/推送在我们的团队中几乎总是偶然的。

hg status -SMercurial 1.7 最近使用和改善了这种情况hg outgoing -S,显示了子存储库的变化;但是,这仍然需要人们注意。

如果子存储库中有更改/提交,否则会被提交/推送,Mercurial 有没有办法进行hg commit和中止?hg push

4

5 回答 5

11

从 Mercurial 1.8 开始,有一个禁用递归提交的配置设置。在父存储库.hg/hgrc中,您可以添加:

[ui]
commitsubrepos = no

如果父存储库中的提交在子存储库中发现未提交的更改,则整个提交将被中止,而不是静默提交子存储库。

于 2011-08-04T13:31:30.263 回答
9

Mercurial 2.0 会自动阻止您提交子存储库,除非您--subrepos手动-Scommit.

例如,您尝试在子存储库中有待处理更改时执行提交,您会收到以下消息:

# 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标志的版本更改。此外,递归推送仍然在没有警告的情况下执行。

于 2011-11-23T00:01:56.387 回答
4

.hgsub一种方法是使用您在文件中具有只读访问权限的 URL 。然后,当您确实想推入子存储库时,您只需 cd 进入它并执行hg push THE_READ_WRITE_URL.

于 2011-01-31T23:00:27.213 回答
3

一种可能的解决方案,使用 VonC 的“预提交”想法。

设置两个脚本;第一个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

默认情况下,如果子存储库中有未完成的更改hg pushhg commit则会中止。像这样运行命令:

SUBREPO=1 hg commit

将覆盖检查,如果您真的愿意,允许您执行全局提交/推送。

于 2011-01-31T23:12:59.387 回答
2

可能是一个pre-commit钩子(不是precommit)可以hg status -S为你做的,如果它检测到任何变化就阻止提交?

于 2011-01-31T22:50:01.793 回答