2012-11-12 42 views
4

使用git filter-branch --subdirectory-filter您可以将当前存储库中的子目录自行转换为存储库。然而,我想要做的却是相反的事情:创建一个存储库,将当前存储库的全部内容作为子目录存放,保存完整的历史记录,就好像它们总是在该子目录中一样。我不想使用子模块,因为我希望该目录成为存储库的完整组成部分。`git filter-branch --subdirectory-filter`的反义词是什么?


背景:我用写一个简单的脚本任务,但是任务的范围也不断扩大,所以现在该脚本变成只是在一个大项目的子目录。它本身也没有生存点,所以没有子模块的解决方案是首选。

回答

8

最简单的办法是不理历史:只需git mv所有的文件到一个子目录,提交这一变化,并用自己的生命矣。

如果你真的想装,如果你一直在做一个子目录这项工作中,最不复杂的方法是使用类似:

git filter-branch --tree-filter "mkdir SUBDIR && bash -c 'git mv -k {,.[!.],..[!.]}* SUBDIR/'" 

与目标子目录的名称替换SUBDIR。

+0

詹姆,谢谢,这只是事情:)至于在命令行中,它的工作方式几乎罚款,但可惜的是跳过隐藏的文件。我发现[解决方案正确地将它们放在一起](http://serverfault.com/a/122343),这也不能用于开箱即用。不幸的是,这似乎需要明确运行'bash'(git默认使用'sh'?)。所以我建议编辑你的答案,这会使代码膨胀一点,但也适用于隐藏文件。 – Septagram

+0

编辑对我来说很有意义!我敢打赌你是对的,'git filter-branch'明确调用'sh'来运行给定的命令。 –

+0

“bash -c”部分不是必须的.​​.....而且你必须手动移动忽略的文件。顺便说一句。由我.gitignore已被移动... – inf3rno

2

你可以只子项目库中的文件移动到你想有他们在更大的存储库中,然后这些提交合并到最终处置库的目录。这将完全保留两个存储库的历史记录,包括所有提交ID。

cd /path/to/subproject 
mkdir subproject_dir 
git mv file1 dir2 dir3... subproject_dir 
git commit 
cd /path/to/main_project 
git pull /path/to/subproject 
1

使用git subtree命令:

这可以通过类似的命令来完成。假设您有新的回购协议:

$ cd $ROOT_OF_NEW_REPO 
$ git subtree add --prefix=subdirectory/for/old/repo <old git repo URL or checkout> <commit ref> 

例如。

$ git subtree add --prefix=history ~/repos/oldrepo HEAD 

history目录将包含oldrepo文件在HEAD承诺,所有的历史一起。

相关问题