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

时间:2014-01-06 19:46:05

标签: 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.4没有,(为简单起见,我不关心A.1和A.2是否也留下了B项的历史)。涉及的步骤是什么?我可以从这里和其他地方的阅读中收集到这是可能的,但是我很难将这些零碎的工作分成一步一步的工作流程。

1 个答案:

答案 0 :(得分:1)

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

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

首先将Project A合并到Project B。为此,我们将Project A添加为Project B的远程分支。

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)

现在,您将在Project A的工作树中合并Project BProject B。您可能需要解决合并冲突(如果是,请在此之后提交)。

下一步是从此组合存储库中删除不需要的文件(或目录)。历史上将git filter-branch用于执行此操作。 注意:这将重写历史记录,因此如果某人正在处理Project B,则会出现重大冲突,不建议使用(相反,只需正常删除文件并进行额外提交即可。这将使历史保持清醒。)

git filter-branch --tree-filter 'rm -rf path/to/unwanted/dirs' HEAD
git filter-branch --tree-filter 'rm -f unwanted_file' HEAD

这转换为在此树(分支)的每次提交中运行此命令,直到HEAD(工作副本)。您还可以将HEAD替换为a1b2c3...HEAD来指定范围。需要第一个命令中的-r以递归方式从不需要的目录中删除文件。两个命令都需要-f来忽略不存在的文件(某些提交可能没有您要删除的文件,因为提交来自2个存储库)。

最后,您可以删除Project B与旧版Project A之间的链接进行清理。

git remote rm old    # or whatever you named this branch