2011-12-19 39 views
12

Làm cách nào để lệnh git như git add .git commit -m được thực hiện bằng php?Thực hiện lệnh git thông qua PHP

Đó là một dự án tạo cơ sở lưu trữ tập trung để duy trì các dự án học tập.

exec() dường như không hoạt động.

<?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' nên làm việc tốt miễn là kịch bản PHP có quyền cập nhật repo của bạn. Hãy thử sử dụng 'system()' và xem giá trị trả về là gì. – Prisoner

+1

đã giải quyết được sự cố ... với quyền sở hữu của .git, nó không phải là www-data – rjv

+0

Sử dụng thư viện như [php-git] (https://github.com/libgit2/php-git) –

Trả lời

6

Chắc chắn là có thể. Tôi đã triển khai nó trong một trong các dự án của mình. Tuy nhiên, bạn nên cẩn thận về quyền.

Trên linux, thông thường, lệnh exec sẽ thực thi bằng cách sử dụng người dùng www-data. Vì vậy, bạn nên cho phép www-data viết và đọc trên thư mục công việc của mình.

Một cách nhanh chóng và cách bẩn để làm điều đó là: chmod o+rw -R git_directory

+0

chỉ cần đặt, lệnh git init phải được chạy bởi người dùng "www-data" .Đã giải quyết được sự cố của tôi, hãy thực hiện bằng cách sử dụng tập lệnh php – rjv

+0

'' 'chmod o + rw directory'''worked giống như một sự quyến rũ đối với tôi . – fmquaglia

+0

Tôi mới sử dụng GIT và Linux (Tôi là người dùng Windows), bạn có thể giải thích cách thức này đã làm việc cho bạn? Bạn đã thực hiện lệnh chmod ở đâu (trong php của cmd?) Và git_directory là gì? là '.git'? – asachanfbd

1

Có một giải pháp, đó là chỉ cần sử dụng backticks php như vậy

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

hoặc

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

hoặc

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

đầu tiên tôi chạy một thử nghiệm chống lại dụ máy chủ bitbucket tôi để nhận được bất kỳ thông báo lỗi đầu ra trên màn hình:

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

này ném một lỗi mà nó không thể tìm thấy lệnh git do đó phải cung cấp một đường dẫn đầy đủ để git của nhị phân:

'which git' 

trả lại (tiếp tục gọi YOU_FULL_GIT_BINARY_PATH_HERE):

/usr/local/git/bin/git 

Một đường dẫn đầy đủ ví dụ '/ usr/local/git/bin/git status' hiện đang chạy lệnh git độc đáo.

Điều này không vượt qua mật khẩu git được yêu cầu để sử dụng lệnh 'git pull' cho một bộ trong người dùng git/config git. Chạy dưới lệnh trong git repo:

git config credential.helper store 

[lệnh] [1] sẽ nhắc cho mật khẩu và cho phép bạn lưu trữ nó không được mã hóa tại địa phương (chỉ bảo vệ bởi hệ thống tập tin ví dụ trong /root/.git-credentials). Điều này sẽ cho phép chạy 'git pull' mà không cần nhắc nhập mật khẩu. Cách khác (có lẽ tốt hơn) là tạo các khóa ssh cho máy chủ web của bạn như apached rồi thêm chúng vào tài khoản người dùng bitbucket hoặc các khóa repo của bạn.

Tất cả các thư mục của tôi đã được thiết lập để được sở hữu bởi người sử dụng apache (Centos 6.8 phiên bản khác có thể là www-data: www-data vv):

chown -R apache:apache YOUR_WEB_FODLER 

Tôi không phải sử dụng thủ thuật bẩn 'chmod o + rw -R' để làm việc.

1

Tôi tìm thấy một giải pháp khá đơn giản đến 2 vấn đề ở đây

1) Git kéo từ một bảo đảm từ xa mà không cần sử dụng mật khẩu

  • tạo ssh cặp khóa, sử dụng ssh-keygen
  • tải lên cộng đồng key để ur git remote host
  • định cấu hình ~/.ssh/config tệp để thêm hướng dẫn sử dụng khóa riêng được tạo này bởi git

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

    Đó là tất cả tại bất kỳ lệnh git sẽ sử dụng private_key này để kết nối từ xa

2) Chạy lệnh git từ người dùng www-data

  • cập nhật sudoers file để cho phép người dùng www-data chạy lệnh git, để chỉnh sửa chạy lệnh sau

    $ sudo visudo 
    

    add folowing dòng dưới sở thích người dùng

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

    nghĩa www-data người dùng từ thiết bị đầu cuối ALL làm raaghu thể chạy /usr/bin/git với NOPASSWD

    Xin lưu ý: Đừng thử phương pháp này nếu bạn không hiểu tệp sudoers, nếu không, điều này có thể tạo lỗ bảo mật

  • Tạo tập tin git-pull.sh để chạy git lệnh

    cd /var/www/my-repo 
    sudo -u raaghu git pull origin 
    
  • chạy tập tin git-pull.sh này từ php

    exec("/bin/bash /var/www/git-pull.sh"); 
    
Các vấn đề liên quan