On 09/01/2015 05:21 AM, Eric S. Raymond wrote:
Jason Merrill <ja...@redhat.com>:
Given git aliases:

        stamp = show -s --format='%cI!%ce'
        scommit = "!f(){ d=${1%%!*}; a=${1##*!}; arg=\"--until=$d -1\"; if [ $a != $1 ]; then 
arg=\"$arg --committer=$a\"; fi; shift; git rev-list $arg ${1:+\"$@\"}; }; f"
        smaster = "!f(){ git scommit \"$1\" trunk --first-parent; }; f"
        shs = "!f(){ git show $(git smaster $1); }; f"
        slog = "!f(){ s=$1; shift; git log $(git smaster $s) $*; }; f"
        sco = "!f(){ git checkout $(git smaster $1); }; f"

and an action stamp 2015-08-20T20:55:15Z!jason, then

git sco 2015-08-20T20:55:15Z\!jason

will check out the (most recent) commit with that stamp.  It also works with
just the timestamp.

This is a corner of git of which I knew not.  How does one set this sort of
alias?  I Google...

Will git config --global alias.stamp = show -s --format='%cI!%ce

and analogous command lines work?

As Jonathan says, I was editing them directly into the [alias] section of my ~/.gitconfig .

I think I understand what most of these are doing, but...you would be doing
a service to the world if you wrote a little shellscript that set these up,
with short explanatory comments reveraling what each is to be used for, like
this:

# sco - check out most recent commit with specified action stamp

I'd add that to the reposurgeon distribution in a heartbeat.

Here's an improved version:

        # git stamp <commit-ish> - print a reposurgeon-style action stamp
        stamp = show -s --format='%cI!%ce'

        # git scommit <stamp> <rev-list-args> - list the most recent commit that 
matches <stamp>.
        # Must also specify a branch to search or --all.
        scommit = "!f(){ d=${1%%!*}; a=${1##*!}; arg=\"--until=$d -1\"; if [ $a != $1 ]; then 
arg=\"$arg --committer=$a\"; fi; shift; git rev-list $arg ${1:+\"$@\"}; }; f"

        # git scommits <stamp> <rev-list-args> - as above, but list all 
matching commits.
        scommits = "!f(){ d=${1%%!*}; a=${1##*!}; arg=\"--until=$d --after $d\"; if [ $a != $1 ]; then 
arg=\"$arg --committer=$a\"; fi; shift; git rev-list $arg ${1:+\"$@\"}; }; f"

        # git smaster <stamp> - list the most recent commit on master that matches 
<stamp>.
        smaster = "!f(){ git scommit \"$1\" master --first-parent; }; f"
        smasters = "!f(){ git scommits \"$1\" master --first-parent; }; f"

        # git shs <stamp> - show the commits on master that match <stamp>.
        shs = "!f(){ stamp=$(git smasters $1); shift; git show ${stamp:?not found} 
$*; }; f"

        # git slog <stamp> <log-args> - start git log at <stamp> on master
        slog = "!f(){ stamp=$(git smaster $1); shift; git log ${stamp:?not found} 
$*; }; f"

        # git sco <stamp> - check out the most recent commit on master that matches 
<stamp>.
        sco = "!f(){ stamp=$(git smaster $1); shift; git checkout ${stamp:?not 
found} $*; }; f"

Jason

Reply via email to