提取git存储库的一部分?

提取git存储库的一部分?,git,repository,extraction,Git,Repository,Extraction,假设我的git存储库具有以下结构: /.git /Project /Project/SubProject-0 /Project/SubProject-1 /Project/SubProject-2 而且存储库有相当多的提交。现在其中一个子项目(SubProject-0)变得相当大,我想将SubProject-0取出并将其设置为一个独立的项目。是否可以从父git存储库中提取所有涉及SubProject-0的提交历史记录,并将其移动到新的git存储库中 见 我想你需要像这样的东西 git filt

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

/.git
/Project
/Project/SubProject-0
/Project/SubProject-1
/Project/SubProject-2
而且存储库有相当多的提交。现在其中一个子项目(SubProject-0)变得相当大,我想将SubProject-0取出并将其设置为一个独立的项目。是否可以从父git存储库中提取所有涉及SubProject-0的提交历史记录,并将其移动到新的git存储库中

我想你需要像这样的东西

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

在存储库的克隆中。

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

因此,基本上,我创建了一个新分支,删除了该分支中不需要的内容,然后使用git fetch将该分支从一个回购协议拉到另一个回购协议。一旦我有了这些对象,merge就完成了这个任务

例如

在包含原始内容的存储库上:

    git checkout -b temp master
    git rm -r Unneeded_stuff
    git commit -m 'pruning'
然后,您可以将该分支从一个存储库提取到一个完全不同的存储库(不相关):

其中temp:temp表示“在源上获取temp并将其另存为temp”。从那里你可以将结果合并到你的主文件中

    git merge temp
然后,您可以删除临时分支,因为在第一种情况下,您不想将其与原始回购合并,而在第二种情况下,您已将其合并


我相信这些步骤可以压缩一点,但这一组看起来很好而且清晰。

@Rio您可能还想使用
--prune empty
选项来删除只涉及
项目/子项目-0
的提交。请注意,这是(正如Jim DeLaHunt在回答中所说的)的副本。很抱歉,让您对一篇旧帖子感到困惑,但是这回答了一个有用但与OP不同的问题。你能为这个答案创建一个新的q/a对吗?这样会更容易找到。最好使用filter方法创建一个临时存储库,只包含要移动的文件,然后从临时存储库中执行合并步骤,因为这样做仍然具有原始回购的完整历史记录(仅在最后提交时执行删除步骤)。
    git merge temp