dav*_*idg 17 version-control mercurial dvcs mercurial-subrepos
我在一个团队工作,我们在一个包含多个子库的mercurial存储库中有一个代码:
main/
main/subrepo1/
main/subrepo1/subrepo2/
Run Code Online (Sandbox Code Playgroud)
Mercurial的默认行为是,当hg commit在"main"中执行a时,子存储库"subrepo1"和"subrepo2"中的任何未完成的更改也将被提交.类似地,当按下"main"时,也会推送"subrepo1"和"subrepo2"中的任何传出提交.
我们发现人们经常无意中提交并推送其子库中的更改(因为他们忘记了他们已经进行了更改,并且hg status默认情况下不会显示递归更改).我们还发现,在我们的团队中,这样的全球提交/推送几乎总是偶然的.
Mercurial 1.7最近用hg status -S和改善了情况hg outgoing -S,显示了子库存的变化; 但是,这仍然需要人们关注.
如果子目录中的更改/提交原本会被提交/推送,那么Mercurial是否有办法制作hg commit和hg push中止?
从Mercurial 1.8开始,有一个禁用递归提交的配置设置.在父存储库中,.hg/hgrc您可以添加:
[ui]
commitsubrepos = no
Run Code Online (Sandbox Code Playgroud)
如果父存储库中的提交在子存储库中发现未提交的更改,则整个提交将中止,而不是以静默方式提交子存储库.
除非您手动指定--subrepos(或替代-S)参数,否则Mercurial 2.0会自动阻止您提交子存储库commit.
例如,您尝试在子库中存在挂起更改时执行提交,您将收到以下消息:
# hg commit -m 'change main repo'
abort: uncommitted changes in subrepo hello
(use --subrepos for recursive commit)
Run Code Online (Sandbox Code Playgroud)
但是,您可以通过添加--subrepos命令成功执行提交:
# hg commit --subrepos -m 'commit subrepos'
committing subrepository hello
Run Code Online (Sandbox Code Playgroud)
有些事情需要注意:如果您更改了子存储库当前所在的版本,而不是子存储库的内容,Mercurial将很乐意提交没有该--subrepos标志的版本更改.此外,仍然在没有警告的情况下执行递归推送.