【问题标题】:Why do I get this error: post-commit hook failed (exit code 255) with no output为什么我会收到此错误:提交后挂钩失败(退出代码 255),没有输出
【发布时间】:2011-05-09 09:30:59
【问题描述】:

我在提交到存储库时收到以下错误:

post-commit hook failed (exit code 255) with no output.

提交后代码如下:

@echo off

setlocal enableextensions

set REPOS=%1
set REV=%2
set TEMPFILE=C:\TEMP\%REV%.txt
set LOGFILE=D:\svn\logs\mysite\post_commit.log

set MANTIS_PATH="D:\home\mantis"

"C:\Program Files\SlikSvn\bin\svnlook" author %REPOS% -r %REV% >> %TEMPFILE% 2>>C:\TEMP\err.txt
"C:\Program Files\SlikSvn\bin\svnlook" date %REPOS% -r %REV% >> %TEMPFILE% 2>>C:\TEMP\err.txt
"C:\Program Files\SlikSvn\bin\svnlook" changed %REPOS% -r %REV% >> %TEMPFILE% 2>>C:\TEMP\err.txt
echo revision:[%REV%] >> %TEMPFILE% 2>>C:\TEMP\err.txt
"C:\Program Files\SlikSvn\bin\svnlook" log %REPOS% -r %REV% >> %TEMPFILE% 2>>C:\TEMP\err.txt

date /T >> %LOGFILE% 2>>C:\TEMP\err.txt
time /T >> %LOGFILE% 2>>C:\TEMP\err.txt
D:\wamp\bin\php\php5.3.0\php.exe %MANTIS_PATH%\scripts\checkin.php < %TEMPFILE% >> %LOGFILE% 2>>C:\TEMP\err.txt
  • 正如您所见,有大量错误日志记录,但错误日志永远不会被填充(除非我输入了明显的错误,例如缺少路径)
  • 开发环境和实时环境都是 Windows
  • 似乎出现错误的那一行是最后一行 - 调用 PHP 的地方。当我把它拿出来时,提交工作没有问题
  • 当我在命令行上手动运行它时,它可以工作并且不显示任何(明显的)错误。 Afaik svn 默认在 SYSTEM 下运行,用户权限足够高,不必担心

您可能已经知道,这是将我的 SVN 签入与 Mantis 错误跟踪器连接起来。有趣的是 PHP 脚本正在执行,即注释被添加到错误中并且问题的自动关闭正在工作。它似乎只是出于某种原因出错。

我使用 TortoiseSVN 提交,但使用命令行 (SlikSVN) 我得到相同的输出:

svn ci -m "this is a test" test.txt
Sending        test.txt
Transmitting file data .
Committed revision 1337.

Warning: post-commit hook failed (exit code 255) with no output.

Mantis 的 checkin.php 看起来像这样(为了便于阅读,删除了一些通用的 cmets):

#!/usr/bin/php -q
<?php

global $g_bypass_headers;
$g_bypass_headers = 1;
require_once( dirname( dirname( __FILE__ ) ) . DIRECTORY_SEPARATOR . 'core.php' );

# Make sure this script doesn't run via the webserver
if( php_sapi_name() != 'cli' ) {
    echo "checkin.php is not allowed to run through the webserver.\n";
    exit( 1 );
}

# Check that the username is set and exists
$t_username = config_get( 'source_control_account' );
if( is_blank( $t_username ) || ( user_get_id_by_name( $t_username ) === false ) ) {
    echo "Invalid source control account ('$t_username').\n";
    exit( 1 );
}

if( !defined( "STDIN" ) ) {
    define( "STDIN", fopen( 'php://stdin', 'r' ) );
}

# Detect references to issues + concat all lines to have the comment log.
$t_commit_regexp = config_get( 'source_control_regexp' );
$t_commit_fixed_regexp = config_get( 'source_control_fixed_regexp' );

$t_comment = '';
$t_issues = array();
$t_fixed_issues = array();
while(( $t_line = fgets( STDIN, 1024 ) ) ) {
    $t_comment .= $t_line;
    if( preg_match_all( $t_commit_regexp, $t_line, $t_matches ) ) {
        $t_count = count( $t_matches[0] );
        for( $i = 0;$i < $t_count;++$i ) {
            $t_issues[] = $t_matches[1][$i];
        }
    }

    if( preg_match_all( $t_commit_fixed_regexp, $t_line, $t_matches ) ) {
        $t_count = count( $t_matches[0] );
        for( $i = 0;$i < $t_count;++$i ) {
            $t_fixed_issues[] = $t_matches[1][$i];
        }
    }
}

# If no issues found, then no work to do.
if(( count( $t_issues ) == 0 ) && ( count( $t_fixed_issues ) == 0 ) ) {
    echo "Comment does not reference any issues.\n";
    exit( 0 );
}

# Login as source control user
if( !auth_attempt_script_login( $t_username ) ) {
    echo "Unable to login\n";
    exit( 1 );
}

# history parameters are reserved for future use.
$t_history_old_value = '';
$t_history_new_value = '';

# add note to each bug only once
$t_issues = array_unique( $t_issues );
$t_fixed_issues = array_unique( $t_fixed_issues );

# Call the custom function to register the checkin on each issue.

foreach( $t_issues as $t_issue_id ) {
    if( !in_array( $t_issue_id, $t_fixed_issues ) ) {
        helper_call_custom_function( 'checkin', array( $t_issue_id, $t_comment, $t_history_old_value, $t_history_new_value, false ) );
    }
}

foreach( $t_fixed_issues as $t_issue_id ) {
    helper_call_custom_function( 'checkin', array( $t_issue_id, $t_comment, $t_history_old_value, $t_history_new_value, true ) );
}

exit( 0 );

【问题讨论】:

    标签: php svn mantis post-commit-hook


    【解决方案1】:

    我通常建议不要对 Subversion 挂钩使用批处理脚本。有大量的免费、开源、脚本语言更强大、更容易使用。哎呀,我什至不使用 BASH 作为钩子脚本。

    尤其如此,因为挂钩脚本只需要在服务器上运行,而无需在其他任何地方运行。这意味着您只需让它在单个平台上运行。


    话虽如此,您需要进行一些调试。您的钩子脚本通过svn commit 命令行失败。这意味着这不是乌龟相关的问题。这是一个钩子脚本问题。由于这是一个后挂钩脚本,请尝试从命令行运行脚本本身并从命令行将存储库和修订传递给它:

    C> post-commit C:\repos\my_repo 2323
    

    这行得通吗?

    问题是你没有在STDERR 上打印任何东西,所以Subversion 没有任何东西可以打印。您正在文件中捕获 STDERR。去掉2&gt;&gt;C:\TEMP\err.txt,这样就可以看到错误输出了。在 Python、BASH 和 Perl 中,我可以捕获 STDERR,并且仍然可以将其打印出来,但我不确定如何在 Batch 脚本中执行此操作。

    这将允许您查看错误输出,并可能帮助您确定脚本失败的位置。它在调用您的 PHP 脚本之前是否失败?您的 PHP 脚本中发生了什么事吗?您所做的假设是否不一定有效?

    此外,不要只在 PHP 挂钩中添加 echo 内容。无论钩子成功还是失败,Subversion 都不会在STDOUT 上打印任何内容。使用fputs(STDERR, 'My Error Message'); 而不是echoprint。这会将您的错误消息发送到 STDERR,如果您的钩子脚本失败,Subversion 会将其打印出来。

    希望这会有所帮助。

    【讨论】:

    • "- 似乎出现错误的那一行是最后一行-调用 PHP 的地方。当我把它拿出来时,提交工作没有问题-当我在命令行上手动运行它时它工作并且没有显示任何(明显的)错误。Afaik svn 默认用户在 SYSTEM 下运行,该用户具有足够高的权限,不必担心“以上来自我问题中的要点。是的,我手动尝试过,效果很好。此外,最后一行 PHP 绝对是导致问题的原因。我把它拿出来,它工作正常,再放回去就坏了。感谢其他提示!
    【解决方案2】:

    我也遇到了这个问题。确保您的脚本文件权限设置为可执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-15
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      相关资源
      最近更新 更多