我有一个包括背面和正面的项目。喜欢:
myProject/back
myProject/front
我想创建另一个存储库并将其提交故事移至其中。我的方法是什么?
如今,最简单的方法是使用git subtree split将涉及该特定目录的历史记录到其自己的一系列提交中,然后git subtree add将其植入另一个存储库。
结果历史记录的唯一问题是,如果新存储库中的目录位于与原始存储库中不同的前缀(路径),则在浏览位于那个目录。
git filter-branch在将提取的历史记录植入新的存储库之前,这个问题可能很容易解决。
请参阅此内容及其包含的参考资料。
好的,这里有详细的。假设您的项目是
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(tabula rasa!)
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
你说你想改变每一个分支。好吧,不要仅仅应用到 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会报错)
警告:您说要重写标记的提交,但不是相应的标记。警告:也许使用 '--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也会在你的遥控器中创建旧功能。