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