git:将一个存储库的历史记录复制(复制)到另一个存储库的目录

时间:2019-01-10 03:56:13

标签: git

我有两个仓库。第一个回购(我们称其为A)是前一段时间开始的;第二个回购(B)是最近才开始的。现在我们正在考虑,我们宁愿将B设为A的子目录。所以我想这样做,但要保留B的提交历史记录。

  • 我想要完整的提交历史记录。即,我不想只是将B的历史记录压缩为一个补丁并将其作为A中的新提交丢弃。
  • 我不在乎保留B的确切SHA1(我知道这可能是不可能的)。
  • 我不在乎保留B提交的时间戳记(尽管那很高兴)。
  • 我不在乎保留作者身份。
  • 我只想保留B的每个提交的差异/补丁。
  • 我不在乎保留两个独立存储库的任何概念。实际上,我只希望前进。
  • 我不需要B成为A的git子模块,它具有自己的.git目录或类似的内容。

在完成任何操作后,我希望满足三个条件:

  1. 在B的HEAD处看到的文件和目录在A的子目录中,即/path/to/repoB/somefile.js/path/to/repoA/B/somefile.js处找到
  2. 在A的提交的时间顺序上依次看到B的所有提交消息
  3. 每个提交的差异均可用(git log等可见)

一些例子可以阐明我的意图:

  1. 在存储库B中,提交1是添加file.txt
  2. 提交2是编辑file.txt
  3. 因此在回购A中,我想要两个新提交:
  4. 回购A提交98:添加B/file.txt
  5. 回购A提交99:编辑B/file.txt

编辑:

已提出

Merge git repository in subdirectory作为我的问题的副本。我承认这非常接近我的要求,并且有几个很好的答案。我在那里尝试了subtree答案,也尝试了rebase --onto答案。两者都非常接近,但并不令人满意:subtree不允许git log在没有参考path/to/file/without/repo-subdir的情况下查看整个存储库历史记录的历史记录(我将B移到repo-subdir );并且rebase --onto无法使A的HEAD看到B的历史记录。

1 个答案:

答案 0 :(得分:2)

这就是我最终要做的。感谢Freenode(IRC)中atrus的{​​{1}}向我指引正确的方向。

  1. 在存储库B 中,建立一个新分支:#git
  2. 在仓库B中,git checkout -b indir,其中mkdir b-subdir是我打算让B结束于A的目录树中的目录。
  3. 在仓库B中,b-subdir将所有内容(git mv [...] b-subdir.git/本身除外)移到b-subdir/中。
  4. 提交到仓库B的动作。
  5. 推入原点(b-subdir)。
  6. 在回购A中push -u origin HEAD
  7. git remote add repo-b ssh://......../repo-b.git
  8. git fetch repo-b

这使我可以查看来自存储库B(使用git merge --allow-unrelated-histories repo-b/indir的{​​{1}}开关)的任意文件的完整历史记录,而无需删除{{ 1}}从文件路径开始。使用--follow,如果您删除文件的历史记录,则只会在B中看到该文件的历史记录;否则,您只会在A中看到该文件的历史记录。

相关问题