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子目录移动到根目录.
根据历史记录的复杂程度,在使用 提取子目录之前,可以重写它并使用 移动文件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 次提交,线性历史记录)上执行了此操作,并且它有效,但我认为如果没有一些严格的自动化,它就不会扩展。