2017-10-16 108 views
0

我有一個惱人的問題。我們正在運行linting作爲預先提交的鉤子。問題在於它正在工作目錄而不是實際的提交。這有兩個問題:如何提交提交,而不是工作目錄?

  1. 提交是壞的,但linting通過。
    如果您在修復linting問題後忘記進行更改,則會發生這種情況。

  2. 承諾是好的,但linting失敗。
    我經常有一些調試代碼,我不打算提交。這些變化確實沒有意義,而且處理起來很麻煩。

現在,問題是我該如何編寫一個更智能的提交前鉤子,而不是工作目錄,最好不改變工作目錄?

+0

僅限分段差異。 – ElpieKay

+0

聽起來有棱角。不要構建依賴於預提交鉤子的進程。它們只是爲了方便而且很容易被禁用。我們使用不同的分支來代表我們產品的主要版本,並偶爾會向舊分支發佈錯誤修復。由於我們使用最新版本的eslint,linting在基於舊版本的分支上失敗。我們只是使用'--no-verify'來推送到服務器,但是我們的構建過程更加健壯,並且確保在合併發佈分支之前(使用正確版本)通過(通過PR) – JDB

+0

@JDB Jenkins也會運行在提交之前將linting合併爲master,所以該進程不依賴於預提交鉤子。問題在於詹金斯通常超載,在實際運行之前可能需要很長時間。預先提交鉤子是好的,因爲它提供了更快的反饋,並防止Jenkins上不必要的負載。 –

回答

1

這一般很困難。

最直接的方法是將索引提取到臨時目錄中。這有一些明顯的缺點:特別是,居住在工作樹中的忽略文件不會被帶入臨時目錄。更糟糕的是,臨時目錄只有這個存儲庫的文件:任何環境(例如子模塊和/或超級項目)都不會被轉移。

承載這些東西是可能的,但可能消耗很多空間和/或時間。

下面是將整個工作樹(包括子模塊)到一個臨時目錄,然後提取索引目錄頂上是一個簡單的方法:

#! /bin/sh -e 

tmpdir=$(mktemp -d) 
trap "rm -rf $tmpdir" 0 1 2 3 15 

# remainder assumes we are at top of work-tree, which is true in 
# practice in git hooks, even if it is not documented anywhere. 

# step 1: copy current tree to tmp dir 
tar cf - . | (cd $tmpdir; tar xf -) 

# step 2: extract current index to tmp dir 
git --work-tree=$tmpdir checkout -- . 

# step 3: run tests 
... tests go here ... 

對於預提交的鉤子想修改文件(例如,使用gofmtclang-format),這與一般想法混淆,因爲現在修改的文件位於被刪除的臨時目錄中。

+0

我建議使用'rsync'或'cp -ap'而不是2'tar's。除此之外 - 完美的答案! – phd

+0

謝謝。我還沒有時間嘗試這一點呢。一旦我確認它正在工作,我會接受你的答案。 –