2016-02-16 3 views
2

Я нашел себя работающим с группой, которая имеет утомительный формат журнала изменений. Я решил, что хочу автоматизировать создание записи журнала изменений на основе данных сообщения о фиксации. Процесс заключается в том, что вы поставляете форматированное сообщение фиксации, затем меняете файл журнала изменений «на лету» и пытаетесь добавить его в текущую фиксацию.Git hook commit-msg git добавить файл

У меня совершить-сообщ крюк:

#!/bin/bash 

GIT_BRANCH=`git branch` 

# Only run this hook on the master branch 
if [ "$GIT_BRANCH" = '* master' ] 
then 
    # set some variables we'll need 
    SAMPLE_COMMIT_MESSAGE="minor: #ws-666 Brings the devil back to life" 
    COMMIT_MESSAGE_FILE=$1 
    FULL_COMMIT_MESSAGE=$(cat $COMMIT_MESSAGE_FILE) 
    CURRENT_DATE=$(date +"%Y-%m-%d") 

    # let's do some pattern matching on the commit to set more variables 
    [[ $FULL_COMMIT_MESSAGE =~ (ws-[0-9]+)[:space:]*(.*) ]] 
    JIRA_ISSUE=${BASH_REMATCH[1]^^} 
    COMMIT_MESSAGE=${BASH_REMATCH[2]} 

    [[ $FULL_COMMIT_MESSAGE =~ ^(M) ]] 
    if [ -n "${BASH_REMATCH[1]}" ] 
    then 
    CHANGE_IMPACT="_Major_" 
    fi 

    [[ $FULL_COMMIT_MESSAGE =~ ^(m) ]] 
    if [ -n "${BASH_REMATCH[1]}" ] 
    then 
    CHANGE_IMPACT="_minor_" 
    fi 

    [[ $FULL_COMMIT_MESSAGE =~ ^([pP]) ]] 
    if [ -n "${BASH_REMATCH[1]}" ] 
    then 
    CHANGE_IMPACT="_patch_" 
    fi 

    #echo Full Commit Message "$FULL_COMMIT_MESSAGE" 
    #echo Jira issue $JIRA_ISSUE 
    #echo Change Type $CHANGE_IMPACT 
    #echo Commit Message "$COMMIT_MESSAGE" 

    if [ -z $JIRA_ISSUE ] 
    then 
    echo "You failed to specify a jira issue, your commit must look like:" 
    echo "$SAMPLE_COMMIT_MESSAGE" 
    exit 1 
    fi 

    if [ -z $CHANGE_IMPACT ] 
    then 
    echo "You failed to specify a change impact, your commit must look like:" 
    echo "$SAMPLE_COMMIT_MESSAGE" 
    exit 1 
    fi 

    if [ -z $COMMIT_MESSAGE ] 
    then 
    echo "You failed to specify an actual commit message, your commit must look like:" 
    echo "$SAMPLE_COMMIT_MESSAGE" 
    exit 1 
    fi 

    sed -i -e ":a;N;s/\(# Change log.*\)\n/\1\n\n\* next ($CURRENT_DATE)\n $JIRA_ISSUE\n \* $CHANGE_IMPACT: $COMMIT_MESSAGE/" change-log.md 

    `git add change-log.md` 

    echo Running $BASH_SOURCE 
    set | egrep GIT 
    echo PWD is $PWD 

fi 

# For testing, always exit 
echo "Exiting, no commit made" 
exit 1 

Я тогда выполните следующую команду:

git checkout -- ../change-log.md ; git commit ../fake -m"Major #ws-123 WeeeeeeEE" ; git status 

В состоянии мерзавца я вижу:

Changes not staged for commit: 
    (use "git add <file>..." to update what will be committed) 
    (use "git checkout -- <file>..." to discard changes in working directory) 

    modified: ../change-log.md 

Является ли это невозможно, чтобы git добавил файл на этом этапе процесса фиксации? Другие мысли о том, как лучше всего это сделать? Я думаю, что могу проверить, существует ли конкретная запись журнала изменений, если нет, добавить ее, а затем выйти, попросив добавить этот файл.

-j

+0

Посмотрите здесь пример кода, который вы можете использовать.http: //stackoverflow.com/questions/35400416/what-are-some-more-forceful-ways-than-a-gitignore-to-keep- force-files-out-of/35400472 # 35400472 – CodeWizard

+0

Не могли бы вы рассказать о соответствующей части? Вышеупомянутый крючок делает все, кроме, казалось бы, строки 'git add change-log.md', которая, похоже, не влияет. – Joel

+0

Почему у вас есть внутри кавычек? 'git добавить change-log.md' попробовать его без него. вам нужно использовать их, если вы решите вернуть значение. – CodeWizard

ответ

0

Добавление после редактирования файла перед вызовом мерзавца добавить, а затем снижаются до оболочки и набрав git add change-log.md дал мне ошибку, что fatal: Unable to create '/home/jjshoe/test/.git/index.lock': File exists.

Что делает общий смысл.

0

Один (несколько Hacky), что вы могли бы сделать, это добавить пост-фиксации с единственной строчкой:

git commit --amend -C HEAD --no-verify change-log.md 

Это добавит change-log.md к каждой фиксации, если она изменилась, и ничего не делайте, если нет.

+0

Недостатком здесь является новый SHA, это приведет к тому, что CI снова запустится. – Joel

+0

@Joel, разве ваш CI работает только на push? Или у вас есть какой-то CI локально на вашей машине или что-то еще? –

+0

CI опросы на изменения. – Joel