我有一个包括背面和正面的项目。 喜欢:
myProject/back
myProject/front
我想创建另一个存储库,并通过其提交故事进入它。 我的方式是什么?
好的,这里有详细说明。假设你的项目是
git@github.com/Vadim/myProject.git
首先,创建一个新的远程存储库并将源设置为它。我们不想强迫所有历史被遗忘。
您的新存储库是
git@github.com/Vadim/mySubfolderProject.git
所以基本上,如果你想这样做,你可以将旧的复制到一个新的:
cp -R myProject mySubfolderProject
然后将新的指向其全新的遥控器
cd mySubfolderProject
git remote ser-url origin git@github.com/Vadim/mySubfolderProject.git
现在我们安全了。假设你只想保持master
(白板!
git reset --hard HEAD
git checkout master
git clean -fd
那好吧:
git filter-branch --subdirectory-filter front HEAD
这将重写历史记录中的每个提交,就好像front
是根文件夹一样。但是等等,有很多没有与所述子文件夹交互。让我们把他们拒之门外。
git filter-branch --prune-empty --subdirectory-filter front HEAD
你说你想改变每个分支。好吧,那么,不要只应用于头部,而是将其应用于所有人:
git filter-branch --prune-empty --subdirectory-filter font -- --all
(您知道,用破折号分隔参数组(
这将使标签分开。如果您不需要它们,请在此过程之前删除它们,但如果要保留它们:
git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter font -- --all
(其实不用--tag-name-filter cat
会抱怨(
警告:你说重写标记的提交,但没有相应的 标记。警告:也许使用"--标签名称过滤器猫"来重写标签。 Ref 'refs/tags/v1.3.1' 被重写
最后,您的.git
文件夹中有很多空间。你的树枝永远改变了,但.git
记得。让我们解决这个问题
git gc --aggressive --prune=now
现在推送到您全新的遥控器:
git push origin --all
你去吧。
编辑:
虽然这将重写所有分支的历史记录,但它不会在新的远程中创建它们,除非您在本地结帐(这会将其设置为跟踪其远程对应项(。因此,如果您还想推送一个失传已久的功能:
git checkout feature/old_stuff
Branch 'feature/old_stuff' set up to track remote branch 'feature/old_stuff' from 'origin'.
Switched to a new branch 'feature/old_stuff'
所述旧功能也被重写,并以front
为根。 别有用心的git push
也会在您的遥控器中创建旧功能。
目前最简单的方法是使用git subtree split
将触及该特定目录的历史记录挑选到其自己的一系列提交中,然后使用git subtree add
将其植入另一个存储库中。
生成的历史记录的唯一问题是,如果新存储库中的目录位于与原始存储库中的前缀(路径(不同的前缀(路径(,则在浏览位于该目录中的文件的历史记录时,可能会得到令人困惑的结果。
在将提取的历史记录植入新存储库之前,可以通过git filter-branch
提取的历史记录轻松解决此问题。
请参阅此内容及其包含的参考资料。