Git PHP提交

Stella981
• 阅读 463

这阵子在Git上没少下功夫,对常用的命令也都非常熟悉,所以用php封装了git的常用操作,可以查看:

http://git.oschina.net/feixiang/webgit  


        这几天一直在郁闷的事情。 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是否建立,不存在则先建立Git仓库
    if( !file_exists(".git") ){           
        $cmd = "$GIT init" ;          
        exec( $cmd ,$rs,$status );          
        $cmd = "$GIT remote add origin git@".$remote.":hometouch.$project" ;          
        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 *" ;
    exec( $cmd ,$rs,$status );
    unset($rs);
    $cmd = "$GIT commit -a -m \"$commitMsg\"" ;
    exec( $cmd ,$rs,$status );
    unset($rs);
    // 防止 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."";
    exec( $cmd ,$rs, $status );
    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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
2个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这