也许已经有了一个解决方案,但其他问题/答案似乎解决了稍微不同的问题(或者我实际上并不理解它们)。
我的目的是分离Git存储库的子目录并使其成为一个独立的存储库,同时保持历史记录不变,但只保留子目录的历史记录。 This question首先似乎做了伎俩,但后来我注意到它有一个缺陷:
git filter-branch --subdirectory-filter
仅保留与给定子目录相关的提交。但这意味着删除了提交,这些提交会影响该子目录现在中的文件但已从其他位置移动到那里。
我注意到了这一点,因为我的'清理'存储库的第一次提交是'将所有内容移动到子目录X'。这意味着我的文件之前已经在另一个位置,但是从那时起的提交都没有保留。
所以我需要的是一个命令(或命令序列):
B)
可能其中一些提交还包含与这些条件不匹配的文件。如果这些文件可以从存储库中完全修剪掉,这将是一个不错的插件。
编辑:
上面链接的解决方案将新存储库中的subdir内容拉到repo的根目录。正如@Amber指出的那样,这会导致已经存在于根目录中的文件出现问题。所以我想要实现的是:
原始目录结构:
\Old-Repo
\.git
\ABC
|- dir content
\DEF
|- dir content
\GHI
|- dir content
分离存储库的目录结构应为:
\New-Repo-DEF
\.git
\DEF
|- dir content
而不是:
\New-Repo-DEF
\.git
content of old DEF subdirectory
然后我会通过常规提交将内容从DEF子目录移动到根目录。
答案 0 :(得分:0)
根据历史记录的复杂程度,在使用git filter-branch --tree-filter
提取子目录之前,重写它并使用--subdirectory-filter
移动文件(如here所述)可能是可行的。
换句话说,如果git log -- somedir
显示“将文件XYZ移动到somedir”作为somedir
目录中最早的提交,则可以执行git filter-branch --tree-filter 'insert a fairly foolproof script here that moves files XYZ to somedir' HEAD
。这样,您可以在提取子存储库之前理顺目录结构。
我几天前在一个相当小的存储库(大约150个提交,线性历史记录)上做了这个,并且它有效,但我认为如果没有一些严肃的自动化,它就不会扩展。