“git filter-branch --subdirectory-filter”的反义词是什么



使用 git filter-branch --subdirectory-filter,您可以将子目录从当前存储库转换为单独的存储库。然而,我想做的是相反的事情:创建一个存储库,该存储库将包含当前存储库的完整内容作为子目录,保留完整的历史记录,就好像它们始终在该子目录中一样。我不想使用子模块,因为我希望该目录是存储库的完全组成部分。


背景:我的任务是编写一个简单的脚本,但任务的范围已经扩大,所以现在脚本只是一个更大项目中的一个子目录。它也没有独立生活的意义,因此首选没有子模块的解决方案。

最简单的解决方案是不要理会历史记录:只需将所有文件git mv到一个子目录中,提交该更改,然后继续您的生活。

如果你真的想假装你一直在子目录中做这项工作,最简单的方法是使用类似的东西:

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

将 SUBDIR 替换为目标子目录的名称。

您可以将子项目存储库中的文件移动到您希望将它们放在较大存储库中的目录中,然后将这些提交合并到最终存储库中。 这将完全保留两个存储库的历史记录,包括所有提交 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

使用 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目录将包含提交HEAD的 oldrepo 文件以及所有历史记录。

最新更新