我在Git倉庫上運行Gitolite,並且我有用Python編寫的post-receive鉤子。我需要在git repository目錄下執行「git」命令。有幾行代碼:通過git鉤子執行python子進程
proc = subprocess.Popen(['git', 'log', '-n1'], cwd='/home/git/repos/testing.git' stdout=subprocess.PIPE, stderr=subprocess.PIPE)
proc.communicate()
後,我作出新的承諾,並推到庫,腳本執行,並說
fatal: Not a git repository: '.'
如果我運行
proc = subprocess.Popen(['pwd'], cwd='/home/git/repos/testing.git' stdout=subprocess.PIPE, stderr=subprocess.PIPE)
它說,如預期,正確的路徑到git倉庫(/home/git/repos/testing.git)
如果我從bash手動運行這個腳本,它工作正常並顯示正確的「git log」輸出。我做錯了什麼?
鉤子已經設置好環境變量'$ GIT_DIR',所以如果你想把git指向不同的目錄,你必須重寫它。請注意,一般情況下,鉤子也運行'GIT_DIR = .'(即它是*相對*,這對我來說是一個驚喜)。最好完全清除它或將其設置爲你想要的。 – torek
@torek:有趣的是,這可能是OP的錯誤。更新了答案,因爲'env.update(os.environ)'會抹掉我們試圖設置的自定義'GIT_DIR' var。 –
呵呵,我沒有仔細閱讀你的第二部分答案,以至於你意識到你正在使用'.update'。無論如何,是的,我懷疑這是OP的真正問題。 (實驗告訴我,' - git-dir'覆蓋了'$ GIT_DIR',所以你的第一個答案應該可以工作。) – torek