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

Mercurial 在保留文件的同时切换hg中的分支,mercurial,branch,Mercurial,Branch,在开发软件时,我创建了一组测试用例,可以通过maketests自动完成。为了使事情有条理,我把它们放在子目录tests中。为了使我的提交保持井然有序,并且不使我的开发分支混乱,我创建了一个额外的分支tests,在那里我提交测试单元 我的问题是:当我将单元提交到测试分支并切换回开发时,所述测试被删除 D:\Project>hg branch test D:\Project>edit... D:\Project>hg add D:\Project>hg commit D:\P

在开发软件时,我创建了一组测试用例,可以通过
maketests
自动完成。为了使事情有条理,我把它们放在子目录
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和git等DVCSs不允许在一个版本/分支签出一个目录,在另一个版本/分支签出另一个目录

您链接的答案是将更改后的文件及其文件转移到另一个分支,而不是您所要求的

因此,您想要的方法(单独的分支)是行不通的,但是还有很多其他/更好的选择

一种选择是使测试成为一个由mq()存储库管理的补丁,该存储库本身可以进行版本控制。然后,当您在您的开发分支中找到位置并希望运行测试时,您会执行以下操作:

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

您可以继续了。

这些测试文件不存在于您的开发分支中,因此当您签出开发分支时,它们将不在工作目录中。Mercurial和git等DVCSs不允许在一个版本/分支签出一个目录,在另一个版本/分支签出另一个目录

您链接的答案是将更改后的文件及其文件转移到另一个分支,而不是您所要求的

因此,您想要的方法(单独的分支)是行不通的,但是还有很多其他/更好的选择

一种选择是使测试成为一个由mq()存储库管理的补丁,该存储库本身可以进行版本控制。然后,当您在您的开发分支中找到位置并希望运行测试时,您会执行以下操作:

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
你可以走了

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

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
这是预期和正确的结果:分支存储不同的开发行,您在测试分支中添加
一些的内容,在合并之前,此数据将仅存在于创建时的分支中

为了“使我的提交保持有序,并且不使我的开发分支混乱…”,但在开发分支中进行测试,您至少可以使用两种方法:

  • 定期将
    测试
    分支合并到
    开发
    (测试中的所有更改都将出现在开发中),但只对开发分支中的更改集使用日志,可能不使用测试中的合并集。它相当简单,您甚至可以使用revset将log命令写入别名,并在需要时使用别名命令
  • 正如Ry4an提到的,您可以使用subrepo | guestrepo技术来执行存储库分离,而不是分支分离-如果测试存储在主repo的子目录中,则将/测试转换为嵌套存储库->子存储库,并有两个独立但链接的repo(未来阅读:在Mercurial wiki和Mercurial启动练习中)
当我将单元提交到测试分支并切换回开发时,所述测试被删除

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
这是预期和正确的结果:分支存储不同的开发行,您在测试分支中添加
一些的内容,在合并之前,此数据将仅存在于创建时的分支中

为了“使我的提交保持有序,并且不使我的开发分支混乱…”,但在开发分支中进行测试,您至少可以使用两种方法:

  • 定期将
    测试
    分支合并到
    开发
    (测试中的所有更改都将出现在开发中),但只对开发分支中的更改集使用日志,可能不使用测试中的合并集。它相当简单,您甚至可以使用revset将log命令写入别名,并在需要时使用别名命令
  • 正如Ry4an提到的,您可以使用subrepo | guestrepo技术来执行存储库分离,而不是分支分离-如果测试存储在主repo的子目录中,则将/测试转换为嵌套存储库->子存储库,并有两个独立但链接的repo(未来阅读:在Mercurial wiki和Mercurial启动练习中)

为了实现我想要的,我最终为回购创建了一个子目录:

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)

因此,我只需发出
makecommit BRANCH=tests
即可提交到任意分支,而不会丢失与该分支无关的所有更改。实现
hg add
作为
wipe.repo
在那里复制文件
hg-R.repo add$(文件名)
留给读者作为练习者

为了实现我想要的,我最终为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)
因此,我只需发出
makecommit BRANCH=tests
即可提交到任意分支,而不会丢失与该分支无关的所有更改。实现
hg add
作为
wipe.repo
在那里复制文件
hg-R.repo add$(f