如何将Mercurial存储库根目录移动到一个目录中?

时间:2011-07-17 16:13:58

标签: mercurial project-management

我的目录结构如下:

project_root
  data/
  src/
    .hg/
    utils/
    math/
    graphics/
    ...
  README.txt
  LICENCE.txt

从.hg /的位置可以看出,只有src /处于Hg控制之下。我想将存储库根目录从src /移动到其父目录project_root,因此我也可以跟踪data /,README.txt和LICENCE.txt。

执行此操作的一种愚蠢方法是将所有内容移到目录中而不是移动.hg:

  • 将src的内容下移到新目录src / src /
  • 将project_root(src /除外)的内容下移到src /
  • 将src重命名为new_project_root
  • 将new_project_root移出project_root,删除project_root

有更好的方法吗?我不能成为第一个遇到这个问题的人,而上述解决方案似乎过于复杂。

3 个答案:

答案 0 :(得分:5)

您应该尝试hg convert。您将把现有的Mercurial仓库“转换”为新的仓库。您可以指定转换规则,在您的情况下,原始仓库中的所有文件都将转到新仓库中的src目录。然后,您可以手动将其他文件hg add复制到新的仓库。

这样做的好处是它不会在历史记录中反映为单独的更改。可能的缺点是它会导致您的变更集ID重新生成,现有的克隆将无法再从新的仓库中提取。

答案 1 :(得分:4)

你的计划没问题。它似乎涉及,但它应该不到20分钟(最坏的情况),只发生一次。

在移动被跟踪文件的第一步中,您应该使用hg rename(别名hg move)来移动它们,因为Mercurial会记住每个文件在移动之前和之后的内容。这将有助于在移动之前将文件上的更改与移动后的新文件合并。在重命名/复制时,如果没有更改同一变更集中的内容,则效果最佳。

我建议在继续之前克隆实际的仓库(或复制整个项目目录)。

答案 2 :(得分:0)

hg的Detect Renames现在是一种享受。

克隆回购邮件,这样你就可以毫不费力地搞砸了。

使用您的示例:

  • 创建src / src子目录
  • 将utils,math,graphics等移动到src / src
  • 然后打开提交窗口。
    • 移动的文件将出现在旧目录中!并在他们的新目录中使用?
  • 右键单击任何文件,然后选择“检测重命名...”
  • 将“最小相似度”滑块滑动至100%
  • 单击“接受所有匹配项”按钮,然后关闭“检测副本/重命名”窗口
    • 移动的文件现在应该在旧目录中显示为R,在新目录中显示为A
  • 提交此更改

  • 然后我将数据Readme.txt等移到src(而不是src / src)

  • 承诺添加。

最后,现在我已经拥有了我想要的仓库,将更改推回到最初克隆的仓库。不要忘记您需要更新原始仓库以查看工作目录中的更改。