2015-09-04 103 views
0

解釋爲什麼我想這樣做是複雜的,但我想這樣做是使特定的Git倉庫用後收到掛鉤,執行以下操作:運行git命令後收到鉤

  1. 移到測試目錄
  2. 克隆剛剛更新的項目。
  3. 簽出一個特定的分支。
  4. 做一些測試

的後收到的代碼如下所示(簡化):讓「回購」是Git倉庫的名稱,讓「TESTDIR」是同級目錄的名稱,初始爲空,並讓「dev」作爲分支的名稱。

cd ../testdir 
git clone --local ../repo . 
git checkout dev 

然而,當腳本代碼獲取到「混帳結賬」,git的響應「:沒有一個Git倉庫:致命‘’」

我不知道爲什麼混帳認爲「TESTDIR 「不是一個混帳存儲庫。如果我從命令行運行該命令(而不是從post-receive中運行),那麼它們可以正常工作。我不知道爲什麼這種行爲會與接收後的行爲有所不同。有任何想法嗎?

+0

這是我原來的帖子中的一個錯字。這不是問題。我克隆到當前目錄「testdir」。 –

+0

如果你這樣做 cd ../testdir git clone --local ../repo。 (注意「。」) 那麼你仍然在testdir中,並且包含存儲庫的一個克隆。 那麼你仍然在同一個目錄 –

+0

哎呀,錯過了後面的'.'。抱歉! – larsks

回答

1

您需要在post-receive鉤子中取消設置GIT_DIR。問題是在你的鉤子腳本運行的時候,GIT_DIR=.,在你的cd和克隆操作之後不再有用。

我成立了一個本地測試環境,而當我post-receive腳本是這樣的:

#!/bin/sh 

cd ../testdir 
git clone --local ../upstream.git . 
git checkout dev 

我得到這個:

remote: fatal: Not a git repository: '.' 

但是,如果我取消設置GIT_DIR變量:

#!/bin/sh 

unset GIT_DIR 
cd ../testdir 
git clone --local ../upstream.git . 
git checkout dev 

一切正常。

+0

謝謝!這正是我需要的! –

+0

這是另一個相關的問題,希望有相關的答案。在我的實驗中,我做了一個硬重置,然後運行一些清理代碼。具體而言,我運行 'git reset --hard HEAD ^' 'git for-each-ref --format ='delete%(refname)'refs/original | git update-ref --stdin' 'git reflog expire --expire = now --all' 'git gc --aggressive --prune = now' 如果我從命令行運行該代碼,它具有刪除git歷史記錄中最後一次提交的效果。但是從post-receive運行它並沒有同樣的效果(無論如何,垃圾回收)。 –

+0

我想知道是否有一個類似的變量會影響垃圾收集,reflog和修剪的工作方式? –