繁体   English   中英

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

[英]New git repository in root directory to subsume an exist repository in a sub-directory

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

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

谢谢。

假设您的组件位于/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

当然,您必须像平常一样为项目的其余部分添加文件。

您可以使用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的管道命令有一种计算上更便宜的方式,但我不清楚它们。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM