Git钩子 - 在提交时自动更新文件md5sum

时间:2014-02-20 19:00:08

标签: git githooks pre-commit-hook

我的git存储库中的一个脚本分发给许多用户。当他们运行此脚本时,我会查看我的存储库并查看是否对此脚本进行了任何更改,如果是,则建议用户从存储库更新脚本。用户对git一无所知,希望在系统实现中尽可能少地理解。

我想在每次提交时自动更新此脚本的md5sum,而无需费心去手动操作。这是我写的预提交钩子

#!/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说我无法提交,因为我的分支超过'origin / master'提交1次,我试图推送我的更改之前提交md5sum但它从未完成操作。

实现此类功能的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您的预提交挂钩不会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'

在预提交挂钩中查看索引中文件的版本 - 即,如果预提交挂钩允许提交继续进行,将执行什么,而不执行任何git add步骤 - 你可以使用git show :0:test.txt。魔术:0:前缀是“{3}}语法,用于”提交的版本“。 (您可以将其进一步缩写为:test.txt,尽管我发现:0:作为revspec更加明显;我看到真正的文件确实名为:README。:-) )请注意,这会绕过任何涂抹过滤器。

(想要测试整个当前索引内容但同时保留工作目录状态的挂钩可以使用git stash save --keep-index。请参阅gitrevisions获取建议,并注意这一点。)< / p>

在我当前版本的git(1.8.5.4)中,如果我在预提交钩子中修改文件并git add结果,那么I add ed的内容就是提交的内容。 (我确实对pre-commit钩子运行之前保存索引的早期版本的git有一些模糊的回忆,因此对索引所做的更改没有进入提交,但我可能只是记错了。)< / p>

除此之外:在预提交挂钩中修改提交内容通常不是一个好主意。他们真的只是想验证提交准备好了。但是,如果您决定修改内容,git add(或git update-index,但添加更简单)将会这样做。

相关问题