假设:我们要将 source 仓库(repo)下的 foo 文件夹 移动到 destination 仓库下,除了文件内容迁移外,还包括相关的所有日志。
source仓库: https://github.com/user/source.git
destination仓库: https://github.com/user/destination.git
步骤1
为了不改变当前克隆出来的版本,我们需要重新克隆一个原始备份出来,在原始备份里进行操作,依次执行如下命令
mkdir backup
cd backup
git clone https://github.com/user/source.git
cd source
步骤2
将我们需要复制的文件夹更改到当前备份克隆里的根目录下,这里 git 提供了 git filter-branch 命令允许我们调整整个仓库的目录结构:只保留过滤器指定的文件及相关日志, 删除其他文件内容。
为了防止我们误操作导致覆盖线上仓库的内容,我们需要先解除备份仓库与线上仓库的关系,因此此步骤依次执行如下命令
git remote rm origin
git filter-branch --subdirectory-filter foo -- --all
这里如果存在 tag 被覆写(rewritten),则会报警告要求使用 "--tag-name-filter cat", 不过可以忽略不管。当然,如果要复