在Mercurial中更改目录结构

时间:2012-02-02 18:37:05

标签: version-control mercurial directory-structure

我有一个单人的单文件夹mercurial存储库。目录结构很简单:

P104
  lecture_notes
    files under version control live here  

过了一会儿,我意识到我想在存储库中有两个目录,比如这个

P104
  lecture_notes
    files under version control live here  (.hg is here)
  homework
    more files under version control

现在,如果我只是想将文件添加到存储库,它就会失败:

br@ymir:~/P104/lecture_notes$ ll ..
total 16
drwxr-xr-x 4 br br 4096 2012-02-02 18:05 ./
drwxr-xr-x 4 br br 4096 2012-02-01 20:46 ../
drwxr-xr-x 2 br br 4096 2012-02-02 17:44 homework/
drwxr-xr-x 4 br br 4096 2012-02-02 18:06 lecture_notes/
br@ymir:~/P104/lecture_notes$ hg add ../homework/hw1_P104.tex 
abort: ../homework/hw1_P104.tex not under root

我的第一个想法是在目录结构中将repo克隆一级,将文件添加到克隆,然后删除原始repo。但即使克隆也失败了:

br@ymir:~/P104/2011/lecture_notes$ hg clone . ..
abort: destination '..' is not empty

所以问题是,除了在其他地方创建一个干净的存储库并手动复制文件之外,是否还有Mercurial-ish方法?

2 个答案:

答案 0 :(得分:7)

我喜欢VonC的解决方案,你不移动.hg文件夹。这是一个直接的解决方案。您可以选择执行移动它,因此必须重命名较少的文件夹:

  1. .hg文件夹移至~/P104

    $ mv ~/P104/lecture_notes/.hg ~/P104
    

    从Mercurial的角度来看,您将把所有顶级文件移动到lecture_notes目录中。 homework文件夹中也会突然出现新的未跟踪文件。

  2. 让Mercurial找出重命名:

    $ hg addremove
    

    这将正确检测到之前位于lecture_notes目录中的顶级文件。 homework中未跟踪(未被忽略)的文件刚刚添加。

  3. 保存更改:

    $ hg commit
    
  4. 整体“技巧”是工作副本中的文件相对于.hg目录。因此,通过在文件系统层次结构中移动.hg目录,我们可以有效地将工作副本文件向下移动到工作副本内的层次结构中。

答案 1 :(得分:4)

如果您的Mercurial仓库的根目录位于~/P104/lecture_notes下,我宁愿:

  1. lecture_notes重命名为P104
  2. 制作子目录lecture_notes
  3. 移动新子目录中的所有现有文件
  4. homework及其文件添加到重命名的P104目录
  5. hg add一切
  6. 我们的想法是将.hg repo保持原样(~/P104/lecture_notes重命名为~/P104/P104)并重新组织该重命名目录中的文件。
    无需克隆。