Skip to content

Instantly share code, notes, and snippets.

@gerasiov
Created November 12, 2020 15:21
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 gerasiov/fdb606498106b9443d9e8016c6b54b79 to your computer and use it in GitHub Desktop.
Save gerasiov/fdb606498106b9443d9e8016c6b54b79 to your computer and use it in GitHub Desktop.
#!/usr/bin/python3
import subprocess
import shlex
def call(cmd):
print(">>> {}".format(cmd))
return subprocess.check_call(cmd, shell=True)
def call_output(cmd):
print(">>> {}".format(cmd))
return subprocess.check_output(cmd, shell=True).decode().strip()
BRANCH=u"master"
NUMBER_OF_COMMITS=200
FIRST = call_output("git rev-list origin/{}".format(BRANCH)).split()[NUMBER_OF_COMMITS]
NEW=call_output("echo 'Import commit " + FIRST + "' | git commit-tree $(git cat-file -p " + FIRST + " | awk '/tree/ {print $2}')")
print(FIRST, NEW)
call("git diff -s {} {}|cat".format(FIRST, NEW))
call("git checkout {} -B {}".format(NEW, BRANCH))
merge_map = dict()
merge_map[FIRST] = NEW
merges = call_output("git rev-list --merges --reverse {}..origin/{}".format(FIRST, BRANCH)).split()
for merge in merges:
print("merge: ", merge)
dev = call_output("git rev-list --parents -n 1 {} | cut -f2 -d' '".format(merge))
branch = call_output("git rev-list --parents -n 1 {} | cut -f3 -d' '".format(merge))
merge_base = call_output("git merge-base {} {}".format(dev, branch))
new_merge_base = merge_map.get(merge_base, NEW)
call("git checkout {} -f -B branch".format(new_merge_base))
commits = call_output("git rev-list --reverse --no-merges {}..{}".format(merge_base, branch)).split()
try:
for commit in commits:
call("git cherry-pick {}".format(commit))
except subprocess.CalledProcessError:
call("git reset --hard")
call("git checkout -f {}".format(BRANCH))
call("git cherry-pick -m 1 {}".format(merge))
call("git diff -s {} HEAD|cat".format(merge))
merge_map[merge] = call_output("git rev-list -1 HEAD")
continue
author = call_output("git show -s --format='%an <%ae>' {}".format(merge))
date = call_output("git show -s --format='%ad' {}".format(merge))
msg = call_output("git show -s --format='%B' {}".format(merge))
call("git checkout {}".format(BRANCH))
call("git merge --no-ff branch -m {}".format(shlex.quote(msg)))
call("git commit --amend --author='{}' --date='{}' --no-edit".format(author, date))
call("git diff -s {} HEAD|cat".format(merge))
merge_map[merge] = call_output("git rev-list -1 HEAD")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment