2010-03-29 75 views
31

假设我的git仓库的结构如下:提取git存储库的一部分?

/.git 
/Project 
/Project/SubProject-0 
/Project/SubProject-1 
/Project/SubProject-2 

和档案库有相当长的一段提交。现在其中一个子项目(SubProject-0)增长很大,我想将SubProject-0取出并将其设置为独立项目。是否有可能从父git存储库中提取涉及SubProject-0的所有提交历史记录并将其移至新的历史记录?

+2

请注意,这是一个http://stackoverflow.com/questions/359424/detach-subdirectory-into-separate-git-repository(如吉姆DeLaHunt在他的答案中所述)的副本。 – 2012-10-03 06:36:39

回答

36

http://git-scm.com/docs/git-filter-branch

我认为你需要像

git filter-branch --subdirectory-filter Project/SubProject-0 --prune-empty -- --all 

在仓库的一个克隆。

+0

谢谢!奇迹般有效! – Rio 2010-03-29 14:01:25

+2

@Rio您可能还想使用'--prune-empty'选项来清除仅触及'Project/SubProject-0'的提交。 – 2010-03-29 15:07:51

+0

哇完美!谢谢 – alvatar 2010-10-10 15:30:35

1

我需要做类似的事情,但我想从本质上将一个子项目从一个回购移到另一个。我所做的是使用fetch,因为它可以从任何来源获取对象。

因此,基本上,我创建了一个新分支,删除了该分支中不需要的东西,然后使用git fetch将分支从一个回购仓库拉到另一个仓库。一旦我有了这些对象,合并就完成了。

E.g.

在具有原始材料库:

git checkout -b temp master 
    git rm -r Unneeded_stuff 
    git commit -m 'pruning' 

然后,你可以从一个存储库分支提取到一个完全不同的(无关):

cd /path/to/other/repository 
    git fetch /path/to/source/repo temp:temp 

其中温度:温度手段“在源上获取temp并将其保存为temp”。从那里你可以将结果合并到你的主人。

git merge temp 

然后,您可以删除临时分支,因为它不是你想与原来的回购合并一些第一种情况,而在第二种情况下,你把它合并。

我确定这些步骤可能会被压缩一点,但这个设置看起来不错而且清晰。

+0

对不起,你会发现一个旧帖子,但这是回答一个有用的,但不同于OP的问题。你可以为这个答案创建一个新的q/a对吗?这将使它更容易找到。 – tacaswell 2014-02-18 15:20:04

+0

,最好使用过滤器方法创建一个只包含要移动的文件的临时存储库,然后执行临时存储库的合并步骤,因为这样做仍然具有原始存储库的完整历史记录(只是作为最后一次提交的删除步骤)。 – tacaswell 2014-02-18 15:22:01