Setting up Git's Smart HTTP on Ubuntu 10.10

Prerequisites: Make sure apache2 and gitweb are installed and setup, and that you can see your repositories from the web.
(read /usr/share/doc/gitweb/README.Debian for setup info)



Create /etc/apache2/conf.d/git-http-backend with these contents:

# Setup git-http-backend to reside at the same URL as GitWeb

SetEnv GIT_PROJECT_ROOT /var/cache/git/
SetEnv GIT_HTTP_EXPORT_ALL      # otherwise, repos need to be individually enabled with  git-daemon-export-ok

ScriptAliasMatch \
        "(?x)^/gitweb/(.*/(HEAD | \
                        info/refs | \
                        objects/(info/[^/]+ | \
                                 [0-9a-f]{2}/[0-9a-f]{38} | \
                                 pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
                        git-(upload|receive)-pack))$" \
        /usr/lib/git-core/git-http-backend/$1

ScriptAliasMatch "^/gitweb/([^?].*\.git)$" \
                 /usr/share/gitweb/index.cgi/$1



#####  Require HTTP Basic Authentication for pushes  (optional) #####

        # Dang.  This doesn't work as-is, despite being suggested by the git-http-backend manpage.
        #
        # see    http://git.661346.n2.nabble.com/git-http-backend-and-Authenticated-Pushes-td4703506.html
#<LocationMatch "^/gitweb/.*/git-receive-pack$">
#        AuthType Basic
#        AuthName "Git Access"
#        AuthUserFile /var/cache/git/push.htpasswd
#        Require valid-user
#</LocationMatch>



RewriteCond %{QUERY_STRING} =service=git-receive-pack [OR]
RewriteCond %{REQUEST_URI} /git-receive-pack$
RewriteRule (.*) $1 [E=AUTHREQUIRED:yes]

<Location /gitweb/>
    Order Deny,Allow
    Deny from env=AUTHREQUIRED 

    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /var/cache/git/push.htpasswd
    Require valid-user

    Satisfy Any
<Location>



    # use this URL to test the above:
    #
    #           http://localhost/gitweb/git_test1.git/info/refs?service=git-receive-pack


Then run: /etc/init.d/apache2 reload



Now you should be able to use this URL to 1) view from a browser, or 2) git-clone or git-push it:

Troubleshooting

If you see this in Apache's error_log: This means that $REMOTE_USER isn't set — that is, user-authentication failed. Git-http-backend needs the $REMOTE_USER to be set in order to record who did the PUSH.