Php Git Post接收挂钩添加更改时不一致

Php Git Post接收挂钩添加更改时不一致,php,git,branch,githooks,git-post-receive,Php,Git,Branch,Githooks,Git Post Receive,我正在尝试编写一个post-receive钩子,它将把所有推到bitbucket帐户的新分支都拉进来。然后,如果推动这些更改的人是某个特定开发站点的指定用户,则应该自动签出分支 代码如下: $payload = stripslashes(($_POST['payload']) ? $_POST['payload'] : $_GET['payload']); $obj = json_decode($payload); $commits = $obj->commits; $head_com

我正在尝试编写一个post-receive钩子,它将把所有推到bitbucket帐户的新分支都拉进来。然后,如果推动这些更改的人是某个特定开发站点的指定用户,则应该自动签出分支

代码如下:

$payload = stripslashes(($_POST['payload']) ? $_POST['payload'] : $_GET['payload']);
$obj = json_decode($payload);

$commits = $obj->commits;
$head_commit = $commits[0];

for ($i=0; $i<sizeof($commits); $i++) {
    $commit = $commits[$i];
    $head_date = strtotime($head_commit->timestamp);
    $comm_date = strtotime($commit->timestamp);

    if ($comm_date > $head_date) {
        $head_commit = $commit;
    }
}

$branch = $head_commit->branch;
$author = $head_commit->raw_author;

$msgs = array();                                
$ini = parse_ini_file('pull_settings.ini',true);
define ("CURRENT_SITE",$_SERVER["SERVER_NAME"]);

foreach ($ini as $server) {
    if (CURRENT_SITE==$server["site_name"]) {
        if ($server["type"]=="master") {
            $users = $server["users"];
            if (in_array($author,$users) && $branch == "master") {
                exec("git pull",$msgs);
            } else $users = array();
        }
        if ($server["type"]=="dev") {
            exec("git stash",$msgs);
            exec("git fetch --all",$msgs);
            $users = $server["users"];
            if (in_array($author,$users)) {
                exec("git checkout -f $branch",$msgs);
                exec("git merge origin/$branch",$msgs);
            } else $users = array();
        }
    }
}
$payload=stripslashes(($\u POST['payload'])?$\u POST['payload']:$\u GET['payload']);
$obj=json_解码($payload);
$commits=$obj->commits;
$head_commit=$commits[0];
对于($i=0;$itimestamp);
$comm_date=strotime($commit->timestamp);
如果($comm_date>$head_date){
$head_commit=$commit;
}
}
$branch=$head\u commit->branch;
$author=$head\u commit->raw\u author;
$msgs=array();
$ini=parse_ini_文件('pull_settings.ini',true);
定义(“当前站点”,$服务器[“服务器名称]);
foreach($ini作为$server){
如果(当前站点==$server[“站点名称”]){
如果($server[“type”]=“master”){
$users=$server[“users”];
if(在数组中($author,$users)&&$branch==“master”){
exec(“git pull”,$msgs);
}else$users=array();
}
如果($server[“type”]=“dev”){
执行官(“git stash”,美元msgs);
exec(“git fetch--all”,$msgs);
$users=$server[“users”];
if(在数组中($author,$users)){
exec(“git checkout-f$branch”,$msgs);
exec(“git合并原点/$branch”,$msgs);
}else$users=array();
}
}
}

问题是:

它并不总是有效的!有时,即使它应该签出分支,它也不会签出分支。此外,有时它在签出新分支时会留下文件。这导致git说修改了一大堆文件,但这些文件不在它所在的分支内

请帮忙!非常卡住


谢谢

git stash将保存对跟踪文件所做的修改。如果您有新文件,它们将不会被保存。这难道不是你的问题之一吗?您有新的未跟踪文件,这些文件将通过git merge添加。

新文件不会停止合并,尽管我不这么认为?该过程实际上是在脚本执行到一半时停止的。如果在本地repo上未跟踪新文件,并且您尝试合并远程repo并添加具有相同名称的跟踪文件,则可能会出现问题。这将在乞讨时阻止合并。