我怎么能拆分一个mercurial存储库?

时间:2014-08-13 13:59:06

标签: mercurial

hg mv命令的格式为hg rename [OPTION]... SOURCE... DEST 。路径名相对于当前目录。因此,当您处于根目录的命令提示符并指定hg mv -n -I * A\B Z时,mercurial将在根目录下创建目录Z,并将A \ B \ readme.txt移动到Z \ readme.txt。

如何在Windows下指定Z是存储库根目录?我尝试使用'。'作为目的地,即hg mv -n -I * A\B .,但得到的消息是A \ B \ readme.txt将被复制到B \ readme.txt,而不是复制到根目录下的readme.txt。我尝试过使用'〜'作为目的地,hg mv -n -I * A\B ~给了我一个名为"〜"的新目录。在根之下,显然不是我想要的。

所以我的问题是:如何指定存储库根目录作为mercurial move命令的目标?


修改:我会尝试澄清这个问题。

我有一个包含两个产品的OldDev存储库:Product-A和Product-B。使用'〜'用于表示OldDev的根文件夹的符号,OldDev包含两个文件夹:〜/ Product-A和〜/ Product-B(当然,还有〜/ .hg,其中存储了元数据)。

每个产品都由几个项目组成,每个这样的项目都在产品的文件夹下分配了一个文件夹。因此,产品-A具有项目-A,项目-B和项目-C,存储在〜/ Product-A / Project-A,〜/ Product-A / Project-B和〜/ Product-A / Project-C中,相应地。 〜/ Product-A / Project-A / xxx.cs是(产品-A' s)项目文件中的一个。

现在我想将Project-A提取到自己的NewDev存储库。由于它是NewDev中的单个项目,保留产品/项目层次结构是没有意义的,所以我希望它是NewDev的根目录:例如,xxx.cs文件将是@ / xxx .cs,其中@是NewDev的根文件夹(一个包含NewDev' s .gg目录,其中存储了NewDev的元数据)。

要将Project-A提取到NewDev,我使用了转换扩展,如" split a repository in two"中所述。我使用了包含一个映射include Product-A/Project-A的mapfile。

到目前为止,NewDev是OldDev的精确子树。它不包含〜/ Product-B,它不包含〜/ Product-A / Project-B或〜/ Product-A / Project-C。它只包含〜/ Product-A / Project-A。剩余的文件位于与以前完全相同的路径,但只保留属于Product-A的Project-A的那些文件。

所以,我实现了一半的目标:我将OldDev与其众多产品和项目分开,并仅使用一个项目(Project-A)创建了NewDev。但是,Project-A的文件不在@,而是在旧的(OldDev)位置@ / Product-A / Project-A。我需要将它们向上移动两步,因此xxx.cs将位于@ / xxx.cs而不是@ / Product-A / Project-A / xxx.cs

要移动文件,我尝试使用hg mv命令,但我无法确定如何指定根(@)作为目标。

解决方案:根据Marc Anton Dahmen的回答,对我有用的内容如下:

convert1.txt: hg convert -s hg -d hg --filemap mapfile1.txt olddev temprepo
mapfile1.txt: include Product-A/Project-A

convert2.txt: hg convert -s hg -d hg --filemap mapfile2.txt temprepo newrepo
mapfile2.txt: rename Product-A/Project-A .

其中convrert1.txt和convert2.txt的文本当然是shell命令。

2 个答案:

答案 0 :(得分:2)

您必须在文件地图中使用重命名指令,而不是包含,如下所示:

rename Project-A .

答案 1 :(得分:1)

移动存储库中的每个文件,并且存储库数据不是hg mv操作,因为它无法更改存储库元数据的存储位置。

你的问题的措辞仍然很模糊,但我对你想做什么有一个不错的猜测。

假设您有一个名为/ some / dir / avi-repo的仓库,您真的希望它在/ avi-repo中。使用clone:

cd /
hg clone /some /avi-repo

现在您有两个相同的回购副本,一个在/some/dir/avi-repo,一个在/avi-repo。您现在可以删除所有/some/dir/avi-repo

你的愿望似乎比树那样复杂:

/some
 ---- /.hg  # the repository meta-data
 ---- /dir  # no files in here just the sub-dir
 -------- /avi-repo
 ------------/file.c
 ------------/file.dat
 ------------/important-file.txt

您想将avi-repo移至/some/avi-repo。你应该能够使用正确的mercurial命令序列来做到这一点,但它更容易:

mkdir /temp
cd /temp
hg clone /some /temp/avi-clone
rm -r /some
mkdir /some
hg clone /temp/avi-clone /some

或者某种变体。重点是,将整个存储库归还不是hg mv的工作。