2011-08-25 112 views
2

我正在处理当前不在任何版本控制下的大代码库(是,真的)。我一直在研究深层目录中的一个组件,并创建了一个隐藏的git存储库来跟踪我的更改。 我现在想要将所有代码添加到源代码管理,并为整个目录树建立一个存储库。我希望新的外部存储库将文件的所有历史记录包含在内部存储库中。 我不想单独的项目或子模块;我想要知道存储库是从一开始就在代码树的根目录中创建的,并且内部存储库从不存在。 我想删除子目录中的.git目录,但不希望丢失它包含的修订历史记录。根目录中的新git存储库包含子目录中的存在存储库

一切我都在阅读题目是有关合并现有资源库,在这里还是要维持子模块或远程项目,我不希望出现这种情况并非如此。

谢谢。

+0

让我看看,如果我能掀起该过滤器分支命令只是给我一分钟 – knittl

回答

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 

然后,当然,你必须添加文件的项目,就像正常的休息。

+0

这正是做,正是我需要的。谢谢。 – Anthony

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目录移动到您的项目根目录下;你不应该看到任何unstaged文件。

我很确定有一个计算上更便宜的方法,使用--index-filter和git的管道命令,但我不知道他们的心。

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

相关问题