2017-02-21 3 views
1

Использование Git 2.11.1.windows.1, SourceTree 1.10.20.1.Почему git принимает сообщения фиксации, начиная с символа хеша

Я, хотя по умолчанию git игнорирует строки, начинающиеся с # в сообщении фиксации. Однако, используя SourceTree, я попробовал мультилинию коммит:

Тестирование мультилинии коммит
# Line 2
# Строка 3

Удивительно все 3 строк записываются как сообщение фиксации (видно на git log). Может быть, мерзавец nned быть настроен по умолчанию символа комментария в, поэтому я

git config --global core.commentChar "#" 

Затем отменить фиксацию по git reset --soft HEAD^ и вновь с тем же сообщением 3 линии (с использованием SourceTree, не знаем, как сделать мультилинии совершить Сообщи в командной строке). Строки, начинающиеся с #, все еще принимаются.

Как работает линия комментариев в сообщении git commit?

+0

Из любопытства, зачем вам нужно игнорировать строку в сообщении о совершении? – jbu

+0

@jbu git merge или git rebase генерируют сообщение автоматической фиксации с большим количеством строк, начинающихся с #. Я заметил, что иногда строка, начинающаяся с #, все еще попадает в журнал. Может быть, есть правило, что иногда # игнорируется, а иногда нет. Я хотел бы знать наверняка, чтобы избежать путаницы. – Polymerase

+0

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

ответ

2

# как комментарий не является правилом сообщений Git commit. Вместо этого это правило для записи сообщений фиксации через редактор.

AFAIK это позволяет Git показывать инструкции и другую информацию автору сообщения.

# Please enter the commit message for your changes. Lines starting 
# with '#' will be ignored, and an empty message aborts the commit. 
# On branch master 
# Changes to be committed: 
#  new file: what 
# 

Это сохраняется как .git/COMMIT_EDITMSG. Когда ваш редактор закрывается, Git читает этот файл, удаляет комментарии (и другие специальные вещи) и использует то, что осталось в качестве сообщения фиксации.

Из ГИТ-совершить документы ...

$ GIT_DIR/COMMIT_EDITMSG

Этот файл содержит сообщение фиксации коммита в процессе. Если git фиксирует выходы из-за ошибки перед созданием фиксации, любое сообщение фиксации, предоставленное пользователем (например, в сеансе редактора), будет доступно в этом файле, но будет перезаписано следующим вызовом git commit.

Вы можете, btw, прервать фиксацию, не предоставив без каких-либо строк.

Если вы используете git commit -m, например, нет необходимости в этом, и сообщение, начинающееся с #, в порядке.

$ git ci -m '# message with a comment' 
[master 7c6a630] # message with a comment 
1 file changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 that 
$ git log 
commit 7c6a630a9c84fda585601edef0b18e7a8683dffa (HEAD -> master) 
Author: Michael G. Schwern <[email protected]> 
Date: Wed Feb 22 20:51:36 2017 -0800 

    # message with a comment 
$ cat .git/COMMIT_EDITMSG 
# message with a comment 

git commit has an option to control this behavior, --cleanup. Существуют различные режимы, которые разделяют комментарии, очищают пробелы или ничего не делают. Значение по умолчанию: «То же, что и для полосы, если сообщение должно быть отредактировано. В противном случае пробел.« Это можно контролировать с помощью переменной конфигурации commit.cleanup.


Вы можете, если вы действительно хотите использовать a commit-msg hook, чтобы убедиться, что комментарии всегда удаляются.

+0

@Shwern Это становится яснее. Однако в примере, который вы показали с сообщением 'git commit -m '# с комментарием'. Файл '.git/COMMIT_EDITMSG' содержит строку, начинающуюся с #. Как на этот раз git не игнорирует эту # строку? Я смущен, потому что вы объяснили, что * «Git читает этот файл, удаляет комментарии (и другие специальные вещи) и использует то, что осталось в качестве сообщения фиксации» * – Polymerase

+0

@Polymerase 'git commit', который использует редактор, читаемый с' COMMIT_EDITMSG '. Я не думаю, что 'git commit -m' считывает сообщение из файла, оно уже имеет его из командной строки. Вместо этого он записывается на него, если коммит не выполняется. Во всяком случае, поскольку 'git commit -m' выполняет фиксацию, он знает, что он пришел через' -m' и не нуждается в комментариях. – Schwern

+0

@Полимераза Ах ха! Я нашел то, что вы ищете. 'Commit.cleanup'. См. Изменения в ответе. – Schwern

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