2011-12-19 33 views
12

¿Cómo se pueden ejecutar los comandos de git como git add . y git commit -m usando php?Ejecución de comandos de git a través de PHP

Es para un proyecto que crea un repositorio centralizado para el mantenimiento de proyectos académicos.

exec() no parece funcionar.

<?php 
$path = "/var/www/repos/$_POST[project]"; 
$a=''; 
chdir($path); 
exec("git add ."); 
exec("git commit -m'message'"); 
echo "<h3 align = center> Succesfully commited all the files.</h3>"; 
?> 
+0

'exec' debería funcionar bien, siempre y cuando la secuencia de comandos PHP tiene permisos para actualizar su repositorio. Pruebe usar 'system()' y vea cuál es el valor de retorno. – Prisoner

+1

resuelto ... problema con la propiedad de .git, no fue www-data – rjv

+0

Usando una biblioteca como [php-git] (https://github.com/libgit2/php-git) –

Respuesta

6

Definitivamente es posible. Lo implementé en uno de mis proyectos. Sin embargo, debe tener cuidado con los permisos.

En Linux, por lo general, el comando exec se ejecutará con el usuario www-data. Así que debe permitir www-data escribir y leer en su directorio de trabajo.

Un rápido y la manera sucia de hacerlo es: chmod o+rw -R git_directory

+0

en pocas palabras, el comando git init debe ser ejecutado por el usuario "www-data". Eso resolvió mi problema, haciéndolo mediante el uso de un script php – rjv

+0

'' 'chmod o + rw directory'' trabajado como un encanto para mí . – fmquaglia

+0

Soy nuevo en GIT y Linux (soy usuario de Windows) ¿me puede explicar cómo funcionó esto para usted? ¿Dónde ejecutaste el comando chmod (en php de cmd?) Y ¿qué es git_directory? ¿es '.git'? – asachanfbd

1

Hay otra solución, que es simplemente usar acentos abiertos php como tal

$message = `git log -1 --pretty=%B`; // get commit message 

o

$deploy_tag = `git describe --tags`; // get commit tags 

o

$hash = `git log -1 --pretty=%h`; // get the hash 
0

La primera vez que corro una prueba en contra de mi instancia de servidor bitbucket para conseguir cualquier salida de mensajes de error en la pantalla:

echo shell_exec("cd /website/root/htdocs && git status 2>&1"); 

esta arrojó un error que no se podía encontrar comando git por lo tanto, tenían que proporcionar una ruta completa de git binaria:

'which git' 

Obtenidos (más llamado YOU_FULL_GIT_BINARY_PATH_HERE):

/usr/local/git/bin/git 

una ruta completa por ejemplo, '/ usr/local/git/bin/git status' ahora ejecuta los comandos de git muy bien.

Esto no supera la contraseña de git requerida para usar el comando 'git pull' para un conjunto en el usuario de .git/config git. Correr por debajo de mando en repositorio git:

git config credential.helper store 

[comando] [1] le pedirá la contraseña y permiten almacenar de forma local sin cifrar (protegido únicamente por el sistema de archivos, por ejemplo, en /root/.git-credentials). Esto permitirá ejecutar 'git pull' sin pedir una contraseña. Alternativamente (probablemente mejor) es generar claves ssh para su servidor web, como apached, y luego agregarlas a su cuenta dedicada de bitbucket o claves de repositorio.

Todos mis carpetas se han establecido a ser propiedad de usuario apache (Centos 6.8 otras versiones podrían ser www-data: www-data, etc.):

chown -R apache:apache YOUR_WEB_FODLER 

que no tenía que usar el truco sucio 'chmod o + rw -R' para que todo funcione.

1

he encontrado una solución bastante simple de 2 problemas aquí

1) Tire de Git desde un equipo remoto seguro sin necesidad de utilizar una contraseña

  • crear un ssh pares de claves, usando público ssh-keygen
  • carga clave para el host remoto de ur git
  • configure el archivo ~/.ssh/config para agregar instrucciones para usar esta clave privada generada por git

    host gitlab.com 
    HostName gitlab.com 
    IdentityFile ~/.ssh/private_key 
    User git 
    

    Eso es todo ahora cualquier comando git utilizar este private_key para conectarse a distancia

2) Ejecución de comandos git de usuario www-data

  • sudoers actualización para permitir que el usuario de www-data ejecute los comandos de git, para editar ejecutar el siguiente comando

    $ sudo visudo 
    

    complemento línea folowing bajo las preferencias del usuario

    www-data ALL=(raaghu) NOPASSWD: /usr/bin/git 
    

    que significa www-data usuario ALL terminales actúan como raaghu puede funcionar con /usr/bin/gitNOPASSWD

    Por favor Nota: No intente este método si no lo hace comprender el archivo sudoers, de lo contrario, esto puede crear un agujero de seguridad

  • Crear git-pull.sh archivo para ejecutar los comandos de Git

    cd /var/www/my-repo 
    sudo -u raaghu git pull origin 
    
  • ejecutar este archivo git-pull.sh de php

    exec("/bin/bash /var/www/git-pull.sh"); 
    
Cuestiones relacionadas