2012-07-03 47 views
1

我正在嘗試編寫一個post-receive hook,它將拉入所有推送到一個bitbucket帳戶的新分支。然後,如果推送這些更改的人是特定開發站點的指定用戶,則該分支應自動檢出。Git Post-Receive Hook不一致地添加更改

這是代碼:

$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(); 
     } 
    } 
} 

問題是這樣的:

它並不總是工作!有時即使它應該也不會檢查分支。另外,有時它會在檢出新分支時留下文件。這導致git說一大堆文件被修改,它們不在它所在的分支內。

請幫忙!非常卡住。

謝謝

回答

0

git存儲將保存跟蹤文件的修改完成。如果你有新的文件,他們將不會被保存。這不可能是你的問題之一嗎?你有新的未跟蹤的文件,然後通過你的git合併添加。

+0

新文件不會暫停合併,但我不認爲?該過程實際上停止在腳本的中間 – Quazz

+0

如果新文件在本地回購庫上未被跟蹤,並且您嘗試合併添加具有相同名稱的跟蹤文件的遠程回購站,則新文件可能成爲問題。 它會在乞討時停止合併。 – Gnujeremie