2011-12-19 19 views
12

Come si possono eseguire comandi git come git add . e git commit -m utilizzando php?Esecuzione di comandi git via PHP

È per un progetto che crea un repository centralizzato per il mantenimento di progetti accademici.

exec() non sembra funzionare.

<?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' dovrebbe funzionare bene finché lo script PHP ha autorizzazioni per aggiornare il repository. Prova a usare 'system()' e vedi qual è il valore di ritorno. – Prisoner

+1

risolto ... il problema era con la proprietà di .git, non era www-data – rjv

+0

Uso di una libreria come [php-git] (https://github.com/libgit2/php-git) –

risposta

6

È assolutamente possibile. L'ho implementato in uno dei miei progetti. Tuttavia dovresti fare attenzione alle autorizzazioni.

Su Linux, in genere, il comando exec verrà eseguito utilizzando l'utente www-data. Pertanto è necessario consentire a www-data di scrivere e leggere nella directory di lavoro.

Un rapido e modo sporco per farlo è: chmod o+rw -R git_directory

+0

semplicemente messo, il comando git init deve essere eseguito dall'utente "www-data". Che ha risolto il mio problema, facendolo usando uno script php – rjv

+0

'' 'chmod o + rw directory''' lavorato come un incantesimo per me . – fmquaglia

+0

Sono un neofita di GIT e linux (sono un utente di Windows), puoi spiegare come ha funzionato? Dove hai eseguito il comando chmod (in php di cmd?) E cos'è git_directory? è ".git"? – asachanfbd

1

C'è un'altra soluzione, che è quello di utilizzare semplicemente backticks php in questo modo

$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

primo luogo ho eseguito un test contro la mia istanza del server bitbucket per ottenere qualsiasi uscita messaggi di errore sullo schermo:

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

questo ha gettato un errore che esso comando git non riusciva a trovare, quindi, ha dovuto fornire un percorso completo git di binario:

'which git' 

restituito (ulteriormente chiamato YOU_FULL_GIT_BINARY_PATH_HERE):

/usr/local/git/bin/git 

Un percorso completo es '/ usr/local/git/bin/git status' ora esegue graziosamente i comandi git.

Questo non consente di superare la password git richiesta per utilizzare il comando 'git pull' per un set in utente .git/config git. L'esecuzione di sotto comando git repo:

git config credential.helper store 

[comando] [1] chiederà la password e permetterà di memorizzare localmente in chiaro (protetto solo da file system esempio in /root/.git-credentials). Ciò consentirà di eseguire 'git pull' senza richiedere la password. In alternativa (probabilmente meglio) è quello di generare le chiavi ssh per il tuo server web come ad esempio aggiunto e poi aggiungerle al tuo account utente dedicato bitbucket o chiavi repo.

Tutte le mie cartelle sono stati impostati per essere di proprietà dell'utente apache (CentOS 6.8 altre versioni potrebbero essere www-data: www-data, ecc):

chown -R apache:apache YOUR_WEB_FODLER 

Io non hanno dovuta usare il trucco sporco 'chmod o + rw -R' per funzionare.

1

ho trovato un bel soluzioni semplici a 2 problemi qui

1) Git tirare da una garantiti a distanza senza utilizzare la password

  • creare uno ssh coppie di chiavi, utilizzando ssh-keygen
  • caricati pubblico chiave per ur git host remoto
  • configure ~/.ssh/config file per aggiungere istruzioni per utilizzare questa chiave privata generata da git

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

    Questo è tutto ora qualsiasi comando git useranno questo private_key per connettersi a distanza

2) comando git Esecuzione dall'utente www-data

  • file sudoers aggiornamento per consentire all'utente www-data di eseguire comandi git, per modificare eseguire il comando seguente

    $ sudo visudo 
    

    add linea folowing sotto le preferenze degli utenti

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

    significato www-data utente ALL terminali in qualità di raaghu può essere eseguito con /usr/bin/gitNOPASSWD

    Nota: Non tentare questo metodo se non lo fai capire il file sudoers, altrimenti questo potrebbe creare un buco di sicurezza

  • Creare file di git-pull.sh per eseguire i comandi git

    cd /var/www/my-repo 
    sudo -u raaghu git pull origin 
    
  • eseguire questo file git-pull.sh da php

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