如何拆分 "historical" git 存储库?

How to split a "historical" git repository?

我这里有一个相当特殊的情况:我在不同的 VCS (git,svn) 中有一些旧的存储库。我现在want/have稍微整理一下。

我们的目标是将所有内容迁移到一个 VCS,因此我们决定 git。 在第一步中,我使用 git svn 将 "foreign" VCS 历史导入到 git。目前一切正常。

另一个问题是用户没有正确使用 SVN,因为所有文件(包括 generated/compiled 文件)都已添加到 VCS。 结果,历史相当庞大和繁琐。 由于新项目将很快从实际版本开始,我正在寻找一种解决方案,以避免将整个二进制数据保存在 git 的每个开发仓库中。另一方面,我不想扔掉所有旧的东西。将来可能需要它。由于有多个分支机构,...

我发现 linux 内核也使用了历史拆分的信息(参见 this question on Whosebug)。 我尝试了一下 linux 内核存储库,看看那里的情况如何。

现在我不确定我是否理解正确,是否以正确的方式去做。通常我会从工作副本创建一个孤立的分支,并将其用作任何未来开发的起点:

git checkout --orphan new_master
<Commit all source files and leave all bin files out>
git remote add new_origin <...>
git push new_origin new_master:master

如果需要旧历史,我需要克隆新创建的存储库以及 "historical" 存储库。我在 git 中有两条独立的工作线,逻辑上是 linked.I 然后为新回购的初始提交添加移植到历史回购的最终提交,并且应该设置一个完整的回购.

我说得对还是有更好的方法?

你可以简单地使用像

这样的东西
git init
git add .
git commit -m "Import project blablabla"

在包含您要导入的所有文件的目录中(但不包括像 .svn 这样的目录),并获取一个没有历史记录的新 Git 存储库。

git checkout --orphan 如果您已经有导入的历史记录并且如果此历史记录的最新提交包含正确的文件,则也可以使用。

然后,您想将此提交移植到导入的历史记录之上。 Graft points were initially created for this use-case, but they were superseded by git replace. The manual page for git replace is hard to read, but there's a Replace Kicker教程。