2013-11-09 2 views
10

Моего текущим конгресса филиала именования как таковые:Prepend Git коммит с частичным названием ветви

ticket-45-my-new-feature-branch-description 

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

BRANCH_NAME=$(git branch 2>/dev/null | grep -e ^* | tr -d ' *') 
if [ -n "$BRANCH_NAME" ] && [ "$BRANCH_NAME" != "master" ]; then 
    echo "[$BRANCH_NAME] $(cat $1)" > $1 
fi 

Конечный результат:

[ticket-45-my-new-feature-branch-description] test commit 

То, что я пытаюсь выполнения выводятся так:

[ticket-45] test commit 

домовых очки, если мы можем извлечь выгоду его:

[TICKET-45] test commit 

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

ticket-123-branch-name 
abc-22-my-branch 
ua-11-my-feature 

Единственное, в общем является тот факт, что мне нужно все, что до второго «-».

Любая помощь с благодарностью!

ответ

14

Хорошо, во-первых, это:

BRANCH_NAME=$(git branch 2>/dev/null | grep -e ^* | tr -d ' *') 

является основным излишеством :-) Использование:

branch=$(git symbolic-ref --short HEAD) || ... 

, чтобы получить текущее имя ветви. Часть после || - «что делать, если вы не на ветке» (т. Е. Если вы находитесь в режиме «снятой головы»), вам придется решить это для себя. (Ваш текущий код устанавливает BRANCH_NAME в пустую строку, для этого вам даже не нужна часть ||, но вы можете добавить -q или 2>/dev/null, чтобы избежать сообщения «фатальный:» из символического реф.)

Остальное - просто базовые сценарии. В bash вы можете использовать регулярное выражение непосредственно, в старых sh вы можете вызывать expr или sed. Оба sed и tr может строчный-римент, но СЭД может сделать регулярное выражение тоже, так что это выглядит как хороший кандидат:

$ trimmed=$(echo $branch | sed -e 's:^\([^-]*-[^-]*\)-.*:\1:' -e \ 
    'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/') 
$ echo $trimmed 
TICKET-45 

Последних, это немного опасно делать:

echo "some stuff $(cat $1)" > $1 

, как вы зависите от оболочки, чтобы развернуть $(cat $1), прежде чем он обрезает выходной файл для части > $1. (Очевидно, что это работает, но вы подвержены капризам оболочек.) Лучше использовать временный файл, или, возможно, другой sed, но на месте:

sed -i .bak -e "1s:^:[$trimmed] :" $1 
# or use -i '', but note minor warning in sed man pages 

выше испытывается только по частям, но должен работать.

+0

Это работает как шарм. Спасибо за очень подробное сообщение! – gjunkie

+0

Сценарий, вышедший выше, скорее всего, из моего блога, так что все стыдно за меня. Большое спасибо за подробное объяснение. Теперь я могу назвать себя «немного лучше оболочки n00b» :) Я обновлю свой блог с вашими предложениями. –

+0

@ bartosz.majsak: эй, всем нужно начинать где-то :-) – torek

Смежные вопросы