使新的git分支包含仅一些文件的完整历史记录

时间:2016-03-23 17:10:50

标签: git refactoring git-filter-branch

我正处于一个重构的中间,最终将从我围绕它构建的API中分离出“核心模型”。

我有当前(简化的)目录结构:

/root
|-model_core.py
|-model_configuration.py
|-model_frontend.py
|-plot_model.py
|-cool_use_for_model.py

如何创建一个新分支model-core,其中包含model_core.pymodel_configuration.py ,以及来自当前分支的完整提交历史记录?

2 个答案:

答案 0 :(得分:2)

您没有多少选择:

http://blogs.atlassian.com/2014/04/tear-apart-repository-git-way/
https://lostechies.com/johnteague/2014/04/04/using-git-subtrees-to-split-a-repository/

主要的2个选项是:

git filter-branch

git subtree split --prefix=lib -b split

如上所述,我们可以详细解释每个选项

filter-branch将循环遍历每个提交,然后您只能检出给定的文件,而git subteree split将是您的更好选择。

解释这两个选项,以便您可以选择自己喜欢的选项。

示例代码:

filter-branch

# Filter the master branch to your directory and remove empty commits
git filter-branch --prune-empty --subdirectory-filter YOUR_FOLDER_NAME filter_from_branch

这将检出从给定文件夹到当前目录的所有所需文件

subtree split

  

<强> git subtree    git-subtree - Merge 将子树或 split 存储在子树中

git subtree split -P <name-of-folder> -b <name-of-new-branch>

enter image description here

答案 1 :(得分:0)

我假设您正在寻找完全从分支机构历史中删除其他文件,而不仅仅是git rm {model_frontend,plot_model,cool_use_for_model,}.py提交。如果这涵盖了你所需要的东西,那么,绝对只是这样做,而不是搞乱你的回购历史。

公平警告:因为这涉及从旧提交中重写文件,您的git历史记录将被重写,并且分支机构将不会就提交内容达成一致。这会使事情变得混乱。如果您不知道自己在做什么,不要这样做

也就是说,如果您创建分支my-core-branch来执行此操作,那么git filter-branch --tree-filter 'rm -f model_frontend.py plot_model.py cool_use_for_model.py' my-core-branch将在my-core-branch中重写历史记录以删除这些文件,但请保留其他分支机构。历史。触摸这些文件的提交的哈希值以及您未删除的文件将不再在分支之间匹配,显然,对于任何阅读此内容的git新手来说,使用风险自负。 < / p>