【问题标题】:Segment git project into submodules将 git 项目分割成子模块
【发布时间】:2016-12-15 08:47:45
【问题描述】:

我有一个 git 项目,目前正在增长,并且有几个部分开始成为自己的项目。

所以,我想为它们创建子模块,但保留文件的历史记录。不同文件夹之间有移动(例如从 partThatIsNotItsOwnProjectpartThatIsItsOwnProject,我也想知道该移动的历史。)

之前:

/.git
/someFiles
/partThatIsItsOwnProject
--/subdirectory
/partThatIsNotItsOwnProject
--/subdirectory

我想要:

/.git
/someFiles
/partThatIsItsOwnProject
--/.git
--/subdirectory
/partThatIsNotItsOwnProject
--/subdirectory

所以,我猜git subtree 会这样做,但它似乎保留了原始的 git 存储库并且只显示其中的一部分。 git submodule 似乎是此设置的目标,但我该如何进行转换?

【问题讨论】:

    标签: git git-submodules git-subtree


    【解决方案1】:

    为此,您需要重写整个存储库的历史记录,以排除与您想要放入单独存储库的目录无关的所有内容。 git filter-branch 命令对此很有用。您可以在 [0] 找到执行此操作的脚本示例。请注意,您可能需要根据需要对其进行调整。

    一般来说,git filter-branch [1] 允许您通过将过滤器按顺序应用于 repo 中的每个提交来重写 git 历史记录。请注意,虽然使用--tree-filter 是实现您所需要的最简单的方法,但它会非常慢,因为它会在此过程中正确检查每个提交,因此直接使用--index-filter 编辑索引会更好。

    [0]https://github.com/openstack/oslo.tools/blob/master/filter_git_history.sh

    [1]https://git-scm.com/docs/git-filter-branch

    【讨论】:

      【解决方案2】:

      分叉你的主 git,然后将分叉重命名为“partThatIsItsOwnProject”,然后删除不属于该“子目录”的所有内容。 然后将分叉的 git 作为子模块添加到您的主 git 中,所有历史记录都将保留。

      对您想从主 git 突破的所有子目录重复此操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-05
        • 2013-12-05
        • 1970-01-01
        • 2015-07-31
        • 2020-03-14
        相关资源
        最近更新 更多