В случае, если я хочу полностью отредактировать конкретный коммит, я использую следующую команду:

git filter-branch --env-filter \
"if test \$GIT_COMMIT = '5b740c488f0e4251a6e534cab79da8b05de7a195'
then
    export GIT_AUTHOR_NAME='John Doe'
    export GIT_COMMITTER_NAME='John Doe'
    export GIT_AUTHOR_EMAIL='john.doe@gmail.com'
    export GIT_COMMITTER_EMAIL='john.doe@gmail.com'
    export GIT_AUTHOR_DATE='1493100264'
    export GIT_COMMITTER_DATE='1493100264'
fi"

Есть ли способ изменить сообщение о коммите?

Я знаю, что могу смешать --msg-filter с sed, но если несколько коммитов имеют одно и то же сообщение о коммите, это может быть проблемой.

То, что я хотел бы, это способ сказать "Для этого SHA, установите сообщение о коммите как X", подобно тому, как я редактирую автора и дату фиксации

Большое спасибо!

git
2
Boris K 25 Апр 2017 в 09:22

2 ответа

Лучший ответ

Вы уже знаете, как проверить в --env-filter. Все, что вам нужно понять, это

Значение по умолчанию $filter_env пусто, но оно заменяется вашим аргументом --env-filter. Значением по умолчанию $filter_msg является cat; это аналогично заменяется вашим аргументом --msg-filter.

Оба они eval редактируются напрямую, в среде, в которой установлены $GIT_COMMIT, $GIT_AUTHOR_EMAIL и т. Д. Поскольку filter_msg оценивается в правой части конвейера, изменения переменных среды теряются (поэтому вы должны внести любые необходимые изменения в другой фильтр), но вы можете еще осматривать их. Поскольку $filter_env запускается первым, вы должны учитывать, что любые сделанные вами изменения вступают в силу ко времени запуска вашего $filter_msg.

Следовательно :

То, что я хотел бы, это способ сказать «Для этого SHA установите сообщение о коммите как X», подобно тому, как я редактирую автора и дату фиксации.

Переводится на:

--msg-filter 'if test $GIT_COMMIT = 5b740c488f0e4251a6e534cab79da8b05de7a195;
     then cat >/dev/null && cat $HOME/tmp/prepared-msg; else cat; fi'

Или похожие. (cat >/dev/null - это небольшая паранойя, чтобы отказаться от стандартного ввода, чтобы избежать ошибок из-за разорванного канала. Если вы используете sed для редактирования сообщения, не отменяйте стандартный ввод.)


1 Я не уверен, почему код git-filter-branch.sh использует цикл { while ... } для удаления заголовков из фиксации, когда sed -e '1,/^$/d' будет достаточно. ... Ах, я могу вспомнить, почему: некоторые sed требуют, чтобы сообщения заканчивались окончательным переводом строки, возможно. Вот почему

2
torek 25 Апр 2017 в 11:11

Так что, если кто-то ищет рабочую команду, вот что я использую:

git filter-branch --msg-filter \
"if test \$GIT_COMMIT = '5b740c488f0e4251a6e534cab79da8b05de7a195'
then 
    echo 'New commit message!\nOn multiple lines'; else cat
fi"
1
Boris K 26 Апр 2017 в 07:23