在保留文件的同时切换hg中的分支

时间:2013-03-03 21:11:09

标签: mercurial branch

在开发我的软件时,我创建了一组测试用例,可以通过make tests自动完成。为了保持井井有条,我将它们放在子目录tests中。为了保持我的提交井然有序,而不是让我的开发分支混乱,我创建了一个额外的分支tests,我提交了测试单元。

我的问题是:当我将单元提交到测试分支并切换回开发时,表示测试被删除

D:\Project>hg branch test
D:\Project>edit...
D:\Project>hg add
D:\Project>hg commit
D:\Project>hg up dev
2 files updated, 0 files merged, 3 files removed, 0 files unresolved

我如何保存这些文件? (我尝试了Mercurial: Switch working directory to branch without losing changes?的解决方案,但它仍然删除了文件)

编辑请参阅下面我自己的答案

3 个答案:

答案 0 :(得分:4)

这些测试文件在开发分支中不存在,因此当您签出开发分支时,它们将不在工作目录中。像Mercurial和git这样的DVCS不允许您在一个修订/分支处检出一个目录,而在另一个修订/分支处检查另一个目录。

您链接的答案是将更改的文件和他们的文件放到另一个分支中,它们不是您要求的。

所以你想要的方式(单独的分支)不会起作用,但还有很多其他/更好的选择

一种选择是使您的测试成为由mq(Mercurial Queues)存储库管理的补丁,该存储库本身可以进行版本控制。然后,当您在开发分支中的某个位置并且想要运行您要执行的测试时:

hg qpush # tests show up
... run tests, edit tests ..
hg qrefresh  # save the changes you made to the test
hg qpop  # tests vanish again

MQ很强大,但有时候有点难以绕过你的脑袋。

另一种选择是将您的测试作为父存储库,将实际代码作为该父级的子存储库。您的磁盘布局如下所示:

parent/
   tests/
   existingrepo/   # <-- the repo you already have w/o tests

然后人们可以克隆,你可以推动现有的没有w / o测试,但外部回购将包括指向它的指针,两个将以锁步方式进行版本控制。再次,有点棘手,但有一些不错的结果。

第三个选项,我的偏好是克服“保持我的提交井井有条而不是混乱我的开发分支”的心态。测试与主代码一样重要,它们应该使用代码进行版本控制,并且它们不会混乱,它们提供了有价值的工具来帮助理解代码正在做什么。您可以随时使用hg log --exclude tests/查看在方便时将其排除的历史记录。

采取这种做法只是做:

hg update development
hg merge tests

你很高兴。

答案 1 :(得分:2)

  

当我将单元提交到测试分支并切换回开发时,表示测试被删除

预期和正确的结果:分支存储分歧的开发线,你在测试分支中add只有 ,在合并之前这个数据只存在于创建分支

为了“保持我的提交井然有序,不要让我的开发分支混乱...”,但是在开发分支中进行测试,你可以使用至少两种方式:

  • 定期将tests分支合并到development(测试中的所有更改都将显示在开发中),但仅将日志用于开发分支中的变更集,可能没有测试合并集 。它只是简单的revset,您甚至可以将带有revset的log命令写入别名并在需要时使用别名命令
  • 正如Ry4an所提到的,你可以代替分支 - 分离,使用subrepo | guestrepo技术执行存储库分离 - 如果测试存储在主repo的子目录中,将/ tests转换为嵌套存储库 - &gt;子存储库并有两个独立但链接的存储库(未来阅读:Mercurial wiki中的Subrepository和Mercurial Kick Start Exercises中的Subrepositories

答案 2 :(得分:0)

获得我想要的东西我最终创建了一个repo的子目录:

project/
  main.cpp
  makefile
  .repo/
    .hg/

并创建了一个新的make目标:

REPO := .repo

init: $(REPO) $(REPO)/.hg

$(REPO):
    mkdir -p $(REPO)

$(REPO)/.hg:
    hg init $(REPO)

commit : | $(REPO) $(REPO)/.hg
ifdef BRANCH
    hg -R $(REPO) update -C $(BRANCH)
endif
    find . -regex "^\./[^.].*" -exec cp --parents {} ./$(REPO) \;
# the regex prevents "hidden" dot-folder from copying
# one could use --link to save time and drive usage/space
# but i am concerned about hg auto merging and overriding (per hardlink)
# my actual changes
    hg -R $(REPO) commit $(EXTRA)

所以我可以发出make commit BRANCH=tests来提交任意分支,而不会丢失与分支无关的所有更改。实施hg add作为wipe .repocopy file there hg -R .repo add $(filename)留给读者作为练习者