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

uli*_*973 5 git git-filter-branch

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

我的目的是分离Git存储库的子目录并使其成为一个独立的存储库,同时保持历史记录不变,但只保留子目录的历史记录. 这个问题首先似乎可以解决问题,但后来我发现了一个缺陷:

git filter-branch --subdirectory-filter仅保留与给定子目录相关的提交.但是,这意味着提交消除它的影响是在子目录的文件,现在不过从其他地点已经搬到那里.

我注意到了这一点,因为我的'清理'存储库的第一次提交是'将所有内容移动到子目录X'.这意味着我的文件之前已经在另一个位置,但是从那时起的提交没有被保留.

所以我需要的是一个命令(或命令序列):

  • 删除存储库中的所有提交
  • 除了包含文件的提交
    • 现在或在给定的子目录中
    • 是其他位置的这些文件的先前版本.

B)
这些提交中的某些提交还可能包含与这些条件不匹配的文件.如果这些文件可以从存储库中完全修剪,这将是一个不错的附加组件.


编辑:

上面链接的解决方案将新存储库中的subdir内容拉到repo的根目录.正如@Amber指出的那样,这会导致已经存在于根目录中的文件出现问题.所以我想要实现的是:

原始目录结构:

\Old-Repo
    \.git
    \ABC
    |- dir content
    \DEF
    |- dir content
    \GHI
    |- dir content
Run Code Online (Sandbox Code Playgroud)

分离存储库的目录结构应该是:

\New-Repo-DEF
    \.git
    \DEF
    |- dir content
Run Code Online (Sandbox Code Playgroud)

并不是:

\New-Repo-DEF
    \.git
    content of old DEF subdirectory
Run Code Online (Sandbox Code Playgroud)

然后我会通过常规提交将内容从DEF子目录移动到根目录.

Jan*_*hoł 1

根据历史记录的复杂程度,在使用 提取子目录之前,可以重写它并使用 移动文件git filter-branch --tree-filter(如此处所述)--subdirectory-filter。

换句话说,如果git log -- somedir显示“将文件 XYZ 移动到某个目录”作为目录的最旧提交somedir,您可以执行git filter-branch --tree-filter 'insert a fairly foolproof script here that moves files XYZ to somedir' HEAD. 这样,您可以在提取子存储库之前理顺目录结构。

几天前,我在一个相当小的存储库(约 150 次提交,线性历史记录)上执行了此操作,并且它有效,但我认为如果没有一些严格的自动化,它就不会扩展。