跨多个分支的 Git 交互式变基

Jon*_*tes 6 git rebase git-rebase git-rewrite-history git-branch-sculpting

我有一个 git repo,它有一个源文件,其中包含一些我希望删除的敏感内容(我不想删除该文件,只需修改其内容)。提交是在项目开发的早期(当时我们只有一个分支),但现在在其他 n 个分支中找到了它自己。

是否有任何 git-fu 我可以运行以在所有分支中清理它?交互式 rebase 一次只能对一个 Head 起作用。

我确实在 github 上找到了这个命令:

git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch DotNet/src/ExternalLibs/GemBox/' \
--prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)

但它只适用于删除,而不是修改

A-B-C-**STUPID**-D-E-F
                    \
                     \-G-H-I
                          \-J-K
Run Code Online (Sandbox Code Playgroud)

小智 3

假设修改后的内容也不是敏感的,那么这可能会起作用:在要修改的提交处签出一个新分支,修改文件,然后使用非交互式变基来保留先前未修改后的所有内容的合并重新提交到新修改的提交:

# Checkout a branch "fix" at the commit STUPID
git checkout -b fix STUPID

# Make your file changes...

# Amend STUPID
git add .
git commit --amend -m "REDACTED MWA-HA-HA!"

# Do the BIGGEST rebase that you'll probably ever do in your entire life!
git rebase --preserve-merges --onto fix STUPID master
# or `-p` for short
git rebase -p --onto fix STUPID master

# Verify that the only difference between master and master@{1}
# is the amended content:
git diff master@{1} master
Run Code Online (Sandbox Code Playgroud)

一旦您确认master变基前后的唯一区别是修改后的内容,您可能希望通过使引用日志过期并运行以下命令来清除本地和远程存储库中的旧提交git gc

git reflog expire --expire=now --all
git gc --prune=now
Run Code Online (Sandbox Code Playgroud)

您可以在以下位置了解可能需要执行的任何其他清理步骤:

  1. 从 Git 历史记录中删除敏感文件及其提交
  2. GitHub:删除敏感数据

顺便说一句,请先在另一个本地克隆上测试变基,然后再在您拥有的唯一存储库副本上尝试此操作……以防出现问题。

哦,是的,我差点忘了,如果你的修改导致STUPID与基于它的提交发生冲突,你需要在重新调整期间修复这些冲突。

这个 1337 git-fu 是由Cupcake为您带来的自 2012 年以来在 git 存储库上进行心脏直视手术;)