有没有办法创建一个预提交钩子,如果新版本不能编译,它将拒绝提交?

时间:2009-10-14 14:13:24

标签: svn

我们希望实施一项策略,该策略将强制开发人员仅提交将要编译的更改。

有没有办法使用预提交钩子做这样的事情?如果没有,我将很高兴听到任何可以保持源完整性的建议或解决方法。

5 个答案:

答案 0 :(得分:3)

使用预提交挂钩启动构建会很复杂,因为存储库还没有具有您要在该点检查的状态的修订。存储库确实有一个待处理的事务,您可以使用svnlook进行检查;这可用于实现一些规则,但there is no easy svnlook export command可以进行完整构建。

预先提交还必须在拒绝或完成提交之前等待构建结果,这将极大地减慢速度。我想这会鼓励开发人员在一天结束时做“一次大提交”,而不是在适当的时候做很多小的(=可审查的)提交。

解决方案1:不要拒绝,回滚

执行世界其他地方的工作:设置continuous integration服务器(如CruiseControlTeam Build等),为每次提交执行构建。如果构建失败,则会触发触发大声警报发送电子邮件。任何感觉构建失败的开发人员都可以easily revert the changes

解决方案2:功能分支和集成管理器

行李箱(或其他一些分支机构)被视为“受祝福”。开发人员具有读取权限,但他们不直接对其进行更改。相反,所有更改都在feature branch上完成,可以自由提交。当更改准备就绪时,开发人员确保通过合并主干更改和解决冲突将其干净地合并到主干。然后他通知整合经理。然后,集成管理器可以执行质量控制(例如检查仍然构建的内容)并执行svn merge --reintegrate以将更改推送到主干。有点重,但有些项目使用这个过程。

答案 1 :(得分:1)

你可能不应该这样做。提交应该很快,以便开发人员可以快速轻松地进行许多小的更改。在接受每次提交之前尝试进行完整构建会使提交过程花费大量时间并破坏开发人员的工作流程。

答案 2 :(得分:1)

你真的不需要这个钩子;您可以使用CI服务器注意构建失败,并还原新文件。通过这种方式,构建将是自我保护的,这将是一种有趣的,恕我直言:)

此外,您可以通知开发人员/每个人,他们的相关提交失败。

通常,您可以通过更复杂的构建系统(夜间构建,无论如何)来解决此问题。

我很感兴趣,为什么不能告诉他们所有人都不要承诺,直到它建立?他们离岸吗?

答案 3 :(得分:1)

其他人已经解决了天气,这是一个好主意,所以我只会解释如何做到这一点

预提交中的

,在这个例子中是一个shell脚本(通常是?)但是如果你想要的话可​​以是一个程序:

repo="$1"
tx="$2"

# "magic" is a cut or sed command that fits your repository structure
# to find the tag/branch/etc root you need to compile the project
relative_url=$(svnlook dirs-changed -t "$tx" "$repo" | head -1 | magic)

# get a clean copy of the code
# note that this caches e.g. '.o' files from previous commits
# usually making subsequent builds faster
build_dir="~/testcommit/$relative_url"
mkdir -p "$build_dir"
svn co "file://$repo/$relative_url" "$build_dir"
cd "$build_dir"
svn revert -R .
svn up

# update it to match what the user tries to commit
diff_file="/tmp/testcommit."$$".diff"
svnlook diff -t "$tx" "$repo" > $diff_file
# you may have to adjust 'p1' to fit your repository depth
patch -p1 < $diff_file

# adjust to fit your needs
make

if [ some-test-fails ]
then
  # stdout is always discarded
  # stderr is shown to the user if the hook fails
  echo "error message to the user" 1>&2
  exit 1
fi

# allow the commit
exit 0

答案 4 :(得分:0)

我不认为你想要的是SVN。

告诉开发人员提交工作代码是他们的JOB。他们的周期应该是:

  1. 进行更改
  2. svn update
  3. 运行构建,其中应包括测试
  4. 重复1到3,直到它正确构建
  5. 通过有意义的评论提交更改。
  6. 设置像Hudson这样的持续集成服务器,在构建中断时发送电子邮件。羞辱任何破坏构建的开发人员,甚至是你自己。谴责任何不断破坏构建的开发人员。

相关问题