Git und Gerrit: Repositories mergen, Review-DB anpassen

Notiz an mich selber: Wenn ich zwei Repositories mergen will, indem ich Repository A als Unterverzeichnis von Repository B einbinde, dann ist das ein recht trivialer Rewrite-Vorgang, gefolgt von einem Merge ohne gemeinsame Historie. Wenn Gerrit im Spiel ist kommt aber noch ein Commit-Filter hinzu, damit ich die Change-DB anpassen kann:

PREFIX=data
SQL=/tmp/rewrite-history.sql

:>$SQL

git filter-branch \
  --index-filter '
    git ls-files -s |
    sed "s,\t,&'"$PREFIX"'/," |
    GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info &&
    mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE
  ' \
  --commit-filter '
    n=$(git commit-tree "$@")
    echo "UPDATE patch_sets SET revision = '\''$n'\'' WHERE revision = '\''$GIT_COMMIT'\'';" >> '$SQL'
    echo $n
  ' HEAD

Danach kann man wie gehabt mergen:

REWRITTEN_WORKING_COPY_DIR=/tmp/hiera
git pull $REWRITTEN_WORKING_COPY_DIR--allow-unrelated-histories
git push --force origin HEAD:production

Das erzeugte File mit den SQLs kann man dann in “gerrit gsql” anwenden.