2017-10-18 32 views
0

J'essaie de configurer un HTTP intelligent en utilisant git-http-backend. J'ai essayé de suivre beaucoup de documentation/guides en ligne sur la façon de le faire. Je suis en cours d'exécution Apache 2.4 sur Windows 7. Dans mon httpd.conf jeLe protocole HTTP Git Smart ne parvient pas à exécuter des hooks côté serveur sur push

SetEnv GIT_PROJECT_ROOT c:/repos 
SetEnv GIT_HTTP_EXPORT_ALL 

ScriptAlias /git/ "c:/program files/git/mingw64/libexec/git-core/git-http-backend.exe/" 

<LocationMatch "^/git/.*/git.*$"> 
    Require all granted 
</LocationMatch> 

<Directory "c:/program files/git/mingw64/libexec/git-core/"> 
    <Files "git-http-backend.exe"> 
     Require all granted 
    </Files> 
</Directory> 

Pour C:\repos, je me suis assuré que tout le monde a accès. Je cours httpd.exe sous mon compte d'utilisateur ainsi les demandes faites au serveur devraient voir git 2.12.2 juste bien sur le chemin. En C:\repos, j'ai un repo nu appelé foo.git. À l'intérieur de ce repo, je fais git config http.receivepack true. J'ai été capable de cloner très bien avec http://localhost/git/foo.git. Sans les crochets côté serveur activés, j'ai été en mesure de pousser un commit très bien.

Maintenant, la partie ennuyeuse - je créer un crochet de mise à jour qui est juste C:\repos\foo.git\hooks\update qui contient les éléments suivants:

#!/bin/bash 
echo foo 
exit 0 

J'essaie de pousser le repo local et obtenir

Counting objects: 3, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 315 bytes | 315.00 KiB/s, done. 
Total 3 (delta 0), reused 0 (delta 0) 
To http://localhost/git/foo.git 
! [remote rejected] master -> master (pre-receive hook declined) 
error: failed to push some refs to 'http://localhost/git/foo.git' 

Ok, donc J'essaie de pousser la même chose avec le protocole git - je cours git daemon --reuseaddr --base-path=C:\repos C:\repos. Ensuite, je mets un git-daemon-export-ok à l'intérieur foo.git. Je reviens à la mise en pension et pousser local git:///foo.git:

Counting objects: 3, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 315 bytes | 35.00 KiB/s, done. 
Total 3 (delta 0), reused 0 (delta 0) 
remote: foo 
To git:///foo.git 
    3b33593..6af841c master -> master 

Tout va bien. Je pousse avec le protocole de fichier - file:///c/repos/foo.git et cela fonctionne bien aussi.

J'ai essayé de faire une

<Directory c:/> 
    Require all granted 
</Directory> 

dans mon httpd.conf pour vous assurer qu'il n'a rien à voir avec les problèmes d'accès. Je suis revenu à Require all denied bien sûr. Sur la base d'un push verbeux, il semble que git-receive-pack ne puisse pas démarrer l'interpréteur bash côté serveur, mais je ne sais pas pourquoi. Encore une fois, il est issu d'un httpd.exe qui fonctionne sous mon compte utilisateur et je peux exécuter git juste bien manuellement. Et encore, git peut être trouvé sur le chemin juste très bien. Quel genre de solution évidente manque-t-je ici?

Répondre

0

Le problème était dans mon fichier httpd.conf. De plus, je devais faire

SetEnv PATH "C:\\Program Files\\Git\\bin;C:\\Program Files\\Git\\usr\\bin;${PATH}" 
PassEnv USERNAME 

D'abord, le SetEnv était nécessaire B.C. l'interprète n'était pas invoqué. Dans l'un de mes crochets, j'ai une ligne shebang de #!/usr/bin/env bash, donc l'ajout de C:\Program Files\Git\usr\bin. Dans un autre crochet, je pourrais avoir #!/bin/bash, donc C:\Program Files\Git\bin serait nécessaire.

Deuxièmement, la raison pour PassEnv USERNAME était parce que l'un des hooks utilisait cette variable d'environnement que httpd exclut lors du passage d'un environnement au script CGI. Il est question de the Apache docs here