Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 从commit msg hook中有条件地跳过预提交hook_Git_Githooks_Pre Commit Hook - Fatal编程技术网

Git 从commit msg hook中有条件地跳过预提交hook

Git 从commit msg hook中有条件地跳过预提交hook,git,githooks,pre-commit-hook,Git,Githooks,Pre Commit Hook,我有一个预提交钩子,确保在任何提交之前,主题分支总是使用devel重新设置基础。然而,有时在我的工作中,我想把我的未完成的工作,而不是把它藏起来以防万一,在重启之前重置。对于此类工作保存提交,提交消息必须完全相同,例如“工作保存提交”。我希望commit msg hook检查这种情况,如果是工作保存提交,则跳过预提交hook。precommit hook始终侦听环境变量“override\u hooks”,所以我尝试在commit msg中更改它,但没有成功。我知道我可以手动设置override

我有一个预提交钩子,确保在任何提交之前,主题分支总是使用devel重新设置基础。然而,有时在我的工作中,我想把我的未完成的工作,而不是把它藏起来以防万一,在重启之前重置。对于此类工作保存提交,提交消息必须完全相同,例如“工作保存提交”。我希望commit msg hook检查这种情况,如果是工作保存提交,则跳过预提交hook。precommit hook始终侦听环境变量“
override\u hooks
”,所以我尝试在commit msg中更改它,但没有成功。我知道我可以手动设置override_钩子,但我希望我不会每次都这样做。我非常感谢您的帮助。

预提交
钩子之后运行
准备提交消息
钩子,因此该钩子不起作用

#!/usr/local/bin/Rscript

## check if commit msg has 'resetme' or 'worksave' (a save-work commit)
## if not, check and ensure 'devel' branch is not ahead

.stop <- function(msg) {
    stop('\n\n', msg, '\n\n', call. = FALSE)
}

## source utilities from GitHub
## ------------------------------------------------------------------------ ##
source('https://raw.githubusercontent.com/ajabadi/Altools/master/R/get_package_version.R')
## ------------------------------------------------------------------------ ##
source('https://raw.githubusercontent.com/ajabadi/Altools/master/R/bump_up_version.R')

## get commit message
commit_message <- commandArgs(trailingOnly = TRUE)
commit_message <- paste0(readLines(commit_message), collapse = ' ')

## ascertain if it was a worksave commit
its_a_save_work_commit <- grepl('^resetme', tolower(commit_message)) | grepl('^worksave', tolower(commit_message))


## exit with 1 if devel is ahead of topic and it's not a worksave commit
## exit with 0 otherwise
currBranch <- current_branch()
if (isFALSE(its_a_save_work_commit)) {
    ## remind to rebase devel for topic branches if necessary
    if (!any(currBranch %in% c('master', 'devel'))) {
        devel_is_ahead <- length(system(sprintf('git log %s..devel', currBranch), intern = TRUE)) > 0
        if (devel_is_ahead) {
            .stop('devel is ahead by some changes, rebase or start the commit message with either "worksave" or "resetme"\n')
        }
}
TRUE
}

您最好设置一个别名:

# call 'git commits with
# -n to skip all pre-commit hooks
# -m msg to provide the commit message from the command line
git config alias.worksave 'commit -n -m "works save commit"'

# you can now type :
git worksave

您可以使用
commit msg
钩子,该钩子由
pre-commit
调用。我的钩子使用了太多的内部代码,所以这里不包括,但我的想法是读取
$1
(提交消息文件),并相应地执行检查以确定退出代码和/或消息

我当前实现此功能的
commit msg
具有许多自包含的依赖项,并且是用
R
编写的,但我会将其粘贴到这里,以防有任何帮助

#!/usr/local/bin/Rscript

## check if commit msg has 'resetme' or 'worksave' (a save-work commit)
## if not, check and ensure 'devel' branch is not ahead

.stop <- function(msg) {
    stop('\n\n', msg, '\n\n', call. = FALSE)
}

## source utilities from GitHub
## ------------------------------------------------------------------------ ##
source('https://raw.githubusercontent.com/ajabadi/Altools/master/R/get_package_version.R')
## ------------------------------------------------------------------------ ##
source('https://raw.githubusercontent.com/ajabadi/Altools/master/R/bump_up_version.R')

## get commit message
commit_message <- commandArgs(trailingOnly = TRUE)
commit_message <- paste0(readLines(commit_message), collapse = ' ')

## ascertain if it was a worksave commit
its_a_save_work_commit <- grepl('^resetme', tolower(commit_message)) | grepl('^worksave', tolower(commit_message))


## exit with 1 if devel is ahead of topic and it's not a worksave commit
## exit with 0 otherwise
currBranch <- current_branch()
if (isFALSE(its_a_save_work_commit)) {
    ## remind to rebase devel for topic branches if necessary
    if (!any(currBranch %in% c('master', 'devel'))) {
        devel_is_ahead <- length(system(sprintf('git log %s..devel', currBranch), intern = TRUE)) > 0
        if (devel_is_ahead) {
            .stop('devel is ahead by some changes, rebase or start the commit message with either "worksave" or "resetme"\n')
        }
}
TRUE
}

#/usr/local/bin/Rscript
##检查提交消息是否有“resetme”或“worksave”(保存工作提交)
##如果没有,检查并确保“devel”分支没有在前面

.停下来,谢谢。这是一个很好的解决办法。然而,由于它是特定于命令行提交的,所以我使用这个想法来简单地处理commit-msg钩子中的分支比较。