Re: Misusing git: trimming old commits

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, May 9, 2013 at 11:40 AM, Martin Langhoff
<martin.langhoff@xxxxxxxxx> wrote:
> With the exaction of the final destination, I want to expire reports
> that are old and successfully transferred.

OK, that took some effort to make work. Make sure you are not using
reflogs (or that reflogs are promptly expired).

# right after a successful push of all heads to the receiving server...
for head in $(git branch|sed 's/^..//'); do
    # FIXME period
    graft_sha1=$(git log --until=one.month.ago -n1 --pretty=format:%H ${head})
    if [[ -z "$graft_sha1" ]]; then
        # nothing to prune
        continue
    fi
    # is it already grafted?
    if grep -q "^${graft_sha1} " "${GIT_DIR}/info/grafts" &>/dev/null ; then
        # don't duplicate the graft
        continue
    fi
    some_grafted='true'
    # prep empty commit
    # skip git read-tree --empty, we get the same with
    export GIT_INDEX_FILE=/tmp/ppg-emptytree.$$
    empty_tree="$(git write-tree)"
    rm ${GIT_INDEX_FILE}
    unset GIT_INDEX_FILE
    empty_commit=$(git commit-tree -m empty ${empty_tree})
    echo "${graft_sha1} ${empty_commit}" >> ${GIT_DIR}/info/grafts
done

if [[ -z "$some_grafted" ]]; then
    # nothing to do
    exit 0
fi

# ppg-repack makes the unreachable objects "loose"
# (it is git-repack hacked to remove --keep-true-parents),
# git prune --expire actually deletes them
$PPG_EXEC_PATH/ppg-repack -AFfd
git prune --expire=now

### Cleanup stale grafts
# current grafts points are reachable,
# pruned graft points (made obsolete by a newer graft)
# cannot be retrieved and git cat-file exit code is 128
touch ${GIT_DIR}/info/grafts.tmp.$$
while read line; do
    graftpoint=$(echo "${line}" | cut -d' ' -f1)
    if git cat-file commit ${graftpoint} &>/dev/null ; then
        echo ${line} >> ${GIT_DIR}/info/grafts.tmp.$$
    fi
done < "${GIT_DIR}/info/grafts"

if [ -s ${GIT_DIR}/info/grafts.tmp.$$ ]; then
    mv ${GIT_DIR}/info/grafts.tmp.$$ ${GIT_DIR}/info/grafts
fi

Perhaps it helps someone else trying to run git as a spooler :-)

cheers,



m
--
 martin.langhoff@xxxxxxxxx
 -  ask interesting questions
 - don't get distracted with shiny stuff  - working code first
 ~ http://docs.moodle.org/en/User:Martin_Langhoff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]