Skip to content

Instantly share code, notes, and snippets.

@ethomson
Forked from carlosmn/rewrite-lg2s.sh
Created October 21, 2016 09:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ethomson/7f87905755073cd81a85467bc391051d to your computer and use it in GitHub Desktop.
Save ethomson/7f87905755073cd81a85467bc391051d to your computer and use it in GitHub Desktop.
An extremely case-specific implementation of git-filter-branch
#!/bin/bash
# It's no libgit2, but it's pretty useful
. $(git --exec-path)/git-sh-setup
cd_to_toplevel
require_clean_work_tree
set -e
# git-sh-setup provides get_author_ident_from_commit but not this one, so let's just copy it
get_committer_ident_from_commit () {
encoding=$(git config i18n.commitencoding || echo UTF-8)
git show -s --pretty=raw --encoding="$encoding" "$1" -- |
parse_ident_from_commit committer COMMITTER
}
clear_local_git_env
# Detach and put us on the first commit which doesn't get rewritten
git checkout -q -f 41bc8c6
# Now we need to put the other two on top, we take their tree and
# commit that, keeping their commiter ident intact as well
pick_one () {
local active_commit="$1"
clear_local_git_env
eval $(get_author_ident_from_commit "$active_commit")
eval $(get_committer_ident_from_commit "$active_commit")
export GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL GIT_COMMITTER_DATE
git read-tree "$active_commit"
git commit -q -C "$active_commit"
clear_local_git_env
}
pick_one 6dcf9bf75
pick_one e90810b8d
git checkout -q -f
git checkout -q -B test
echo "There you go, boss, your rewritten test branch is at"
git rev-parse HEAD
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment