`On Mon, Aug 30, 2010 at 03:08, Jeff King <peff@xxxxxxxx> wrote: Sorry for not replying to this earlier. > On Sun, Aug 29, 2010 at 08:30:15PM +0000, Ævar Arnfjörð Bjarmason wrote: > >> I have this alias in my .gitconfig: >> >> review = "!f() { for rev in $(git rev-list --reverse \"$@\"); do >> git show $rev; done; }; f" >> >> I use it after I "git pull" to see what changed, e.g.: >> >> git review 49ea7b8..e1ef3c1 > > It took me a minute of reading this to see why you would want to call > "git show" in a loop when you could have the same data from "git log" > all at once (and much faster, too). I just like the UI of having each commit "pop up" where I can either page up/down within the commit, or dismiss it with "q" and go to the next one. You can't do both of those in a pager, up/down goes across commits, and "q" quits the whole pager. > But I guess you like having an individual less invocation for each > commit. Have you tried "tig", which might suit your purpose even > better? I haven't tried tig, but "git review" as I implement it (below) is sufficient for my needs. >> But sometimes I find that I want to do that for other things too, so I >> have these hacks: >> >> review-grep = "!f() { for rev in $(git log --reverse >> --pretty=format:%H --grep=\"$@\"); do git show $rev; done; }; f" >> review-file = "!f() { for rev in $(git log --reverse >> --pretty=format:%H \"$@\"); do git show $rev; done; }; f" >> >> But just now I wanted to use -S instead of grep, but adding aliases >> like this is a bit silly. > > I don't understand why you have these at all. Just use "git log > --format=%H" in your git review above (instead of rev-list), and then > you can just do: > > git review --grep=whatever > git review -Sfoo > git review file > > Or am I missing something subtle? You're not missing something, my alias was silly because I brainfarted and didn't realize I could do $@, not "$@", so now it's: review = "!f() { for rev in $(git log --reverse --format=%H $@); do git show $rev; done; }; f" Which means I can do all of the commands you suggested above, thanks! > You wouldn't even need to switch to log over rev-list, except that > rev-list misses log's useful "default to HEAD if no revisions given" > behavior. > >> Maybe we should have something like: >> >> git log --for-each=less a..b >> >> To call "less" for each commit, what do you think? > > I think it is not very Unix-y. We already have many ways to to call a > command once per commit, including: > > - for i in `git rev-list "$@"`; do git show $i; done > > - git rev-list "$@" | xargs -n 1 git show > > - git log -z "$@" | perl -0ne 'open(LESS, "|less"); print LESS' > > What does your solution offer that the other do not? Because you are > actually reinvoking git for each commit, it is more efficient than the > first two (as you seem to assume that the --for-each command will > receive the entire log output). But the third one should be more or less > equivalent to what you want (though note: if you want tty-ish things > like color on, you should set GIT_PAGER_IN_USE=1 so git knows output is > eventually going to a pager). Sure, yours is slightly less typing, but > it's _way_ less flexible, and that typing should probably be hidden > behind an alias anyway. Yeah, it's not very Unixy, I just find it so useful that I thought there might be interest in adding it to Git. It's easily in the list of top 5 git commands that I use. But just using the pipe is more flexible I guess. -- 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