0

在开发我的软件时,我创建了一组测试用例,这些测试用例可以通过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 的解决方案:将工作目录切换到分支而不丢失更改?但它仍然会删除文件)

编辑见下面我自己的答案

4

3 回答 3

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

然后人们可以克隆,你可以推送现有的 repo 没有测试,但外部 repo 将包含一个指向它的指针,并且两者将同步进行版本控制。同样,有点棘手,但有一些不错的结果。

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

要冒险,只需执行以下操作:

hg update development
hg merge tests

你可以走了。

于 2013-03-04T00:50:26.100 回答
2

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

这是预期和正确的结果:分支存储不同的开发线,你的add东西在测试分支中,在合并之前,这个数据将只存在于创建时的分支中

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

  • 定期合并tests分支到development(测试中的所有更改都将出现在开发中),但仅将日志用于开发分支中的更改集,可能没有来自测试的合并集。它很简单 revset,您甚至可以将带有 revset 的日志命令写入别名,并在需要时使用别名命令
  • 正如 Ry4an 所提到的,您可以使用 subrepo|guestrepo 技术执行存储库分离而不是分支分离 - 如果测试存储在主存储库的子目录中,则将 /tests 转换为嵌套存储库 -> 子存储库并有两个独立但链接的存储库(未来阅读:Mercurial wiki 中的子存储库和Mercurial Kick Start 练习中的子存储库)
于 2013-03-04T03:53:18.360 回答
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 addaswipe .repo的实现copy file there hg -R .repo add $(filename)留给读者作为练习器

于 2013-03-07T11:42:18.010 回答