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命令。
答案 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
的工作。