2011-09-21 28 views
4

我想在任何提交之前设置一个预先提交的钩子来测试我的项目,但我找不到如何确保只有HEAD(来自当前提交的补丁)被测试,而不是当前working_tree(在大多数情况下,这对我来说很脏)。如何测试当前提交而不是工作树?

找到的解决方案:

找到此链接并结束了以下操作。

http://newartisans.com/2009/02/building-a-better-pre-commit-hook-for-git/

# Checkout a copy of the current index into MIRROR 
git checkout-index --prefix=$TMPDIR/ -af 

# Remove files from MIRROR which are no longer present in the index 
git diff-index --cached --name-only --diff-filter=D -z HEAD | \ 
    (cd $TMPDIR && xargs -0 rm -f --) 
+0

你是什么意思“测试我的回购”? –

+0

运行我的单元测试 – Sedrik

+0

只要你的单元测试是“git aware”并且可以访问'HEAD'版本而不是你的工作树,我看不到问题。 –

回答

1

要依赖于您实际验证和测试。因此,如果您试图查看某些内容是否在签入的文件中,您必须执行git diff --cached而不是git diff,以便您能够进行适当的更改。同样,你将不得不看看你正在使用的命令等等。

对于单元测试的事情,我可以建议是这样的(会有其他的方法太):

post-commit(不是一个pre-commit)挂钩,像这样:

#!/bin/sh 
git stash 
#run unit tests 
#if tests fail 
git stash pop --index 
git reset --soft HEAD~1 
exit 0 # if tests pass 

使用预先提交的替代方法是将索引签出到单独的目录中,从那里运行测试。看看git checkout-index。我没有以这种方式使用它,所以不能进一步评论它。

+1

我想确保当我运行我的单元测试时,它将运行在HEAD和我的阶段性提交中。 – Sedrik

+0

@Sedrik - 用可能的解决方案更新了我的答案。 – manojlds

+0

'git stash'删除了staged文件,所以它不会工作。找到了合理的解决方案并编辑了我的问题 – Sedrik

相关问题