【发布时间】:2012-09-07 14:36:35
【问题描述】:
pre-commit 挂钩运行时,存储库可能不干净。因此,如果您天真地运行测试,它们将不会与您正在提交的内容相冲突,而是与您的工作树中发生的任何事情相冲突。
显而易见的事情是git stash --keep-index --include-untracked 在pre-commit 的开头和git pop 在结尾。这样您就可以针对(纯)索引进行测试,这正是我们想要的。
不幸的是,如果您使用 git add --patch(尤其是在您编辑 hunks 时),这会生成合并冲突标记,因为 stash@{0} 的内容在提交后可能与工作树不匹配。
另一种常见的解决方案是克隆存储库并在新的临时存储库中运行测试。这有两个问题:
- 我们还没有提交,所以我们不能轻易地获得我们即将提交的状态的存储库的副本;和
- 我的测试可能对当前工作目录的位置很敏感,例如由于本地环境配置。
如何在不引入合并冲突标记且不修改提交后HEAD 的情况下将我的工作树恢复到git stash --keep-index --include-untracked 之前的任何状态?
【问题讨论】:
-
预提交脚本接收正在提交的数据作为输入。为什么你需要看其他东西?也许您尝试做的最好是在预提交钩子以外的其他东西中完成。您想要进行哪些需要访问完整存储库的测试?
-
@WilliamPursell:“正在提交的数据”是什么意思。预提交脚本在我的工作树(即源存储库的基础)中运行。问题是,如果您对存储库进行了一些更改并且只暂存了其中的一些(例如,您添加了一些文件但没有添加其他文件),那么您将不会在提交发生之前对其进行测试(我想要做的),您将测试工作目录中的所有内容。
-
您提交的补丁在标准输入上可用于预提交挂钩。如果不是正在提交的补丁,你在测试什么?预提交挂钩的目的是验证补丁。
-
@WilliamPursell,你能详细说明一下吗?我的构建需要一秒钟左右。所以没有理由不运行它。如果您不认为这是对 pre-commit 的合法使用,那么您似乎暗示您知道在哪里。看看其他钩子,它们看起来不像我想要的。在这种情况下,我想防止事情被提交,除非他们建立。这似乎不是对
pre-commit的不合理使用。如果您认为是,请解释原因,以及可能的明智选择。 -
我确实使用了很多小提交。我只想让代码处于易于一分为二的状态。我经常想在提交之前用
git add -p以简单的方式编辑帅哥。由于我的构建速度如此之快,我想确保这些调整不会破坏构建。
标签: git githooks pre-commit-hook pre-commit git-index