[英]How do I transfer files, along with history, from one Git project to another?
在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中的历史记录)。 涉及哪些步骤? 我可以从这里和其他地方的阅读中学到,这是可能的,但是我很难将点点滴滴粘贴到逐步的工作流程中。
免责声明:在尝试之前将两个存储库都推送到GitHub或BitBucket等远程主机可能会很好。 我只是在本地尝试过,但一切都顺利,但没有保证。
这是一个多步骤的过程,可能不是一个完美的解决方案。 从2个本地存储库开始,即Project A
和Project 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 B
的工作树中合并一个Project A
和Project 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.