gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:27:40 25 4
gpt4 key购买 nike

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

我的意图是分离一个Git仓库的子目录,使它成为一个独立的仓库,同时保持历史完整,但只有子目录的历史。 This question起初似乎可以解决问题,但后来我注意到其中的一个缺陷:

git filter-branch --subdirectory-filter 只保留与给定子目录相关的提交。但这意味着删除了影响该子目录中的文件的提交现在但已从其他位置移动到那里。

我注意到这一点是因为我“清理”存储库的第一次提交是“将所有内容移动到子目录 X”。这意味着我的文件之前曾在另一个位置,但当时的提交没有保留。

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

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

B)
可能其中一些提交还包含不符合这些条件的文件。如果可以从存储库中完全删除这些文件,那将是一个不错的附加组件。


编辑:

上面链接的解决方案将新存储库中的子目录内容 pull 到存储库的根目录中。正如@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 子目录移动到根目录。

最佳答案

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

换句话说,如果 git log -- somedir 显示“将文件 XYZ 移动到 somedir”作为 somedir 目录的最旧提交,您可以执行 git filter-branch --tree-filter '在此处插入一个相当简单的脚本,将文件 XYZ 移动到 somedir' HEAD。这样,您可以在提取子存储库之前理顺目录结构。

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

关于git - 从 Git 存储库中拆分子目录并保留子目录中所有文件的历史_now_,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15868808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com