根目录中的新git存储库,用于包含子目录中的现有存储库

时间:2011-08-25 15:58:35

标签: git

我正在开发一个目前没有任何版本控制的大型代码库(是的,真的)。我一直在深度目录中的一个组件上工作,并创建了一个隐蔽的git存储库来跟踪我的更改。 我现在想要将所有代码添加到源代码控制中,并为整个目录树创建一个存储库。我希望新的外部存储库包含内部存储库中文件的所有历史记录。 我不想要单独的项目或子模块;我希望好像从一开始就在代码树的根目录中创建了存储库,而内部存储库从未存在过。 我想删除子目录中的.git目录,但不希望丢失它包含的修订历史记录。

我在这个主题上阅读的所有内容都是关于合并现有的存储库,而不是这里的情况,或者是维护子模块或远程项目,这是我不想要的。

谢谢。

2 个答案:

答案 0 :(得分:1)

假设您的组件位于/project-root/deep/path/to/component。以下命令将执行您想要的操作:

cd /project-root/deep/path/to/component
git filter-branch --tree-filter 'mkdir -p deep/path/to/component; git mv file1 file2 file2 deep/path/to/component' HEAD
rm -rf deep
mv .git /project-root
git reset --hard

然后你必须正常地为项目的其余部分添加文件。

答案 1 :(得分:0)

您可以使用filter-branch并将当前历史记录中的现有文件移动到子目录中,在该子目录中,从一开始就存在于项目根目录中的存储库:

git filter-branch \
--tree-filter '
>/dev/null mkdir -p path/from/project/root/to/current/;
mv * path/from/project/root/to/current/;
# take care of special files, e.g. .gitignore and other hidden files
mv .gitignore path/from/project/root/to/current/;
'
--tag-filter cat \
--all

完成此操作后,验证生成的历史记录。如果一切都很花哨,请将.git目录移动到项目根目录中;你不应该看到任何未分级的文件。

我很确定使用--index-filter和git的管道命令有一种计算上更便宜的方式,但我不清楚它们。

这将重写历史记录,因此如果您的存储库是由多个开发人员共享的,请不要使用此方法。