Мне нужна помощь с сценарием Bash, который автоматически добавит имя ветки git в качестве хэша в сообщения о фиксации.
git
bash
git-branch
Томер Лихташ
источник
источник
git branch | grep ...
для получения текущей ветки - неправильный способ сделать это. Рассмотрим либоgit symbolic-ref -q HEAD
(как показано в этом ответе ), либоgit rev-parse --abbrev-ref HEAD
. Команда symbolic-ref завершится ошибкой, если вы используете отключенную HEAD, поэтому, если вы хотите обнаружить этот случай, используйте ее. В противном случае, вероятно, лучше всего использовать метод rev-parse --abbrev-ref.Ответы:
Используйте
prepare-commit-msg
илиcommit-msg
githook .В вашем
PROJECT/.git/hooks/
каталоге уже есть примеры .В качестве меры безопасности вам придется вручную включить такую ловушку для каждого репозитория, который вы хотите использовать. Тем не менее, вы можете зафиксировать сценарий и скопировать его на всех клонах в
.git/hooks/
каталог.источник
.git/hooks/prepare-commit-msg.sample
. =) Все, что вам нужно изменить (после выполнения указаний в комментариях), - это скопировать и вставить любое решение из stackoverflow.com/questions/1593051/…, которое вы хотите.git/hooks/prepare-commit-msg.sample
содержит три примера. Один для комментирования раздела конфликтов, добавленияgit diff --name-status -r
в него вывода и добавления строк Signed-off-by ... Без добавления имени ветки в сообщение фиксации. Так что я был вынужден написать свой собственный крючок.you will have to manually enable such a hook on each repository you wish to use it
что вы должны предоставить ФАЙЛУ права на выполнение? Если да, могу ли я отредактировать ответ, включив это (или вы, пожалуйста)?Вот мой
commit-msg
сценарий в качестве примера:Создает следующее сообщение фиксации:
Я использую номер проблемы, поскольку
branch_name
описание проблемы помещается в командуbranch_description
usinggit branch --edit-description [branch_name]
.Подробнее об описании веток вы можете найти в этом разделе вопросов и ответов .
Пример кода хранится в следующем Gist .
источник
echo $NAME: "$(cat $1)" > $1
. Это работает, потому что причина потери$(cat "$1")
новых строк заключается в том, что echo обрабатывает каждую строку как новый аргумент и повторяет каждую с пробелом между ними. Заключив его в$(cat "$1")
двойные кавычки, echo обрабатывает вывод cat как единственный аргумент. Также я не думаю, что это нужно цитировать,$1
так как его значение.git/COMMIT_EDITMSG
Немного более простой скрипт, который добавляет имя ветки к сообщению о фиксации перед его редактированием. Так что, если вы хотите изменить или удалить его, вы можете.
Создайте этот файл .git / hooks / prepare-commit-msg :
источник
sed: 1: ".git/COMMIT_EDITMSG": invalid command code .
при использовании этого.sed -i '.bak' "1s/^/$branchName : \n/" $1
@
в качествеsed
разделителя вместо,/
поскольку косая черта с большей вероятностью будет отображаться в имени ветки или сообщении фиксации, что приведет к ошибкеsed
.Вы можете сделать это с помощью комбинации обработчиков prepare-commit-msg и pre-commit.
.git / крючки / подготовка-коммит-сообщение
.git / крючки / предварительная фиксация
Установить разрешения
источник
--amend
например, используете. Вместо использованияecho
вы должны использоватьsed
вместо этого. Вот он в одном лайнере:sed -i "1s@^@$(git branch | grep '^\*' | cut -b3-) @" $1
добавьте приведенный ниже код в файл prepare-commit-msg.
Он добавит имя ветки в сообщение фиксации, кроме фиксации слияния. По умолчанию слияние-фиксация содержит информацию о ветке, поэтому дополнительное имя ветки не требуется и делает сообщение некрасивым.
источник
Вдохновленный ответом Тима, который основан на верхнем ответе, оказывается, что ловушка prepare-commit-msg принимает в качестве аргумента, какой тип фиксации происходит . Как видно по умолчанию, prepare-commit-msg, если $ 2 - это 'merge', то это фиксация слияния. Таким образом, переключатель регистра можно изменить, включив в него функцию Тима addBranchName ().
Я включил свои собственные предпочтения относительно того, как добавить имя ветки и все раскомментированные части
prepare-commit-msg.sample
хука по умолчанию .источник
Если вы хотите сделать его глобальным (для всех проектов):
Создайте
git-msg
файл с содержимым ответа Шитикова и поместите его в какую-нибудь папку:Теперь включите хуки:
и
git init
снова в каждом проекте вы хотите его использовать.источник
У меня были проблемы с тем, чтобы эти решения работали на MacOS из-за того, что он использует BSD
sed
вместо GNUsed
. Однако мне удалось создать простой скрипт, который выполняет свою работу. Все еще использую.git/hooks/pre-commit
:Это предполагает стандарт именования веток, подобный
functional-desc_JIRA-NUMBER
. Если имя вашего филиала - это только номер вашего билета Jira, вы можете просто избавиться от всего, от pipe до f2. Также требуется, чтобы.gitmessage
в вашем домашнем каталоге был файл с именем .источник
Если вы хотите, чтобы билет JIRA был добавлен в сообщение фиксации, используйте сценарий ниже.
Сообщение
PROJECT-2313: Add awesome feature
о фиксации примерно такое: Это требует, чтобы имя вашей ветки начиналось с тикета jira.Это комбинация этих решений:
Он модифицирован для OS X,
sed -i '.bak'
а также работает с SourceTree.https://gist.github.com/georgescumihai/c368e199a9455807b9fbd66f44160095
источник