我有一个git,它有一个源文件,其中包含一些我希望删除的敏感内容(,我不想删除该文件,只需要修改它的内容)。提交在项目开发的早期(当我们只有一个分支时),但是现在在其他分支中找到了它自己。
我能跑去打扫所有的树枝吗?一个交互的重基一次只能工作一个头。
我在github找到了这命令:
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
发布于 2014-04-08 09:46:11
假设修改后的内容也不敏感,那么这个可能会工作:在提交时签出要修改的一个新分支,修改文件,然后使用一个非交互式的重基,在以前未修改的提交返回到新的修改提交后保留所有内容的合并:
# 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
一旦您验证了重基之前和之后master
之间唯一的区别是修改后的内容,您可能希望通过终止reflog并运行git gc
来清除本地和远程repos的旧提交
git reflog expire --expire=now --all
git gc --prune=now
您可以从以下步骤了解可能需要执行的任何其他清理步骤:
顺便说一句,请先在另一个本地克隆上测试重基(),然后在您的回购( have...in case )的唯一副本上尝试这一点--有些地方出了问题。
哦,是的,我几乎忘了,如果您在STUPID
上的修改会导致与正在重定向的提交发生冲突,那么您将需要在重基期间修复这些冲突。
这位1337年的git-fu给你带来了Cupcake的服务:自2012年以来对git repos进行心脏直视手术;)
https://stackoverflow.com/questions/22943812
复制