背景
在进行git commit的时候提交了一个敏感文件,需要在整个git 历史中对于该文件进行删除,但是,因为发现该问题时已经进行了多次git push提交,要是只使用git reset 来恢复到很久前的状态再提交还得看一遍代码
如果要使用git filter-branch命令,但是在运行时,它提示这个命令会慢,建议使用替代工具git-filter-repo.
简单看看这个工具怎么用
git-filter-repo官方github地址:
manual page:GitHub & BitBucket HTML Preview
参考文档:
这里是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下的内容筛选到根路径下
-
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 查看更多命令。