web-dev-qa-db-fra.com

Comment configurer git sur http?

J'ai besoin de configurer un serveur git avec git-over-http (smart http), mais les ressources disponibles en ligne sont un gâchis, se mélangeant dans d'autres configurations Apache, manquant de détails ou n'étant pas suffisamment explicites.

Je réponds moi-même à cette question sur la base de ce que j'ai trouvé manquant dans les ressources disponibles.

18
Marmoy

Il faut d'abord comprendre qu'il y a 2 composants à git-over-http: git et Apache. Ces deux sont connectés via un script avec le nom de git-http-backend. Le défi est de configurer l'interface entre ces deux composants, afin que les requêtes http à git soient transmises par Apache.

Remarque: La sécurité sort du cadre de ce guide.

  1. Commencez par installer git et Apache2 à l'aide du gestionnaire de packages de votre distribution.

  2. Ajoutez les modules nécessaires à Apache pour activer git-over-http. Ce sont cgi, alias et env

$ a2enmod cgi alias env
  1. Copiez ce qui suit dans /etc/Apache2/httpd.conf (Sans supprimer tout ce qu'il contient)
<VirtualHost *:80>
    SetEnv GIT_PROJECT_ROOT /data/git
    SetEnv GIT_HTTP_EXPORT_ALL
    SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
    ScriptAliasMatch \
        "(?x)^/(.*/(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/git-http-backend/$1"
    Alias /git /data/git
    <Directory /usr/lib/git>
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
  1. Remplacez maintenant les 2 occurrences de /data/git Par le répertoire parent de votre dépôt git sur le serveur (ne vous inquiétez pas si vous n'avez pas encore de dépôt, utilisez simplement le répertoire où vous souhaitez le/les placer) )

Remplacez également /usr/lib/git/git-http-backend Par l'emplacement de git-http-backend sur votre système, qui peut être trouvé en utilisant $ find / -name git-http-backend

Il se peut que sur votre système, REDIRECT_REMOTE_USER Écrase réellement un REMOTE_USER Valide. Si cette configuration ne fonctionne pas une fois terminée, essayez de supprimer cette ligne.

Selon this source, il peut être nécessaire de remplacer les deux dernières lignes de la balise Directory par Require all granted pour Apache 2.4 et au-dessus.

  1. Redémarrez le serveur Apache: $ Apache2ctl -k graceful

Maintenant, le serveur Apache est configuré, mais nous n'avons pas encore terminé, il y a des parties importantes de la configuration du référentiel qui affecteront si cette configuration fonctionne ou non.

  1. Configurer le référentiel:
$ mkdir myrepo.git
$ cd myrepo.git
$ git init --bare --shared
$ cp hooks/post-update.sample hooks/post-update
$ git update-server-info
$ chown -R wwwrun:www

Ici, il est important de comprendre que la dernière ligne change le propriétaire du dépôt en utilisateur Apache2. Cet utilisateur peut être différent sur votre système. Pour trouver l'utilisateur Apache, exécutez $ ps aux | egrep '(Apache|httpd)'. Ensuite, pour trouver le nom de groupe de l'utilisateur, exécutez $ id user-name. Sur mon système, l'utilisateur est wwwrun et le groupe www . Remplacez en conséquence.

  1. Utilisez le repo

Pour utiliser le dépôt, vous devez connaître l'url. Pour cette configuration, l'URL est http: //server.domain/myrepo.git

Remarque: http s ne fonctionnera pas.

Lorsque vous accédez au référentiel à partir d'un client, vous l'ajoutez simplement en tant que télécommande:

$ git remote add Origin http://server.domain/myrepo.git

Ensuite, vous pouvez interagir avec lui comme n'importe quel autre dépôt git.

34
Marmoy

Projets multiples avec différents droits d'accès

Il y a de la gitolite, mais complexe ... Une solution simple est de créer une macro dans Apache2 conf comme:

## Git root

SetEnv GIT_PROJECT_ROOT /opt/gitroot
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
SetEnv GITWEB_CONFIG /etc/gitweb.conf

##  SMART Http

ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/

<Directory "/usr/libexec/git-core*">
   Options +ExecCGI +Indexes
   Order allow,deny
   Allow from all
   Require all granted
</Directory>

<Macro Project $repository $developers $users>
    <LocationMatch "^/git/$repository.*$">
        AuthType Basic
        AuthName "Git Access"
        AuthUserFile /opt/basic_auth
        Require $developers $users 
    </LocationMatch>
    <LocationMatch "^/git/$repository/git-receive-pack$">
        AuthType Basic
        AuthName "Git Access"
        AuthUserFile /opt/basic_auth
        Require  $developers
    </LocationMatch>
 </Macro>

 IncludeOptional /opt/git_access.conf

Et dans /opt/git_access.conf

Use Project test1 "admin john" "mike"
Use Project test2 "admin emma" "all granted"

Ainsi, le projet git test1 aura un accès en lecture/écriture par admin et john, et un accès en lecture seule par mike.

Le projet test2 aura un accès en lecture à tous les utilisateurs authentifiés.

Le git_access.conf peut être produit par vos outils à partir d'une base de données de vos projets et utilisateurs par exemple, et rechargé par un "service httpd reload".

Pour la même configuration pour l'accès en lecture gitweb, ajoutez dans /etc/gitweb.conf:

$export_auth_hook = sub {
        my $repo = shift;
        my $user = $cgi->remote_user;
        if($repo =~ s/\/opt\/gitroot\///) {
           open FILE, '/opt/git_access'; 
           while(<FILE>) {
               if ($_ =~ m/Use Project $repo \"(.*)\" \"(.*)\"/)
                {
                    my $users = $1 . ' ' . $2;
                    $users =~ s/all granted/$user/;
                    $users =~ s/user//;
                    if ( $users =~ m/$user/ ) {
                        return 1;
                    }
                }              
            }
        }
        return 0;
};

Ce petit crochet gitweb cache (retourne 0) les dépôts git sans accès en lecture pour l'utilisateur actuel.

Et dans la configuration d'Apache2, la conf gitweb classique:

## Gitweb  

Alias /gitweb /var/www/git

<Directory /var/www/git>
    AddHandler cgi-script .cgi
    DirectoryIndex gitweb.cgi
    Options +ExecCGI +Indexes +FollowSymlinks 
    AllowOverride None    
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /opt/basic_auth
    Require valid-user
</Directory>

Voilà ma config.

1
tfa