Добавить префикс для сообщения фиксации в SourceTree

Обычно я создаю ветки с сайта выпуска JIRA. Допустим, имя моего тикета JIRA — «SOMEBUG-356: ошибка в программном обеспечении», тогда имя ветки будет: «feature/SOMEBUG-356-bug-in-software».

Можно ли установить какой-то шаблон для SourceTree, который добавит префикс для сообщения фиксации с именем билета JIRA ветки, в которой я сейчас нахожусь? (Это добавило бы префикс SOMEBUG-356, если бы я был в ветке "feature/SOMEBUG-356-bug-in-software"


person Mariusz    schedule 05.11.2015    source источник


Ответы (2)


Я не слишком уверен, что это правильный способ сделать это, в моей компании мы используем собственный gitflow при создании веток и т. д. Однако во всех коммитах мы применяем регулярное выражение как часть коммита. Вы можете сделать это, перейдя в папку .git проекта и открыв папку ловушек, там вы увидите, что файл commit-msg.sample удаляет .sample, поэтому он говорит commit-msg. В этот файл добавьте что-то вроде.

#!/usr/bin/env bash


# regex to validate in commit msg
commit_regex='(SOMEBUG|SOMEOTHERBUG)-[0-9]{0,6}\w+'
error_msg="Aborting commit. Your commit message is missing a valid JIRA Issue key and number. An example commit would be SOMEBUG-1234"

if ! grep -iqE "$commit_regex" "$1"; then
    echo "$error_msg" >&2
    exit 1
fi

Что это делает, так это принудительно выполняет регулярное выражение при каждом коммите, и, поскольку оно находится в папке .git вашего проекта, вы можете иметь собственные хуки для каждого проекта. Затем нужно добавить источник в jira, и jira синхронизирует вашу фиксацию с билетом jira. Если вы затем используете FishEye + Crucible, отношения могут стать невероятно сильными.

person FullStack    schedule 05.11.2015
comment
Ваше решение состоит в том, чтобы проверить сообщение, а не установить шаблон, поэтому это неправильный ответ. Вы можете использовать git hooks для добавления проверок, поведения и т. д. в жизненный цикл git. Вы найдете несколько примеров в той же папке для каждого типа хука. Существует один по имени prepare-commit-msg.sample. - person voiski; 16.02.2018
comment
Я согласен, что это неправильный ответ, это требует проверки регулярных выражений при фиксации. Ответ можно найти здесь stackoverflow.com/questions/5894946/ - person FullStack; 20.02.2018

Я не смог найти окончательный ответ на sourcetree, но знаю, что он использует git hooks из репозитория. Это не окончательное решение, а холодная помощь.

Создайте файл .git/hooks/prepare-commit-msg с правами выполнения chmod +x .git/hooks/prepare-commit-msg и используйте следующий код в качестве примера на основе этого. Вы можете найти больше примеров в Интернете.

#!/bin/bash

COMMIT_MSG_FILE=$1
BRANCH_NAME=$(git symbolic-ref --short HEAD | sed 's/\(.*-[0-9]*\).*/\1/')
BRANCH_NAME="${BRANCH_NAME##*/}"
if [ -n "$BRANCH_NAME" ] &&
   [ $(head -1 ${COMMIT_MSG_FILE}|grep -c "${BRANCH_NAME}" ) = 0 ]
then
  sed -i.bak -e "1s/^/${BRANCH_NAME} /" ${COMMIT_MSG_FILE}
fi

Это будет отлично работать в терминале, но, к сожалению, Sourcetree не покажет это при вводе сообщения фиксации. Sourcetree будет использовать хук только после того, как вы нажмете кнопку фиксации, что приведет к сообщению с карточкой jira в префиксе.

Вы можете пойти дальше и настроить глобальные шаблоны, но это будет действовать только для новых git clones/git init. Вам все равно нужно будет скопировать хук для уже существующих клонов. Вот еще один скрипт, который поможет вам в этом путешествии, с помощью эта ссылка:

# Creating file on your home folder
mkdir -p ~/.git-templates/hooks
cat << 'EOF' > ~/.git-templates/hooks/prepare-commit-msg
#!/bin/bash
COMMIT_MSG_FILE=$1
BRANCH_NAME=$(git symbolic-ref --short HEAD | sed 's/\(.*-[0-9]*\).*/\1/')
BRANCH_NAME="${BRANCH_NAME##*/}"
if [ -n "$BRANCH_NAME" ] &&
   [ $(head -1 ${COMMIT_MSG_FILE}|grep -c "${BRANCH_NAME}" ) = 0 ]
then
  sed -i.bak -e "1s/^/${BRANCH_NAME} /" ${COMMIT_MSG_FILE}
fi
EOF
chmod +x ~/.git-templates/hooks/prepare-commit-msg

# Use this line to config as default for all new git clones/init
git config --global init.templatedir '~/.git-templates'

# Use this line to create a alias to install this hook on existing local git repos
echo "
alias git_install_commit_template_hook='ln -s ~/.git-templates/hooks/prepare-commit-msg .git/hooks/prepare-commit-msg'
" >> ~/.bash_aliases
source ~/.bash_aliases

Почему sourcetree не выполняет предварительный хук, когда я открываю ввод сообщения? Да, это плохо, потому что это больше похоже на сообщение после фиксации. Sourcetree создает интерфейс с git и имеет собственный жизненный цикл. В этом случае поля сообщения не будут взаимодействовать с git, пока вы не нажмете кнопку фиксации. Они могут улучшить его, это не должно быть сложно, но, возможно, у него больше работы, чем я знаю =P

person voiski    schedule 16.02.2018