从Git存储库拆分子目录并保留子目录_now_中所有文件的历史记录

时间:2013-04-07 22:52:38

标签: git git-filter-branch

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

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

1 个答案:

答案 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个提交,线性历史记录)上做了这个,并且它有效,但我认为如果没有一些严肃的自动化,它就不会扩展。