我無法重現您的問題。我最初的猜測是GIT_INDEX_FILE
環境變量正在被你的pre-commit
掛鉤取消。但是,當我嘗試從pre-commit
未設置GIT_INDEX_FILE
,我得到了一個不同的問題(Git抱怨.git/index
被鎖定)。
下面是一個示例腳本,顯示Git的功能如您所期望的那樣,並且其他內容必須是錯誤的。該腳本初始化一個新的測試版本庫,創建一個pre-commit
鉤模仿你的鉤子做什麼,並提出了一些測試承諾:
#!/bin/sh
# initialize the test repository
rm -rf testrepo
git init testrepo
cd testrepo
# create the pre-commit hook
cat <<\EOF >.git/hooks/pre-commit
#!/bin/sh
git status --porcelain | while IFS= read -r line; do
# todo: handle renames and deletions of a *.less file
f=${line#???}
case ${f} in
*.less)
fb=${f%.less}
echo bar >>"${fb}".css
echo baz >>"${fb}".min.css
git add "${fb}".css "${fb}".min.css
;;
esac
done
EOF
chmod +x .git/hooks/pre-commit
# create foo.less, commit it
echo foo >foo.less
git add foo.less
git commit -m "add foo.less"
# modify foo.less, commit it
echo foo2 >>foo.less
git commit -a -m "modify foo.less"
如果您在測試中運行的倉庫git log -p
和查看最終的承諾,你」當foo.less
被修改時,將看到foo.css
和foo.min.css
被修改。
這也是爲什麼我覺得你的問題是通過改變/取消設置GIT_INDEX_FILE
環境變量引起的:
當git commit -a
運行,Git會使得臨時索引文件,並使用,而不是默認.git/index
創建提交。爲了使像git add
這樣的操作能夠在pre-commit
鉤子內工作,Git將GIT_INDEX_FILE
環境變量設置爲在運行pre-commit
之前創建的臨時索引的名稱。如果您的掛鉤取消設置GIT_INDEX_FILE
,或將其設置爲.git/index
,則鉤子中的所有Git操作都會嘗試修改原始索引,而不是用於生成提交的臨時索引。
但是,臨時索引文件也充當原始索引文件的鎖定。如果掛鉤試圖修改原始索引,並且臨時索引存在,那麼Git將會中止並出現錯誤。
由於CSS文件不是二進制文件,它們只是靜態文本文件。生成的文件不會放在版本控制中,因爲它們通常會導致合併衝突,而您沒有真正有效的方法來解決它們(二進制文件),但對於CSS文件,您很少遇到這種問題。我不想在我們的Web服務器上安裝一個LESS編譯器來進行合併/更新。然而,所有這一切說,它確實證明是一種更簡單的方法來完成我正在嘗試做的事情,儘管它並不理想。 – 2012-03-03 22:22:41
爲什麼這是被接受的答案?這根本不能解決問題。 – frhd 2014-10-01 16:00:47
我猜他接受了我的「你做錯了」的非答案,因爲在這種情況下,它解決了他的問題(可以說沒有回答他的問題)。如果他沒有首先檢查LESS文件,那麼「我如何將它們融入提交」問題就會消失。 – plaugg 2014-10-15 19:00:03