Git - 将包含其历史记录的文件夹移动到另一个项目中



我有一个包括背面和正面的项目。 喜欢:

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提取的历史记录轻松解决此问题。
请参阅此内容及其包含的参考资料。

最新更新