6

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


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

4

3 回答 3

9

最简单的解决方案是不理会历史记录:将git mv所有文件放入子目录中,提交更改,然后继续你的生活。

如果您真的想假装好像您一直在子目录中完成这项工作,最简单的方法是使用以下内容:

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

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

于 2012-11-12T03:34:35.473 回答
1

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

使用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 文件以及所有历史记录。

于 2017-01-10T04:02:21.930 回答