[英]Git pre-commit hook to regenerate a file and reject the commit if there are diffs
我的情況是(大致類似於)以下情況:
我們有目錄結構
my-repo/
input.txt
output-1.bin
output-2.bin
output-3.bin
converter.py
為了簡單起見,假設converter.py
如下所示:
#/usr/bin/env python
from shutil import copyfile
copyfile('input.txt', 'output-1.bin')
copyfile('input.txt', 'output-2.bin')
copyfile('input.txt', 'output-3.bin')
我們對 input.txt
和 output-*.bin
版本控制。 我知道,我知道,您要說的是沒有理由對生成的文件進行版本控制...但這在我們的案例中是不可商議的。 我們經常使用.bin文件,因為它們是關鍵任務,我們不能冒險用converter.py
的細微錯誤將它們搞砸。 對converter.py
腳本和輸出進行版本控制可確保任何腳本更改的后果在git歷史中都非常明顯。
但這給我們帶來了一個問題。 我們可以修改input.txt
並提交該diff,而無需運行converter.py
來更新.bins!
對於git pre-commit鈎子,這是一項完美的工作。
我們可以通過git diff --cached --name-only --diff-filter=ACM
獲得更改文件的列表。 如果該列表包括input.txt
或converter.py
,那么我們要運行converter.py
,然后將輸出與提交的.bin文件進行比較。
所以我有兩個問題/問題:
如何在預提交掛鈎中運行converter.py
,而又不破壞用戶在其本地結帳中可能進行的任何未提交的更改? 這基本上是我如何正確地在預提交的鈎子中混入stash / pop以獲取干凈的工作樹進行測試?
然后, 在運行converter.py
之后,我怎么能問git“工作樹中現在有未提交的差異嗎?” 我的意思是我希望答案只是git diff
,但是我不確定從預提交的鈎子內部執行時git diff
到底意味着什么。
這個問題之所以很重要,是因為converter.py
改變了工作樹的狀態,而不是僅僅將其輸出分散到stdout。 令人遺憾的是,這也是該問題的不可談判的公理。
思考? 工作代碼段? :)
如何將腳本復制到臨時位置,然后在其中運行並將結果與回購中的文件進行比較?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.