GitPHP提交
做了個小的DEMO,可以檢視:
https://github.com/feixiang/webgit.git
這幾天一直在鬱悶的事情。 Git在shell裡面執行得好好的,apache執行使用者也改成了git,但是,在提交Git工程的時候卻沒法提交。
剛開始以為是檔案許可權問題,因為許可權問題是Linux上的最大問題。
可是,儘管把目錄都設成了777的許可權(不要學,測試用),還是沒法提交,於是心都涼了…
今天在詢問某個同事的時候,無意中將apache使用者從git改回apache,意外地發現!竟然能夠提交成功!
之前將apache使用者設定為git是因為在web伺服器上部署了Git,組成Git + ftp + web的開發環境。 後來又試了試改git的使用者組,依然沒有成功。
再試了試將apache使用者改成nobody,意外地發現!竟然也能提交成功!
看到這裡,我開始懷疑是不是Gitolite(git許可權控制系統)限制了ssh使用者連線。於是嘗試了用一個沒有ssh認證的使用者去作為apache使用者,但是沒有用… 於是,又想了想,是不是apache使用者有什麼特殊許可權呢?其實這個方向應該是不對的…省略… 的確有可能是ssh認證的時候出現的問題…. to be continue…
————————————2012年11月12日 16時更新————————————————
終於解決了這個問題! 原因終究還是許可權問題! 分析這個問題要從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
如何聯絡我:【萬里虎】www.bravetiger.cn
【QQ】3396726884 (諮詢問題100元起,幫助解決問題500元起)
【部落格】http://www.cnblogs.com/kenshinobiy/
相關文章
- git 修改提交作者及提交日期Git
- mysql兩階段提交和組提交MySql
- Git——提交Git
- CF提交
- sourceTree“重置提交”和“提交回滾”的區別
- Python提交Python
- github提交操作Github
- 批量提交事例
- 非同步提交非同步
- 提交規範
- 如何提交pr
- GitHub提交PRGithub
- jquery中$.get()提交和$.post()提交有區別嗎?jQuery
- $.ajax使用總結(一):Form提交與Payload提交ORM
- 【INSERT】逐行提交、批量提交及極限提速方法
- **PHP分步表單提交思路(分頁表單提交)PHP
- 關於ajax提交表單,重複提交解決方法
- git提交規則Git
- Git 約定式提交Git
- Laravel Ajax 提交更新Laravel
- js控制form提交JSORM
- php表單提交PHP
- Oracle分批提交DMLOracle
- plsql提交請求SQL
- 準備提交appAPP
- javascript提交表單JavaScript
- jquery ajax 提交 FormDatajQueryORM
- Git 提交規範Git
- 闖關提交01
- pbootcms提交留言、提交自定義表單時取消驗證碼boot
- 頁面提交引數多而非form表單提交時應該怎麼處理引數進行提交ORM
- 表單提交後設定提交按鈕不可用狀態
- imp匯入時default 按table提交,使用commit按buffer提交MIT
- 分散式重複提交分散式
- Git拆分commit提交GitMIT
- 程式碼提交過程
- 提交程式碼到githubGithub
- Git中撤銷提交Git