与`git filter-branch --subdirectory-filter`相反的是什么?

时间:2012-11-12 03:08:31

标签: git version-control git-filter-branch

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


背景:我的任务是编写一个简单的脚本,但任务范围已经扩展,所以现在该脚本只是一个更大项目的子目录。它也没有自己的生存点,所以首选没有子模块的解决方案。

3 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

使用@model EditVM .... @Html.HiddenFor(m => m.FooID) @for(int i = 0; i < Model.Bars.Count; i++) { <fieldset> <legend>@Model.Bars[i].Name</legend> @Html.HiddenFor(m => m.Bars[i].Name) // in case you need to return the view in the POST method @for(int j = 0; j < Model.Bars[i].Versions.Count; j++) { <div> @Html.HiddenFor(m => m.Bars[i].Versions[j].ID) @Html.CheckBoxFor(m => m.Bars[i].Versions[j].IsSupported) @Html.LabelFor((m => m.Bars[i].Versions[j].IsSupported, Model.Bars[i].Versions[j].Version) </div> } </fieldset> } <input type="submit" value="Save" /> 命令。假设你有新的回购:

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提交中的oldrepo文件以及所有历史记录。