2014-02-20 52 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