我有一个目录结构:
project_root
data/
src/
.hg/
utils/
math/
graphics/
...
README.txt
LICENCE.txt
从. Hg/的位置可以看出,只有src/在Hg控制之下。我想把存储库根从src/移动到它的父目录project_root,这样我就可以跟踪data/、README.txt和license .txt。
一种简单的方法是将所有内容向下移动,而不是向上移动。hg:
- 将src的内容移到新目录src/src/
- 将project_root的内容(src/以外的)移到src/
- 将src重命名为new_project_root
- 将new_project_root移出project_root,删除project_root
有更好的方法吗?我不是第一个有这个问题的人,上面的解决方案似乎太复杂了。
您应该试试hg convert
。您将"转换"现有的Mercurial回购到一个新的。您可以为转换指定规则,在您的示例中,将原始repo中的所有文件转到新repo中的src
目录。然后你可以手动复制和hg add
其他文件到新的repo。
这样做的好处是它不会在历史记录中作为单独的更改反映出来。可能的缺点是,它将导致您的更改集id重新生成,并且现有的克隆将不再能够从新的repo中提取。
你的计划很好。它可能看起来很复杂,但它应该在20分钟内(最坏的情况),而且只发生一次。
在第一步中,当您移动要跟踪的文件时,您应该使用hg rename
(别名hg move
)来移动它们,因为Mercurial将记住每个文件在移动之前和之后的位置。这将有助于将移动之前的文件更改与移动后的新文件合并。当重命名/复制不伴随着对同一更改集中的内容的更改时,效果最佳。
我建议在继续之前克隆实际的repo(或复制整个项目目录)。
hg的"检测重命名"功能现在很受欢迎。
克隆这个仓库,这样你就可以把事情搞砸而不用担心。
使用你的例子:
- 创建src/src子目录
- 移动utils,数学,图形等到src/src
- 然后打开提交窗口。
- 移动的文件将出现在旧目录中,并带有!并在新目录中添加?
- 右键单击任何文件,选择"检测重命名…"
- 将最小相似度滑块滑动到100%
- 点击接受所有匹配按钮,关闭检测副本/重命名窗口
- 移动的文件现在应该在旧目录中显示R,在新目录 中显示A
提交更改
然后我移动数据,Readme.txt等下到src(不是src/src)
- 提交添加。
最后,现在我有了我想要的repo,将更改推回到最初克隆的repo。不要忘记,你需要更新原始的repo来查看工作目录中的更改。