Git PHP提交
做了個小的DEMO,可以查看:
https://github.com/feixiang/webgit.git
這幾天一直在郁悶的事情。 Git在shell里面執(zhí)行得好好的,apache運(yùn)行用戶也改成了git,但是,在提交Git工程的時候卻沒法提交。
剛開始以為是文件權(quán)限問題,因?yàn)闄?quán)限問題是Linux上的最大問題。
可是,盡管把目錄都設(shè)成了777的權(quán)限(不要學(xué),測試用),還是沒法提交,于是心都涼了...
今天在詢問某個同事的時候,無意中將apache用戶從git改回apache,意外地發(fā)現(xiàn)!竟然能夠提交成功!
之前將apache用戶設(shè)置為git是因?yàn)樵趙eb服務(wù)器上部署了Git,組成Git + ftp + web的開發(fā)環(huán)境。 后來又試了試改git的用戶組,依然沒有成功。
再試了試將apache用戶改成nobody,意外地發(fā)現(xiàn)!竟然也能提交成功!
看到這里,我開始懷疑是不是Gitolite(git權(quán)限控制系統(tǒng))限制了ssh用戶連接。于是嘗試了用一個沒有ssh認(rèn)證的用戶去作為apache用戶,但是沒有用... 于是,又想了想,是不是apache用戶有什么特殊權(quán)限呢?其實(shí)這個方向應(yīng)該是不對的...省略... 的確有可能是ssh認(rèn)證的時候出現(xiàn)的問題.... to be continue...
————————————2012年11月12日 16時更新————————————————
終于解決了這個問題! 原因終究還是權(quán)限問題! 分析這個問題要從apache的日志來分析。
分析error_log日志幫助我完成了這個任務(wù)。在我的服務(wù)器RedHat上,apache的日志文件在 /var/log/httpd/
接上文:在git用戶commit提交的時候,總是提交不成功,且沒有輸出。當(dāng)然,這只是在php的環(huán)境下沒有輸出,其實(shí)!
是發(fā)生了內(nèi)部錯誤,apache把這些錯誤記錄在了error_log里面。
當(dāng)時,我得到的錯誤大概是這樣的: [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沒有識別到當(dāng)前提交的用戶的配置,然后被Gitolite阻止了。
但是git用戶明明已經(jīng)設(shè)置了用戶名和email了。 這里又涉及到Git config 的全局 --global 設(shè)置和當(dāng)前git倉庫的config設(shè)置。
由于apache目錄被限制在我的web目錄下,git用戶無法讀取到全局配置的信息,當(dāng)然沒法確定提交的用戶!
根據(jù)這個思路,我重新在php中對每個git倉庫初始化進(jìn)行了局部的config的設(shè)置。
于是,再進(jìn)行提交! 于是!提交成功!Push成功!
專心解決問題,深入分析日志...在解決這個問題的時候,發(fā)現(xiàn)apache的日志文件非常大,我們可以另外設(shè)置,限制日志文件的大小。
附上PHP代碼,非專業(yè),邊學(xué)邊用...
?
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 );}//下面執(zhí)行命令if( $commitMsg == "" )$commitMsg = date("Y.m.d") ; //確認(rèn)提交用戶名$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這個是因?yàn)橐郧笆鞘謩犹峤坏?#xff0c;所以初始化項(xiàng)目的用戶不是git,所以導(dǎo)致.git目錄的所有者不是git,這樣提交的時候就沒法寫入.git數(shù)據(jù)庫,導(dǎo)致這個錯誤。解決方法很簡單,改變.git目錄擁有者即可
sudo chown -R git:git repo.git
轉(zhuǎn)載于:https://www.cnblogs.com/kenshinobiy/p/4543441.html
總結(jié)
- 上一篇: mongod
- 下一篇: php中(foreach)用法介绍