如何将文件以及历史记录从一个Git项目传输到另一个Git项目?

如何将文件以及历史记录从一个Git项目传输到另一个Git项目?,git,version-control,Git,Version Control,在Git中,将选定文件及其历史记录从一个项目传输到另一个项目的步骤是什么?例如,我有 Project A File A.1 File A.2 File a.3 File a.4 Project B File B.1 File B.2 这些都是不相关的(通过Git),我想以 Project B File B.1 File B.2 File A.1 File A.2 以及A.1和A.2的完整历史记录,但A.3或A.

在Git中,将选定文件及其历史记录从一个项目传输到另一个项目的步骤是什么?例如,我有

Project A
    File A.1
    File A.2
    File a.3
    File a.4

Project B
    File B.1
    File B.2
这些都是不相关的(通过Git),我想以

Project B
    File B.1
    File B.2
    File A.1
    File A.2
以及A.1和A.2的完整历史记录,但A.3或A.4没有(为简单起见,假设A.1和A.2是否也在项目B中保留历史记录)。涉及哪些步骤?我可以从这里和其他地方的阅读中得出结论,这是可能的,但我很难将零碎的东西粘贴到一个循序渐进的工作流程中

Dislamer:在尝试之前,最好将这两个存储库推送到一个远程主机,如GitHub或BitBucket。我只是在当地试过,一切都很顺利,但没有保证

这是一个多步骤的过程,可能不是一个完美的解决方案。从两个本地存储库开始,
projecta
projectb
。它们可能有一些重叠的文件,并且两者都可能有一些历史记录。最终目标是将
项目A
合并到
项目B
,保留历史记录,但从最终回购中完全删除所选文件

首先,将
项目A
合并到
项目B
。为此,我们必须将
projecta
作为远程分支添加到
projectb

git remote add old /path/to/project_a   # old is the remote name
git fetch old <branch>                  # fetch history from Project A (can specify single branch after)
git merge old/<branch>                  # merge the Project A branch into your working tree (most likely master)
这将转换为在该树(分支)的每次提交中运行此命令,直到
(工作副本)。您还可以通过用
a1b2c3…HEAD
替换
HEAD
来指定范围。第一个命令中的
-r
需要递归地从不需要的目录中删除文件。这两个命令都需要
-f
来忽略不存在的文件(某些提交可能没有要删除的文件,因为提交来自两个存储库)

最后,您可以通过删除
项目B
和旧的
项目A
之间的链接来进行清理

git remote rm old    # or whatever you named this branch

projectb
projecta
的分支、分支还是克隆?@SamSullivan:好问题。项目B与项目A不同:通过Git没有关系。编辑。我会尝试创建一个新的
项目B
回购协议,然后使用中的一些想法将
项目a
的历史合并到
项目B
。这会让我在B中获得所有的a,对吗?哦,是的。没有很好的方法做到这一点。您可以在
项目B
上签出一个新分支,在
项目a
中合并,删除不需要的文件(除了
文件a
文件B
之外的所有文件),然后将这个临时分支合并到您的主
项目B
分支。FWIW:For
filter branch
我必须确保我已经大大简化了项目的结构(删除了所有遥控器并缩减为单个分支)。最后我使用了不同的标记(上面的标记和我在其他答案中找到的标记都不顺利)。但这可能都是由于我的项目结构的一些特点。我也颠倒了步骤,在合并到B之前删减a(a的副本)。我从来没有在真实场景中使用过
过滤器分支,所以不确定它到底是怎么回事..但我很高兴您能够将所有内容排序。
git remote rm old    # or whatever you named this branch