Linux命令 git filter-branch


原文链接: Linux命令 git filter-branch

filter-branch

--tree-filter表示修改文件列表。
--msg-filter表示修改提交信息,原提交信息从标准输入读入,新提交信息输出到标准输出。
--prune-empty表示如果修改后的提交为空则扔掉不要。在一次试运行中我发现虽然文件被删除了,但是还剩下个空的提交,就查了下 man 文档,找到了这个选项。
-f --force 是忽略备份。不加这个选项第二次运行这个命令时会出错,意思是 git 上次做了备份,现在再要运行的话得处理掉上次的备份。
--all是针对所有的分支。

移除项目中的敏感信息

git filter-branch --force --index-filter
'git rm --cached --ignore-unmatch 要删除的文件名'
--prune-empty --tag-name-filter cat -- --all

echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

git push origin --force --all
git push origin --force --tags

彻底删除已经从本地仓库缓存的文件
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

filter-branch 全局修改邮箱地址

git filter-branch --commit-filter '
       if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ];
       then
               GIT_AUTHOR_NAME="Scott Chacon";
               GIT_AUTHOR_EMAIL="schacon@example.com";
               git commit-tree "$@";
       else
               git commit-tree "$@";
       fi' HEAD

name and email。 一句话不割:
git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='newemail';" HEAD

filter-branch 从每一个提交移除一个文件或目录

git filter-branch --tree-filter 'rm -rf *~'
git filter-branch -f --tree-filter 'rm -rf *~' HEAD
git filter-branch -f --all --tree-filter 'rm -rf *~' HEAD #作用于所有分支

filter-branch 一个子目录做为新子项目

git filter-branch --subdirectory-filter subdir HEAD
git filter-branch --prune-empty --subdirectory-filter SUB_FOLDER BRANCH-NAME
git subtree split --prefix=SUB_FOLDER -b BRANCH-NAME

`