跨多个分支的Git interactive-rebase

时间:2014-04-08 17:11:24

标签: git rebase git-rebase git-rewrite-history git-branch-sculpting

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

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

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

git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch DotNet/src/ExternalLibs/GemBox/' \
--prune-empty --tag-name-filter cat -- --all

但它仅适用于删除,而非修订

A-B-C-**STUPID**-D-E-F
                    \
                     \-G-H-I
                          \-J-K

1 个答案:

答案 0 :(得分:2)

假设修改后的内容也不敏感,那么 可能 工作:在你要修改的提交中签出一个新分支,修改文件,然后使用非交互式rebase,在先前未修改的提交之后保留所有内容的合并回到新修改的提交中:

# 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

一旦您确认了rebase之前和之后master之间的唯一区别是修改后的内容,您可能希望在到期之前清除旧提交的本地和远程回购您的reflog并正在运行git gc

git reflog expire --expire=now --all
git gc --prune=now

您可以阅读以下可能需要执行的任何其他清理步骤:

  1. Remove sensitive files and their commits from Git history
  2. GitHub: Remove sensitive data
  3. 顺便说一句, 请先在另一个本地克隆上测试rebase ,然后再尝试使用你的repo的唯一副本...以防万一出错了。

    哦,是的,我几乎忘记了,如果你在STUPID的修正案导致与在其之上被重新设定的提交冲突,那么你需要在rebase期间解决这些冲突。

    这个1337 git-fu带来了你的礼貌 蛋糕 自2012年开始对git repos进行心脏直视手术; )