2012-10-11 42 views
4

我有一个目录的仓库称为project移动项目进入子目录

[~/project]$ ls 
a b c 

我想一切都移动到project目录的子目录,所以它看起来像这样:

[~/project]$ ls 
subdir 
[~/project]$ cd subdir 
[~/project/subdir]$ ls 
a b c 

通常情况下,git mv可以工作,但是我想让它看起来好像从一开始就一直对该子目录进行历史提交。有没有办法做到这一点?

+0

为什么你想改变历史? git或任何其他源代码管理系统的重点是保持历史记录不变。 – piokuc

+0

@piokuc:我正在将一个git存储库合并到另一个中。如果我没有这样做,它会打破“平分”。 – Snowball

回答

5

貌似filter-branch做什么,我想:

git filter-branch --tree-filter \ 
     'mkdir subdir; \ 
     find -maxdepth 1 \ 
      -not -name . \ 
      -not -name .git \ 
      -not -name subdir \ 
      -print0 \ 
     | xargs -0 -I{} mv {} subdir' \ 
    -d /tmp/whatever -- --all 

-d /tmp/whatever部分只是所以它运行在一个tmpfs文件系统的命令,这样就不会有一堆磁盘IO的。

(在极少数情况下,/tmp不会被挂载为tmpfs的。你可以用mount | grep tmp检查。)

+0

我把所有东西都放在不同的行上,但是我进一步说,根据您的陈述意图,使用'/ dev/shm'与'/ tmp'。 '/ tmp'不是'tmpfs',而是'/ dev/shm'。但缺点是总会有'/ tmp'出现,但根据* nix发行版,远程可能'/ dev/shm'不会在那里。我只是用这个自己,它很好。 – digitalextremist

+0

到目前为止唯一的问题是,这需要一个不是“裸”的本地克隆: -/ – digitalextremist

+0

@digitalextremist:感谢格式化!我个人更喜欢'/ tmp',因为它在* BSD和OS X上可用,所以我回滚了特定的编辑。 – Snowball