2011-12-19 16 views
12

W jaki sposób można wykonać polecenia git, takie jak git add . i git commit -m za pomocą php?Wykonywanie komend git za pomocą PHP

Jest to projekt, który tworzy scentralizowane zaplecze repozytorium do utrzymywania projektów akademickich.

Funkcja exec() nie działała.

<?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' powinien działać w porządku tak długo, jak skrypt PHP uprawnienia do aktualizacji repo. Spróbuj użyć 'system()' i zobacz, jaka jest zwracana wartość. – Prisoner

+1

rozwiązany ... problem był związany z własnością .git, to nie był www-dane – rjv

+0

Korzystanie z biblioteki takiej jak [php-git] (https://github.com/libgit2/php-git) –

Odpowiedz

6

Jest to zdecydowanie możliwe. Zaimplementowałem go w jednym z moich projektów. Powinieneś jednak uważać na uprawnienia.

W systemie Linux zazwyczaj polecenie exec zostanie wykonane przy użyciu użytkownika www-data. Powinieneś pozwolić www-data pisać i czytać w twoim katalogu roboczym.

Jeden szybki i brudny sposób to zrobić to: chmod o+rw -R git_directory

+0

Po prostu, polecenie git init musi być uruchomione przez użytkownika "www-data". To rozwiązało mój problem, robiąc to za pomocą skryptu php – rjv

+0

'' 'chmod o + rw directory''' pracował jak urok dla mnie . – fmquaglia

+0

Jestem nowy w GIT i Linuksie (jestem użytkownikiem systemu Windows). Czy możesz wyjaśnić, w jaki sposób to zadziałało? Gdzie wykonałeś polecenie chmod (w php z cmd?) I czym jest git_directory? czy to jest ".git"? – asachanfbd

1

Nie ma innego rozwiązania, które jest po prostu użyć odwrócone, pojedyncze apostrofy php jak tak

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

lub

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

lub

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

raz pierwszy uruchomić test przed moim instancji serwera bitbucket uzyskać wszelkie wysyłania wiadomości o błędach na ekranie:

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

ten wyrzucił błąd, że nie może znaleźć polecenia git stąd musiała zapewnić pełną ścieżkę do git na binarny:

'which git' 

zwracane (zwany dalej YOU_FULL_GIT_BINARY_PATH_HERE)

/usr/local/git/bin/git 

pełnej ścieżki np "/ usr/local/git/bin/git status" teraz ładnie ładuje polecenia git.

Nie pokonuje to hasła git wymaganego do użycia komendy "git pull" dla zestawu w git/config git user. Uruchamianie poniżej komendy w git repo:

git config credential.helper store 

[polecenie] [1] poprosi o hasło i pozwala przechowywać je lokalnie niezaszyfrowane (chronione tylko przez system plików na przykład w /root/.git-credentials). Umożliwi to uruchomienie 'git pull' bez pytania o hasło. Alternatywnie (prawdopodobnie lepiej) jest generowanie kluczy ssh dla twojego serwera WWW, takich jak apache, a następnie dodawanie ich do konta użytkownika dedykowanego bitbucket lub kluczy repo.

Wszystkie moje foldery zostały ustawione przez apache być własnością użytkownika (Centos 6.8 Inne wersje mogą być www-data: www-data itp):

chown -R apache:apache YOUR_WEB_FODLER 

nie trzeba używać brudną sztuczkę "chmod o + rw -R", aby uzyskać wszystkie działa.

1

znalazłem dość proste rozwiązania do 2 problemy tutaj

1) git pull z zabezpieczonej zdalny bez użycia hasła

  • utworzyć ssh par kluczy, używając ssh-keygen
  • wysyłania wiadomości publicznej key to ur git remote host
  • skonfiguruj plik ~/.ssh/config, aby dodać instrukcję użycia tego wygenerowanego klucza prywatnego przez git

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

    To wszystko teraz dowolne polecenie git użyje tego private_key podłączyć do zdalnego

2) uruchomione polecenie git od użytkownika www-data

  • plik aktualizacji sudoers aby zezwolić użytkownikowi www na uruchamianie poleceń git, edytuj uruchom następujące polecenie:

    $ sudo visudo 
    

    add folowing linia pod preferencji użytkownika

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

    oznaczających www-data użytkownika z ALL terminali działających w charakterze raaghu można uruchomić /usr/bin/git z NOPASSWD

    Uwaga: Nie należy próbować tej metody, jeśli nie zrozumieć plik sudoers, w przeciwnym razie może to spowodować lukę bezpieczeństwa

  • Utwórz git-pull.sh plik uruchomić git polecenia

    cd /var/www/my-repo 
    sudo -u raaghu git pull origin 
    
  • uruchomić ten plik git-pull.sh z php

    exec("/bin/bash /var/www/git-pull.sh"); 
    
Powiązane problemy