Как перефразировать любое сообщение коммита, учитывая следующий формат сообщения? - PullRequest
0 голосов
/ 10 октября 2019

Мне нужно изменить сообщение коммита, учитывая идентификатор коммита, без изменения какой-либо другой информации коммита. Однако сообщение о коммите должно принимать разрывы строк и т. Д., Аналогично тому, как это делается с помощью команды git commit.

Например, рассмотрим следующий коммит

commit <id>
Author: <user-name> <user-email.com>
Date:   ...

    Hello World

Я хочу перефразироватьсообщение коммита к этому

    Hello World

    Text after line break1
    More text

Обычным методом будет интерактивная перебазировка с последующим редактированием коммита с помощью git commit --amend или выполнением операции переформулировки над этим коммитом. Тем не менее, это изменит информацию о коммите, такую ​​как электронная почта коммиттера, время и т. Д.

(проверьте раздел обновления на перебазирование)

Фильтр-ветвь в git позволит переписатьфиксация путем изменения только сообщения фиксации и идентификаторов, как показано в этом ответе .

Но как мне перефразировать фиксацию с указанным выше форматом сообщения фиксации с использованием filter-branch?

Обновление:

Вот пример интерактивного ребазинга.

  • Создание тестового репозитория с 2 коммитами
    test@ubuntu:~/temp_git$ git init
    Initialized empty Git repository in /home/test/temp_git/.git/
    test@ubuntu:~/temp_git$ touch file1
    test@ubuntu:~/temp_git$ git add .
    test@ubuntu:~/temp_git$ git -c "user.name=A" -c "user.email=a@xyz.com" commit -am "Add File1" --author="B <b@xyz.com>"
    [master (root-commit) f122a34] Add File1
     Author: B <b@xyz.com>
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 file1
    test@ubuntu:~/temp_git$ touch file2
    test@ubuntu:~/temp_git$ git add .
    test@ubuntu:~/temp_git$ git -c "user.name=B" -c "user.email=b@xyz.com" commit -am "Add File2" --author="B <b@xyz.com>"
    [master 3b023cf] Add File2
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 file2
    
  • Коммиты, созданные выше, имеют разных авторов и коммиттеров. Полный журнал выглядит следующим образом:

    test@ubuntu:~/temp_git$ git log --format="fuller"
    commit 3b023cf256ae3498fbaf740329d94842143a5e4a (HEAD -> master)
    Author:     B <b@xyz.com>
    AuthorDate: Tue Oct 15 08:28:07 2019 +0530
    Commit:     B <b@xyz.com>
    CommitDate: Tue Oct 15 08:28:07 2019 +0530
    
        Add File2
    
    commit f122a341e31691f3170207c9a452ff18846fe120
    Author:     B <b@xyz.com>
    AuthorDate: Tue Oct 15 08:27:22 2019 +0530
    Commit:     A <a@xyz.com>
    CommitDate: Tue Oct 15 08:27:22 2019 +0530
    
        Add File1
    
  • Выполнение интерактивной перебазировки в качестве пользователя A и перезапись корневого коммита

    test@ubuntu:~/temp_git$ git -c "user.name=A" -c "user.email=a@xyz.com" rebase -i --root
    [detached HEAD 228b423] Add File1 (test)
     Author: B <b@xyz.com>
     Date: Tue Oct 15 08:27:22 2019 +0530
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 file1
    Successfully rebased and updated refs/heads/master.
    
  • Обновленный журналс изменениями в информации о коммитере

    test@ubuntu:~/temp_git$ git log --format="fuller"
    commit 0d5e6a5fed5b22fc5f8e310c6e98b1e6b8a821b8 (HEAD -> master)
    Author:     B <b@xyz.com>
    AuthorDate: Tue Oct 15 08:28:07 2019 +0530
    Commit:     A <a@xyz.com>
    CommitDate: Tue Oct 15 08:31:41 2019 +0530
    
        Add File2
    
    commit 228b423e3e511c5954823e42df51a6f6acae91cf
    Author:     B <b@xyz.com>
    AuthorDate: Tue Oct 15 08:27:22 2019 +0530
    Commit:     A <a@xyz.com>
    CommitDate: Tue Oct 15 08:31:28 2019 +0530
    
        Add File1 (test)
    

Ответы [ 3 ]

2 голосов
/ 16 октября 2019

Вот мои рекомендации:

  1. (Предпочитается) Не делайте этого. Не беспокойтесь о старых сообщениях о коммите и просто будьте лучше в новых.

  2. filter-branch способ, который вы показали в своем ответе.

  3. Олицетворение (это все равно повлияет на временные метки коммита):

    1. Измените свою конфигурацию git, указав имя и адрес электронной почты оригинального автора коммита.
    2. git commit --amend или git rebase
0 голосов
/ 14 октября 2019

См. эту ссылку .

Вы можете сделать интерактивный перебаз с использованием git rebase -i HEAD~N, который покажет «N» фиксаций. Затем вы можете перейти к строке фиксации, которую хотите изменить, и переименовать pick в reword.

. После этого вы откорректируете сообщение фиксации в следующем редакторе.

[ПРИМЕЧАНИЕ ]

Не рекомендуется изменять / перебазировать выдвинутые коммиты, потому что вам нужно force push, а другие люди должны объединить / повторно клонировать репозиторий.

0 голосов
/ 10 октября 2019

Примечание: Приведенный ниже подход действительно решил мою проблему, однако я все еще ищу более простой метод.

В ответ здесь следующий сценарий можно использовать для перефразирования фиксации с использованием ветви фильтра:

#! /bin/bash
REV=$1
MESSAGE=$2
FILTER="test $(echo '$GIT_COMMIT') = $(git rev-parse $REV) && echo $MESSAGE || cat"
git filter-branch --msg-filter "$FILTER" -- --all

usage: ./script_name.sh <commit-id> "commit message"

Однако, чтобы добавить разрывы строк к новому сообщению фиксации, мне пришлось изменить коммитсообщение для этого: "$(echo -e 'summary_line\n\nmessage\nmore_message')" в ответ здесь . Приведенная выше команда добавляет два переноса строки после summary_line в соответствии с общим соглашением для commitits .

Кроме того, сценарий необходимо было изменить из-за символов escape-последовательности, как указано вкомментарии здесь :

$MESSAGE в этой строке $(git rev-parse $REV) && echo $MESSAGE изменяется на \"$MESSAGE\"

Итак, последняя команда, если имя сценария было reword-commit.sh, (для запуска внутри репозитория git)

./reword-commit.sh <commit-id> "$(echo -e 'Hello World\n\nText after line break1\nMore Text')"
...