#!/bin/bash # Script to deltafy an entire GIT repository based on the commit list. # The most recent version of a file is the reference and previous versions # are made delta against the best earlier version available. And so on for # successive versions going back in time. This way the delta overhead is # pushed towards older version of any given file. # # NOTE: the "best earlier version" is not implemented in mkdelta yet # and therefore only the next eariler version is used at this time. # # TODO: deltafy tree objects as well. # # The -d argument allows to provide a limit on the delta chain depth. # If 0 is passed then everything is undeltafied. set -e depth= [ "$1" == "-d" ] && depth="--max-depth=$2" && shift 2 curr_file="" git-rev-list HEAD | git-diff-tree -r --stdin | awk '/^:/ { if ($5 == "M" || $5 == "N") print $4, $6 }' | LC_ALL=C sort -s -k 2 | uniq | while read sha1 file; do if [ "$file" == "$curr_file" ]; then list="$list $sha1" else if [ "$list" ]; then echo "Processing $curr_file" echo "$head $list" | xargs git-mkdelta $depth -v fi curr_file="$file" list="" head="$sha1" fi done