【问题标题】:New git repository in root directory to subsume an exist repository in a sub-directory根目录中的新 git 存储库以包含子目录中的现有存储库
【发布时间】:2011-11-03 20:14:54
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 让我看看能否为此创建一个 filter-branch 命令……请稍等

标签: git


【解决方案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

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

【讨论】:

  • 这完全准确地完成了我所需要的。谢谢。
【解决方案2】:

您可以使用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 的管道命令,但我不知道它们。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 2012-07-30
    • 2012-05-06
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多