在Mercurial中更改目录结构

ev-*_*-br 6 version-control mercurial directory-structure

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

P104
  lecture_notes
    files under version control live here  
Run Code Online (Sandbox Code Playgroud)

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

P104
  lecture_notes
    files under version control live here  (.hg is here)
  homework
    more files under version control
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

br@ymir:~/P104/2011/lecture_notes$ hg clone . ..
abort: destination '..' is not empty
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ler 7

我喜欢VonC的解决方案,你不移动.hg文件夹.这是一个直接的解决方案.在这里你另一种移动它,所以必须重命名较少的文件夹:

  1. .hg文件夹向上移动到~/P104

    $ mv ~/P104/lecture_notes/.hg ~/P104
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 让Mercurial找出重命名:

    $ hg addremove
    
    Run Code Online (Sandbox Code Playgroud)

    这将正确检测到之前存在于顶级文件中的lecture_notes文件.homework刚刚添加了未跟踪(和未被忽略)的文件.

  3. 保存更改:

    $ hg commit
    
    Run Code Online (Sandbox Code Playgroud)

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


Von*_*onC 4

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

  1. 重命名lecture_notes为P104
  2. 建立一个子目录lecture_notes
  3. 移动该新子目录中的所有现有文件
  4. 在重命名的P104目录中添加homework及其文件
  5. hg add一切

这个想法是将.hg存储库保留在原来的位置(~/P104/lecture_notes重命名为~/P104/P104)并重新组织该重命名的目录中的文件。
无需克隆。