I don't know if there is a way to do this using the GUI.
If the things you want to extract are contained in their own folders, this is pretty easy on the command line. One method is described here using git filter-branch --subdirectory-filter :
fooobar.com/questions/965297 / ...
If your files and folders are not so well maintained or do not match a simple template (that is, they only store * .py files, etc.), one method that I call "grooming" is to simply continue to work with simple filtering commands - The colors are on the clone, not on the original! - Continue to separate parts until your story contains what you want.
Of course, we always want to check what we are doing. This will show a sorted, unique list of all relative file / folder paths that ever existed in your repo:
$ git log --pretty='format:' --name-only | grep -v '^$' | sort -u
Let's say that in this list you see the folders foo and bar/baz that you want to remove from the history (i.e. get rid of baz , which is in bar and foo ):
$ git filter-branch -f --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch foo bar/baz'
Now you can run the previous log command to make sure that these links do not exist anywhere in time, and select more things from this smaller list to get rid of. Or you can embed each path into a single filter-branch call. I just feel better with fewer steps and verification, just as I prefer to do it competently.
The branch filtering backs up every time, and the second run will be stopped due to its existence. What is -f ? You will overwrite your backup every time you filter again, but that's fine, because you do it on a clone (right !?), and you can always do it again on a new clone if you mess it up a lot.
In the end, you'll want to clear the heads of refs/original/* , which will point to the last heading of the branch that you filter after each pass. If you branch the master branch with a filter, you will have a file refs/original/refs/heads/master pointing to the old master header, pre-filtering. When you press the next pass, you will point to a new one. If for some reason you want to keep pointers to each backup after each filtering, simply drop the branch or tag for these "source" links after each pass. Either remove the tag / branch before filtering or just use reflog.