如何将一个存储库移动到另一个存储库文件夹并保留 git 历史记录?

How to move one repo to another repo folder and keep git history?

我想将我的项目 (e.g.project-A) 移动到 monorepo 并保留整个 git 历史记录。现在使用

将远程存储库添加到新存储库时
git remote add A <remote-repo-project-A>

并使用

拉取项目
git pull project-A master --allow-unrelated-histories

源文件位于文件夹 monorepo\src 而不是 monorepo\apps\project-A\src

基本上我想将 repo-A 移动到具有以下结构的新 repo:

repo-A
---- src

new repo
---- projects
---- ---repo-A(rename to project-A)
---- ------src

历史,在 Git 中,只是提交。提交 历史。因此,对于您没有完全提出的问题的字面答案——“我可以在不更改提交内容的情况下更改提交的内容吗”——当然是。更重要的是,任何人或任何事物都不能更改任何提交,因为提交是 编号,并且数字是其内容的加密校验和。因此,如果您更改有关提交的任何内容,则会更改 number.

然而,一切并没有丢失。您可以将提交复制到new-and-improved提交,其与原始提交的唯一区别是......好吧,让我们以一个提交为例。原始提交说 文件被命名为 src/file1src/file2 等,这是它们的内容:...提交是由 ____ 在 ____ 及其 parents 是 ... new-and-improved 提交说 文件被命名为 projects/A/src/file1projects/A/src/file2 等,这是它们的内容......提交是由(同一个人)在(同一日期)进行的,其 parents 是(原始提交的 parents 的 new-and-improved 副本)。

这个复制过程很繁琐但很简单,可以通过 git filter-branchgit filter-repo 中所示的各种其他工具来完成(在许多其他非常相似的问题中).请注意,如果您有其他额外的存储库,其提交 - 或者更确切地说,new-and-improved 副本 提交 - 您希望在此存储库中拥有,您必须决定是否转换每个一次提交一组,然后尝试合并(合并)提交以将它们组合起来,或者编写一个 更高级 过滤器,尝试一次组合所有其他存储库的提交.也就是说,一个 new-and-improved 提交可能代表来自其他存储库的两个或多个“原始”提交。这是一个 更难的命题 并且现有的过滤程序可以做简单直接的事情不会为你做这件事。