Автоматически добавлять сообщение о фиксации к файлу, который фиксируется в Git

Моя цель состоит в том, чтобы вести журнал всей истории / сообщений о фиксации в конце каждого файла в моем хранилище. Я использовал ловушку commit-msg, чтобы получить сообщение о коммите, подготовить его и добавить в файл.

Тем не менее, я заметил, что, поскольку файл изменяется после подготовки, состояние git по-прежнему отображается как измененное. Как правильно это сделать?

2 ответа

Хотя я согласен с комментариями Оли Чарльзуорта, что вы не должны этого делать, на самом деле это возможно. Вот простой хук post-commit, который переписывает коммит, добавляя сообщение коммита в файл "changelog".

if ! test ${GIT_BYPASS_POST_COMMIT+set}
then
    export GIT_BYPASS_POST_COMMIT=1

    git show --format=%B -s >>changelog
    git add changelog
    git commit --amend -C HEAD
fi

Если вы попробуете это, я ожидаю, что вы быстро обнаружите, что это не очень хорошо при обычном использовании git. Простейшим примером является то, что если вы измените коммит, вы будете вносить изменения в коммит, который уже изменяется changelogТаким образом, ловушка в конечном итоге дублирует сообщение фиксации.

Вам решать, хотите ли вы попытаться заставить это сработать, или просто отказываетесь от этого, но я рекомендую последнее.

Я адаптировал хук post-commit от @hvd и смог изменить код, чтобы автоматически добавлять детали сообщения коммита в проверенное местоположение файла.

#!/bin/sh
path="D:/temp.txt"
git diff HEAD~1 --name-only > ${path}
if ! test ${GIT_BYPASS_POST_COMMIT+set}
then
    export GIT_BYPASS_POST_COMMIT=1
    for line in `cat $path`; do
        if [[ ! $line =~ version.txt ]];then
            file_path=`dirname $line`
            git show --format=%B -s | cut -d '#' -f2 > ${file_path}/version.txt
            echo " - " >> ${file_path}/version.txt
            echo $line >> ${file_path}/version.txt
            git add ${file_path}/version.txt
        fi  
    done    
    git commit --amend -C HEAD
fi

Первоначально он захватит все файлы, измененные во время фиксации, и сохранит в файл. Теперь это будет читать все файлы в списке файлов, за исключением файла version.txt, и добавит version.txt, который содержит *"commit message - file name"* И он снова передаст последний коммит.

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

Другие вопросы по тегам