Git

Git迁移文件到其他仓库保留commit

Git

Posted by Karim on June 19, 2022

在开发的过程中,往往存在架构上调整导致类需要迁移到其他的仓库,假设A仓库的目录如下:

------------------
src/
    views/
        index.html
        ...
    models/
        index.js
        ...
    controllers/
        index.js
        ...

我们要将A仓库中models,迁移到B仓库,并保留A仓库的commit,这个时候需要用到git filter-repo, macOS上的git并没有自带filter-repo,这时候需要用到homebrew安装:

brew install git-filter-repo

首先我们需要fork A仓库,因为git-filter-repo会只保留你迁移的文件,其他都会被移除。

#从fork_A仓库中执行下方的命令,folder_path为A仓库下保留的文件夹路径
fork_A % git filter-repo --path ${folder_path}/
#多目录可以这样使用
fork_A % git filter-repo --path ${folder_path_A}/ --path ${folder_path_B}/
  • --path 会保留原来仓库目录下的文件
  • --invert-paths --path 会删除path目录下的文件
  • --subdirectory-filter 会仅保留根目录,同时将目录下所有文件都移动到根目录下

还有更多的参数可以参考官方文档,这里就不一一细说了。

执行上方命令后,会发现本地仓库,只剩下${folder_path}下的文件目录结构

然后去到我们要将${folder_path}文件下迁移到的B仓库目录下

#<repo_A_directory>为本地路径
B % git remote add from_repo_A <repo_A_directory>
B % git pull from_repo_A main --allow-unrelated-histories 
B % git remote rm from_repo_A

然后就能看到B仓库的目录结构如下:

B/
    models/
        index.js

参考链接

利用git-filter-repo无缝迁移git项目
Git跨仓库迁移代码文件,并保留git历史记录


请保持转载后文章内容的完整,以及文章出处。本人保留所有版权相关权利。

分享到: