提取Git仓库的部分内容?

36

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

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

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


3
请注意,这是 https://dev59.com/cXRC5IYBdhLWcg3wROpQ 的复制(正如Jim DeLaHunt在他的回答中所说)。 - Fabian Fagerholm
2个回答

40

3
你可能还想使用--prune-empty选项来清除仅涉及到Project/SubProject-0的提交。 - Greg Bacon
2
这对我也起作用了。但值得一提的是,这个filter-branch似乎已经有点过时了,因为它会打印出以下信息:“git-filter-branch存在大量陷阱,生成混乱的历史重写。在继续之前按Ctrl-C中止,然后使用其他过滤工具,如'git filter-repo'”。 - bridgemnc

4
我需要做类似的事情,但我想要从一个存储库实质上将子项目移动到另一个存储库。我所做的是使用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”。从那里,您可以将结果合并到主文件中。

    git merge temp

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

我相信这些步骤可以压缩一下,但是这个集合看起来很清晰。


抱歉打扰您关于旧帖子的问题,但这回答了一个有用但不同于OP的问题。您能为此答案创建一个新的问答对吗?这将使其更容易找到。 - tacaswell
最好使用过滤器方法创建一个临时存储库,仅包括您想要移动的文件,然后在临时存储库上执行合并步骤,因为这样做仍然具有原始存储库的完整历史记录(只是最后一次提交是删除操作)。 - tacaswell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接