2014-02-20 83 views
0

我的git倉庫中的一個腳本分發給許多用戶。當他們運行這個腳本時,我會查看我的存儲庫並查看是否對此腳本進行了任何更改,如果是這樣,則建議用戶從存儲庫更新腳本。用戶對git一無所知,並希望在系統實現中儘可能少地理解。Git鉤子 - 在提交時自動更新文件md5sum

我想我每次提交它時自動更新這個腳本的md5sum,而不需要理會和做手工。這裏是pre-commit鉤子我寫

#!/bin/sh 

echo -n "# " > test.txt.tmp 
linesNumber=`wc -l test.txt | awk '{print $1}'` 
tail -n $(($linesNumber - 1)) test.txt | md5sum | awk '{print $1}' >> test.txt.tmp 
tail -n $(($linesNumber - 1)) test.txt >> test.txt.tmp 
mv test.txt.tmp test.txt 
#git push 
#git commit --no-verify --message "update file md5sum" 

md5sum也是工作正常,問題是,提交我的腳本後,再次顯示了修改。我試圖提交我的更改,但沒有運行預先提交的鉤子(--no-verify),但git說我不能提交,因爲我的分支比1提交先於'origin/master',我試圖推送我的更改提交md5sum但它從未完成操作。

什麼是實現這種功能的正確方法?

回答

1

你的pre-commit鉤子不git add更新test.txt文件。

注意,在工作目錄中的文件的版本不一定會被提交的版本:

echo foo > test.txt 
git add test.txt 
echo bar > test.txt 
git commit -m 'this commit has "foo" in test.txt' 

要看到,在pre-commit鉤子,該文件的索引版本-ie,如果預提交鉤子允許進行提交,不執行任何git add步驟,則可以使用git show :0:test.txt。魔術:0:前綴是gitrevisions語法「版本進行提交」。但請注意,這繞過任何污跡過濾器(S);(我見過真正的文件真名叫:README例如:-)你可以進一步簡寫本作只是:test.txt,雖然我覺得:0:多一點明顯的revspec。) 。

在我目前的版本(即要測試整個當前索引的內容,但保留工作目錄狀態爲好,可以使用git stash save --keep-indexHow do I properly git stash/pop in pre-commit hooks to get a clean working tree for tests的意見和警告,就這樣做。魚鉤)的git(1.8.5.4),如果我修改了一個文件並且在預提交鉤子中產生了結果,那麼內容是ed。 (我確實對早期版本的git有一些模糊的回憶,在預先提交的鉤子運行之前保存了索引,因此對索引所做的更改沒有將其提交到提交中,但我可能只是錯誤地記憶。)

另外:修改預提交鉤子中的提交內容通常不是一個好主意。他們真的只是想驗證提交準備就緒。但如果你決定修改內容,git add(或git update-index但添加更簡單)將做到這一點。

+0

我我的Git版本更新到1.9,我接着說:混帳的混帳'命令commit'前添加test.txt'。現在,我收到此錯誤信息 「錯誤:編號裁判/頭/主是710174cafabb7baf34ddeae21f16df178816cefe但預計ee25c68f58161015f9654559a155da2851a059bd」 – e271p314

+0

有趣。在pre-commit鉤子裏面現在有'git commit' *嗎?這可能會混淆後續的'git commit',當pre-commit鉤子退出時會發生。 – torek

+0

但我使用'git commit --no-verify',不應該調用預提交鉤子。也許完全不同的想法?假設你想在每次對這個文件做出改變時在某個文件中加入某種標識符,你會怎麼做? – e271p314