假设我的git存储库具有以下结构:
/.git
/Project
/Project/SubProject-0
/Project/SubProject-1
/Project/SubProject-2
并且存储库有一些提交。现在其中一个子项目(SubProject-0)变得非常大,我想将SubProject-0取出并将其设置为独立项目。是否可以从父git存储库中提取涉及SubProject-0的所有提交历史记录并将其移动到新的?
答案 0 :(得分:37)
请参阅http://git-scm.com/docs/git-filter-branch
我认为你需要像
这样的东西git filter-branch --subdirectory-filter Project/SubProject-0 --prune-empty -- --all
在存储库的克隆中。
答案 1 :(得分:1)
我需要做类似的事情,但我想基本上将一个子项目从回购转移到另一个。我所做的是使用fetch,因为它可以从任何来源获取对象。
所以,基本上,我创建了一个新分支,删除了该分支中不需要的东西,然后使用git fetch将分支从一个repo拉到另一个repo。一旦我拥有了这些对象,合并就可以了。
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表示“在源上获取temp并将其保存为temp in here”。从那里你可以将结果合并到你的主人。
git merge temp
然后你可以删除临时分支,因为在第一种情况下它不是你想要与原始仓库合并的东西,在第二种情况下你已经合并了它。
我确信这些步骤可能会被压缩一点,但这个设置看起来很清楚。