【问题标题】:How to test current commit and not the working tree?如何测试当前提交而不是工作树?
【发布时间】:2011-11-21 16:31:25
【问题描述】:

我正在尝试设置一个预提交挂钩以在任何提交通过之前测试我的项目,但我找不到如何确保只测试 HEAD(带有当前提交的补丁)而不是当前工作树(在大多数情况下对我来说很脏)。

找到的解决方案:

找到此链接并最终执行以下操作。

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 --)

【问题讨论】:

  • “测试我的仓库”是什么意思?
  • 只要您的单元测试是“git 感知”并且可以访问 HEAD 版本而不是您的工作树,我就看不到问题。
  • 我的测试不是“git 感知”并且据我所知仅访问 HEAD 不会给我我的暂存区域。无论如何,我找到了答案(请参阅接受的解决方案)
  • 如果您的测试不支持 git,那么您需要摆脱(可能是暂时的,例如通过 stage)未提交的更改或检查干净的工作树,可能通过 @987654325 @ 和 checkout-index。 “暂存区”可能包括当前提交中不是的补丁,因此您需要HEAD,而不是您的索引/缓存/暂存区。从根本上说,如果你不能直接访问 git 模型,你需要一个看起来像 HEAD 的文件系统区域。我没有办法解决这个问题。
  • 我找到了一种解决方法,并用它更新了我的问题。感谢您的帮助。

标签: git githooks pre-commit


【解决方案1】:

将取决于您实际验证和测试的内容。因此,如果您尝试查看签入的文件中是否没有某些内容,则必须执行git diff --cached 而不是git diff,以便您获得适当的更改。同样,您必须查看正在使用的命令等等。

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

像这样写一个post-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。我没有用过这种方式,所以无法进一步评论。

【讨论】:

  • 我想确保当我运行我的单元测试时,它将在 HEAD 和我的分阶段提交上运行。
  • @Sedrik - 用可能的解决方案更新了我的答案。
  • git stash 也会删除暂存文件,因此它不会工作。找到了一个合理的解决方案并编辑了我的问题。
  • @Sedrik - 我想你没有注意到我说的是post-commit 钩子而不是在这种情况下预先提交。因此,您对索引的更改已提交,并且 git stash 将按预期工作
  • 一个真实的,不是那样的。那么它当然会工作,没想到那样做。感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 2014-03-12
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2011-02-26
  • 2011-03-14
相关资源
最近更新 更多