0

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

myProject/back
myProject/front

我想创建另一个存储库并将其提交故事移至其中。我的方法是什么?

4

2 回答 2

0

如今,最简单的方法是使用git subtree split将涉及该特定目录的历史记录到其自己的一系列提交中,然后git subtree add将其植入另一个存储库。

结果历史记录的唯一问题是,如果新存储库中的目录位于与原始存储库中不同的前缀(路径),则在浏览位于那个目录。

git filter-branch在将提取的历史记录植入新的存储库之前,这个问题可能很容易解决。
请参阅内容及其包含的参考资料。

于 2020-02-06T11:00:33.793 回答
0

好的,这里有详细的。假设您的项目是

 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也会在你的遥控器中创建旧功能。

于 2020-02-06T10:49:39.567 回答