也许已经有一个解决方案,但其他问题/答案似乎解决了稍微不同的问题(或者我真的不理解它们)。
我的意图是分离 Git 存储库的子目录并使其成为独立的存储库,同时保持历史记录完整,但仅保留子目录的历史记录。 这个问题一开始似乎起到了作用,但后来我注意到了其中的一个缺陷:
git filter-branch --subdirectory-filter
仅保留与给定子目录相关的提交。但这意味着删除了影响现在在该子目录中但已从其他位置移动到那里的文件的提交。
我注意到这一点是因为我的“清理”存储库的第一次提交是“将所有内容移至子目录 X”。这意味着我的文件之前曾在另一个位置,但当时的提交并未保留。
所以我需要的是一个命令(或命令序列):
- 删除存储库中的所有提交
- 除了包含以下文件的提交
- 现在在给定的子目录中或
- 是这些文件在其他位置的早期版本。
B)
可能其中一些提交还包含不符合这些条件的文件。如果可以从存储库中完全删除这些文件,那将是一个不错的附加组件。
编辑:
上面链接的解决方案将新存储库中的子目录内容拉到存储库的根目录。正如@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 子目录移动到根目录。