我有一個惱人的問題。我們正在運行linting作爲預先提交的鉤子。問題在於它正在工作目錄而不是實際的提交。這有兩個問題:如何提交提交,而不是工作目錄?
提交是壞的,但linting通過。
如果您在修復linting問題後忘記進行更改,則會發生這種情況。承諾是好的,但linting失敗。
我經常有一些調試代碼,我不打算提交。這些變化確實沒有意義,而且處理起來很麻煩。
現在,問題是我該如何編寫一個更智能的提交前鉤子,而不是工作目錄,最好不改變工作目錄?
我有一個惱人的問題。我們正在運行linting作爲預先提交的鉤子。問題在於它正在工作目錄而不是實際的提交。這有兩個問題:如何提交提交,而不是工作目錄?
提交是壞的,但linting通過。
如果您在修復linting問題後忘記進行更改,則會發生這種情況。
承諾是好的,但linting失敗。
我經常有一些調試代碼,我不打算提交。這些變化確實沒有意義,而且處理起來很麻煩。
現在,問題是我該如何編寫一個更智能的提交前鉤子,而不是工作目錄,最好不改變工作目錄?
這一般很困難。
最直接的方法是將索引提取到臨時目錄中。這有一些明顯的缺點:特別是,居住在工作樹中的忽略文件不會被帶入臨時目錄。更糟糕的是,臨時目錄只有這個存儲庫的文件:任何環境(例如子模塊和/或超級項目)都不會被轉移。
承載這些東西是可能的,但可能消耗很多空間和/或時間。
下面是將整個工作樹(包括子模塊)到一個臨時目錄,然後提取索引目錄頂上是一個簡單的方法:
#! /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 ...
對於預提交的鉤子想修改文件(例如,使用gofmt
或clang-format
),這與一般想法混淆,因爲現在修改的文件位於被刪除的臨時目錄中。
我建議使用'rsync'或'cp -ap'而不是2'tar's。除此之外 - 完美的答案! – phd
謝謝。我還沒有時間嘗試這一點呢。一旦我確認它正在工作,我會接受你的答案。 –
僅限分段差異。 – ElpieKay
聽起來有棱角。不要構建依賴於預提交鉤子的進程。它們只是爲了方便而且很容易被禁用。我們使用不同的分支來代表我們產品的主要版本,並偶爾會向舊分支發佈錯誤修復。由於我們使用最新版本的eslint,linting在基於舊版本的分支上失敗。我們只是使用'--no-verify'來推送到服務器,但是我們的構建過程更加健壯,並且確保在合併發佈分支之前(使用正確版本)通過(通過PR) – JDB
@JDB Jenkins也會運行在提交之前將linting合併爲master,所以該進程不依賴於預提交鉤子。問題在於詹金斯通常超載,在實際運行之前可能需要很長時間。預先提交鉤子是好的,因爲它提供了更快的反饋,並防止Jenkins上不必要的負載。 –