When I started my git repo I commited a few files as initial commit to it. Now, many commits later, I noticed that I included in those files a line with information which I do not want to publish (unlike the rest of the code). So I want to remove/change this one line an开发者_运维百科d keep the rest of the code.
Searching around I found this solution: Insert an empty commit as initial commit (described here: Insert a commit before the root commit in Git?), do a rebase on it and then edit the old first commit via amend. Unfortunately, many cruel merge conflicts arise during rebase (as described here: git: solving conflicts caused by rebase).
Is there a different way to solve my problem or do have to rebase and edit all conflicts by hand?
Thanks in advance :)
Here's a command that will remove an offending line from a file's history in all your branches:
git filter-branch --tree-filter 'sed -i "/sensitive information/ d" filename' -- --all
This checks out every revision, runs the sed
command on it, then commits that revision back.
The sed
command in this case matches any lines containing the pattern sensitive information
in the file named filename
and deletes those lines.
Note: it's good if you have a backup, and try the sed
script on its own first to make sure it's doing what you want, because it can take quite a while to run on a long history.
I made this command that doesn't error out when a file doesn't exist:
filename=./path/to/your/filename
filter=your_regex_here
git filter-branch --tree-filter 'test -f $filename && sed -i.bak "/$filter/d" $filename || echo “skipping file“' -- --all
My answer combines the best of everything. It replaces the just the given filter string instead of the whole line and it nicely skips if the file is not found in a commit. There are a lot of escaped quotes but the other answer had really weird quotes that didn't work for me.
git filter-branch --tree-filter "test -f \"$filename\" && sed -i \"s/$filter//g\" \"$filename\" || echo \"skipping $filename\"" -- --all
You can have a look at git filter-branch
The examples in the link should get you going: http://git-scm.com/docs/git-filter-branch
精彩评论