2010-02-22 131 views
12

我們使用git和中央repo(使用Gitosis)。我創建了一個post-receive鉤子,當更改被推送到中央倉庫時,生成一個發送到dev郵件列表的電子郵件,並從git倉庫中的文檔文件夾生成文檔。Git post-receive hook不工作

因此,在〜混帳/我有一個目錄,我們將稱之爲「一」包含混帳回購協議的副本。後收到鉤的樣子:

#!/bin/bash 
cd ~git/repositories/a.git 
. ~git/post-receive-email &> /dev/null 
(cd ~git/a && git pull &> ~git/pull_log.log && php ~git/a/scripts/generate_markdown_documentation.php &> ~git/doc_log.log) 

電子郵件腳本工作,但是文檔生成是沒有的。 pull_log.log的內容是:

fatal: Not a git repository: '.' 

這讓我覺得,它不改變正確的目錄在上面的腳本中的第5行。我錯了嗎?我怎樣才能使這個工作?

編輯:我已經更新了回覆中建議的post-receive hook。該腳本現在是:

#!/bin/bash 
function die { 
    echo "$*" >&2; exit 1 
} 

function checkgit { 
    [ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir" 
} 


cd ~git/repositories/a.git 
. ~git/post-receive-email &> /dev/null 
(set -x 
checkgit ~git/a 
cd ~git/a 
checkgit . 
pwd 
git pull 
php ~git/a/scripts/generate_markdown_documentation.php) 

而且我從混帳推以下的輸出:

+ checkgit /var/git/a 
+ '[' -d /var/git/a/.git ']' 
+ cd /var/git/a 
+ checkgit . 
+ '[' -d ./.git ']' 
+ pwd 
/var/git/a 
+ git pull 
fatal: Not a git repository: '.' 
+ php /var/git/a/scripts/generate_markdown_documentation.php 

更多的幫助?

哦,如果我運行該腳本自己,它的工作原理(我運行它說掛鉤/後接收)

發現了這個問題,這要歸功於serverfault - 基本上,環境變量GIT_DIRGIT_WORK_TREE設置當掛鉤運行時,這些影響git拉動不利。取消設置變量可以解決問題。

+2

將'git pull'更改爲'pwd'並查看日誌中顯示的內容。 – 2010-02-23 00:57:28

+0

哦!討厭。 +1用於追蹤問題並殺死它! – 2010-02-25 03:05:36

+0

你是如何找到pull_log.log文件的?我不知道日誌存儲在哪裏... – munmunbb 2015-11-16 23:57:52

回答

3

你需要更多的診斷,例如,

function die { 
    echo "$*" >&2; exit 1 
} 

function checkgit { 
    [ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir" 
} 

此時,在子shell括號之後,你可以嘗試像

set -x # show exactly what's executed (writes to stderr) 
checkgit ~git/a 
cd ~git/a && checkgit . && git pull ... 

的東西,你也可以考慮重新引導整個STDERR的子殼體,例如,

(...) 2>/tmp/mydiagnosis$$.log 

(這是一種臨時措施,只有在有一個在日誌中沒有任何信息保密。)


OK西拉斯,您的額外信息排除了很多尷尬的可能性。我接近我git富結束,但這裏有一些更多的東西來嘗試:

  1. 走進~git/a,看看是否可以用手使其git pull。這應該會失敗。
  2. 鑽進~git/a和運行git status。這也應該失敗。如果沒有,那麼git會給你一個非常糟糕的錯誤信息。

如果兩個步驟都失敗,~git/a不是您認爲的克隆。重新命名它,創建一個新的克隆,並看看是否可以讓問題持續下去。

如果第一步手工成功,那麼奇怪的事情正在發生,我很困惑。

如果第一步失敗,但第二成功,你可能有分支的問題:

  • 也許回購~git/a被設置爲錯誤的分支,你需要回購的分支它沒有。嘗試git branch -a,看看你是否看到意想不到的事情。

  • 也許你有分支,但它沒有與遠程存儲庫正確關聯。在這一點上,你必須潛入~git/a/.git/config,我真的不知道如何解釋你應該在那裏找到什麼。那時你需要一個real git expert;我只是在電視上玩一個。

+0

你能再看一次嗎?我已添加您要求的信息。 – Silas 2010-02-23 15:08:59

+1

@Silas:增加了更多的東西來嘗試。 – 2010-02-24 02:44:06

+0

我發現了真正的問題 - 請參閱上面的更新說明。 – Silas 2010-02-24 15:16:14

0

我最近遇到類似的問題,我認爲它與環境變量,git集,特別是$ GIT_DIR變量有關。如果你有這個設置,其他回購協議上的所有git命令開始行爲怪異。基本上我認爲在鉤子中運行你的git pull必須在一個沒有那些奇怪變量並導致git混淆的中性shell環境中調用,儘管我還沒有想到如何做到這一點。

0

unset GIT_DIR是一種適用於您所看到的致命錯誤的解決方案。

這適用於鉤子中的所有腳本(更新後是另一種常見的腳本),它使用內部的git命令。 git命令使用來自env而不是pwd的GIT_DIR。

請參閱https://stackoverflow.com/a/4100577作進一步說明。