以两个不同的方式拆分存储库

时间:2015-01-22 15:15:26

标签: git

场景用下图表示:

0 -- A -- B -- C -- D
       \
        E -- F -- G

在某些时候,EFG成为另一个项目,我想完全切断0ABCD和EFG的关系:

0 -- A -- B -- C -- D

       E' - F' - G'

2 个答案:

答案 0 :(得分:0)

我认为该过程类似于github站点上描述的用于从存储库中删除敏感数据的过程。这适用于逐个文件,并且取决于存储库的大小,可能需要一些时间。该过程详细描述here,并使用git-filter-branch重写所有历史记录以删除该文件的所有出现(此处命名为removed_file):

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch removed_file' --prune-empty --tag-name-filter cat -- --all

这会重写历史记录,实质上会创建包含所有历史记录的新提交,因此旧提交的链接在新分支中不起作用。

我假设您不希望新的存储库包含其他部分仍然存在的历史记录。如果不是这样的话,就像将这些分支推送到单独的存储库并将它们重命名为master分支一样简单。

答案 1 :(得分:0)

从我的笔记:

假设您要将git存储库拆分为两个或更多个离散存储库。您将要克隆基本存储库,然后使用git filter-branch删除要删除的子目录,同时删除空提交。

1. Clone the repository
  $ git clone git://git.foo.com/myrepo.git NewProject
  $ cd NewProject

2. Filter the new project to retain only subdirectory "lib"
  $ git filter-branch --prune-empty --subdirectory-filter lib master