6

也许已经有一个解决方案,但其他问题/答案似乎解决了稍微不同的问题(或者我真的不理解它们)。

我的意图是分离 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 子目录移动到根目录。

4

1 回答 1

1

根据历史记录的复杂程度git filter-branch --tree-filter使用--subdirectory-filter.

换句话说,如果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 次提交,线性历史记录)上做了这个,它工作了,但我认为如果没有一些严格的自动化,它不会扩展。

于 2013-05-03T13:08:14.223 回答