32

假设我的 git 存储库具有以下结构:

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

并且存储库有很多提交。现在其中一个子项目 (SubProject-0) 变得非常大,我想将 SubProject-0 取出并将其设置为独立项目。是否可以从父 git 存储库中提取所有涉及 SubProject-0 的提交历史并将其移动到新的?

4

2 回答 2

37

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

我认为你需要类似的东西

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

在存储库的克隆中。

于 2010-03-29T13:41:02.743 回答
3

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

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

例如

在具有原始内容的存储库上:

    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 表示“在源上获取 temp 并将其保存为 temp in here”。从那里您可以将结果合并到您的主文件中。

    git merge temp

然后,您可以删除临时分支,因为在第一种情况下,您不想与原始存储库合并,而在第二种情况下,您已经合并了它。

我敢肯定这些步骤可能会被压缩一点,但这一套看起来不错而且清晰。

于 2011-06-28T05:46:58.003 回答