git-config learned '-ev' option to print empty-valued keys also
Allow users with "R" access to run 'desc' in read mode

(i.e., read a repo's description using the "desc" command)
repo-specific hook: allow specifying more than one

hooks are specified as a space delimited list for each "git" hook.
Test for repo-specific-hooks-trigger
git 1.9.0 changed the rules on file:// urls

used to allow "file://foo" to mean "foo in current directory", but now it's
not allowed!
SAFE_CONFIG fixup should happen in core...

otherwise it doesn't help 'option' lines, nor gitolite git-config queries
(which see the "safe" value, which is mostly useless).
info: learns -json option
(experimental) trace rules using access command
allow strings as macro arguments

thanks to Jason Donenfeld [1] as well as apologies for not being able to push
this out till now!

[1]: https://groups.google.com/forum/#!searchin/gitolite/macros/gitolite/3ypDcm9jTGU/PoVCoIVscaUJ
add warning when ref supplied for R rule

thanks to Tom Robinson; see
https://groups.google.com/d/msg/gitolite/nz-vdyVVSkg/bT6FeBOdPgoJ
minor backward compat breakage in specifying owner/desc,

see https://groups.google.com/forum/#!topic/gitolite/uyoHYZ1Oyvg
mirroring: allow 'nosync' option for slaves

(people who look at the *code* will realise there's also a 'sync' option!)

diff --git c/src/lib/Gitolite/Triggers/Mirroring.pm i/src/lib/Gitolite/Triggers/Mirroring.pm
index 014408d..7d55692 100644
--- c/src/lib/Gitolite/Triggers/Mirroring.pm
+++ i/src/lib/Gitolite/Triggers/Mirroring.pm
@@ -189,8 +189,17 @@ sub post_git {
     }

     sub slaves {
-        my $ref = git_config( +shift, "^gitolite-options\\.mirror\\.slaves.*" );
-        my %out = map { $_ => 1 } map { split } values %$ref;
+        my $repo = shift;
+
+        my $ref = git_config( $repo, "^gitolite-options\\.mirror\\.slaves.*" );
+        my %out = map { $_ => 'async' } map { split } values %$ref;
+
+        $ref = git_config( $repo, "^gitolite-options\\.mirror\\.slaves\\.sync.*" );
+        map { $out{$_} = 'sync' } map { split } values %$ref;
+
+        $ref = git_config( $repo, "^gitolite-options\\.mirror\\.slaves\\.nosync.*" );
+        map { $out{$_} = 'nosync' } map { split } values %$ref;
+
         return %out;
     }

@@ -222,7 +231,9 @@ sub push_to_slaves {
     delete $ENV{GL_USER};    # why?  see src/commands/mirror

     for my $s ( sort keys %slaves ) {
-        system("gitolite mirror push $s $repo </dev/null >/dev/null 2>&1 &");
+        system("gitolite mirror push $s $repo </dev/null >/dev/null 2>&1 &") if $slaves{$s} eq 'async';
+        system("gitolite mirror push $s $repo </dev/null >/dev/null 2>&1")   if $slaves{$s} eq 'sync';
+        _warn "manual mirror push pending for '$s'"                          if $slaves{$s} eq 'nosync';
     }

     $ENV{GL_USER} = $u;