Git PHP提交

作了個小的DEMO,能夠查看:php

https://github.com/feixiang/webgit.git  html

這幾天一直在鬱悶的事情。 Git在shell裏面執行得好好的,apache運行用戶也改爲了git,可是,在提交Git工程的時候卻無法提交。git

  剛開始覺得是文件權限問題,由於權限問題是Linux上的最大問題。github

  但是,儘管把目錄都設成了777的權限(不要學,測試用),仍是無法提交,因而心都涼了...web

  今天在詢問某個同事的時候,無心中將apache用戶從git改回apache,意外地發現!居然可以提交成功!shell

  以前將apache用戶設置爲git是由於在web服務器上部署了Git,組成Git + ftp + web的開發環境。 後來又試了試改git的用戶組,依然沒有成功。數據庫

  再試了試將apache用戶改爲nobody,意外地發現!居然也能提交成功!apache

  看到這裏,我開始懷疑是否是Gitolite(git權限控制系統)限制了ssh用戶鏈接。因而嘗試了用一個沒有ssh認證的用戶去做爲apache用戶,可是沒有用... 因而,又想了想,是否是apache用戶有什麼特殊權限呢?其實這個方向應該是不對的...省略... 的確有多是ssh認證的時候出現的問題.... to be continue...服務器

  ————————————2012年11月12日 16時更新————————————————ssh

   終於解決了這個問題! 緣由終究仍是權限問題! 分析這個問題要從apache的日誌來分析。

  分析error_log日誌幫助我完成了這個任務。在個人服務器RedHat上,apache的日誌文件在 /var/log/httpd/

  接上文:在git用戶commit提交的時候,老是提交不成功,且沒有輸出。固然,這只是在php的環境下沒有輸出,其實!

  是發生了內部錯誤,apache把這些錯誤記錄在了error_log裏面。

  當時,我獲得的錯誤大概是這樣的: [html]

* Please tell me who you are. Run git config --global user.email "you@example.com" git config --global user.name "Your Name" to set your account's default identity. Omit --global to set the identity only in this repository. fatal: empty ident not allowed [/html]

  原來是Git提交的時候,git沒有識別到當前提交的用戶的配置,而後被Gitolite阻止了。

   可是git用戶明明已經設置了用戶名和email了。 這裏又涉及到Git config 的全局 --global 設置和當前git倉庫的config設置。

   因爲apache目錄被限制在個人web目錄下,git用戶沒法讀取到全局配置的信息,固然無法肯定提交的用戶!

  根據這個思路,我從新在php中對每一個git倉庫初始化進行了局部的config的設置。

  因而,再進行提交! 因而!提交成功!Push成功!

  專心解決問題,深刻分析日誌...在解決這個問題的時候,發現apache的日誌文件很是大,咱們能夠另外設置,限制日誌文件的大小。

   附上PHP代碼,非專業,邊學邊用...

   

複製代碼
function commitProject($project)
    {
        $remote = "localhost" ;
        $GIT = "/usr/bin/git";
        $commitMsg = $_GET['commit'] ;
        $Root = $_SERVER['DOCUMENT_ROOT'];
        $projectRoot = "$Root/$project";
            
        chdir($projectRoot);
        //先判斷git是否創建
        if( !file_exists(".git") )
        {
           //不存在則先創建Git倉庫
          $cmd = "$GIT init" ;
          exec( $cmd ,$rs,$status );
          //添加remote origin
          $cmd = "$GIT remote add origin git@".$remote.":hometouch.$project" ;
          exec( $cmd ,$rs,$status );
          //去掉文件屬性更改
          $cmd = "$GIT config core.filemode false" ;
          exec( $cmd ,$rs,$status );
        }
        //下面執行命令
        if( $commitMsg == "" )
            $commitMsg = date("Y.m.d") ;    
        
        //確認提交用戶名
        $cmd = "$GIT config user.name 'gitForFtp'" ;
        exec( $cmd ,$rs,$status );
        $cmd = "$GIT config user.email 'gitForFtp@server.com'" ;
        exec( $cmd ,$rs,$status );
        //去掉文件屬性更改
        $cmd = "$GIT config core.filemode false" ;
        exec( $cmd ,$rs,$status );
          
        $cmd = "$GIT add *" ;
        echo "cmd : ".$cmd."<br />";
        exec( $cmd ,$rs,$status );
        unset($rs);

        $cmd = "$GIT commit -a -m \"$commitMsg\"" ;
        echo "cmd : ".$cmd."<br />";
        exec( $cmd ,$rs,$status );
        //print_array($rs);
        unset($rs);
        echo ($status==0) ? ("commit成功<br />") : ("commit失敗<br />") ;
        
        // 防止 ip改變, 這裏修改提交的ip
        $cmd = "$GIT remote set-url origin git@".$remote.":hometouch.$project" ;
        exec( $cmd ,$rs,$status );
        
        $cmd = "$GIT push -f origin master" ;
        echo "cmd : ".$cmd."<br />";
        exec( $cmd ,$rs,$status );
        echo ($status==0) ? ("Push成功<br />") : ("Push失敗<br />") ;
        //print_array($rs);
        unset($rs); 
    }
複製代碼

 

  這裏又遇到的一個問題是,

error: insufficient permission for adding an object to repository database .git/objects

  這個是由於之前是手動提交的,因此初始化項目的用戶不是git,因此致使.git目錄的全部者不是git,這樣提交的時候就無法寫入.git數據庫,致使這個錯誤。解決方法很簡單,改變.git目錄擁有者便可

sudo chown -R git:git repo.git

相關文章
相關標籤/搜索