git仓库拆分工具git-filter-repo| 豆包MarsCode AI刷题

349 阅读2分钟

背景

在进行git commit的时候提交了一个敏感文件,需要在整个git 历史中对于该文件进行删除,但是,因为发现该问题时已经进行了多次git push提交,要是只使用git reset 来恢复到很久前的状态再提交还得看一遍代码

如果要使用git filter-branch命令,但是在运行时,它提示这个命令会慢,建议使用替代工具git-filter-repo.

简单看看这个工具怎么用

git-filter-repo官方github地址:

github.com/newren/git-…

manual page:GitHub & BitBucket HTML Preview

参考文档:

这篇很全:josh.fail/2022/mergin…

blog.csdn.net/qq_43479892…

docs.github.com/zh/get-star…

这里是filter-branch转换为filter-repo命令的表格:github.com/newren/git-…

一、git-filter-repo安装

git-filter-repo 运行环境要求:

git >= 2.22.0 at a minimum; some features require git >= 2.24.0 or later

python3 >= 3.5

安装git-filter-repo:

git-filter-repo就是一个python脚本(将文件下载下来:raw.githubusercontent.com/newren/git-… 并该文件放到你的系统路径下即可,我选择的路径是:/usr/local/bin/git-filter-repo

sudo apt install python3 python3-pip
pip3 install git-filter-repo

二、git-filter-repo使用

原仓库tree:

|-- moduleA

| |-- subdir1

| |-- subdir2

| |-- subdir3

| |-- subdir4

主要使用了git-filter-repo的两个命令。

git filter-repo --subdirectory-filter moduleA/subdir1 将子目录moduleA/subdir1下的内容筛选到根路径下

  1. git filter-repo --path moduleA/subdir2 --path moduleA/subdir2 将子目录筛选出来,但路径保持不变

以上两个命令可以组合使用就可以达到你想要的分仓效果。

三、分仓后提交

在运行完git filter-repo命令后,使用如下命令进行推送

git push --set-upstream "ssh://新仓库git地址" master --force

四、示例

如我想把原仓库中的moduleA/subdir1下的内容放到一个新仓库中,则在当前仓库根下运行:

git filter-repo --subdirectory-filter moduleA/subdir1

git push --set-upstream "ssh://新git仓库地址" master --force

如我想把原仓库中的moduleA下的subdir2,subdir3放到一个新仓库中,则可以运行如下命令:

git filter-repo --subdirectory-filter moduleA

git filter-repo --path subdir2 --path subdir3

git push --set-upstream "ssh://新git仓库地址" master --force

将根目录移到某个子目录subdir中:

git filter-repo --path-rename :subdir/

其他高级用法

除了删除文件外,git filter-repo 还可以实现更多的功能,例如:

删除符合某种模式的所有文件:

Bash

git filter-repo --force --path-glob '*.zip' 1 替换文件内容:

Bash

git filter-repo --replace-text 1 在 中定义替换规则。

根据大小过滤文件:

Bash

git filter-repo --strip-blobs-bigger-than 10M 1 删除大于10MB的二进制文件。

总结

这个git-filter-repo工具还是很好用的,可以运行git-filter-repo --help 查看更多命令。