LINUX.ORG.RU

Commit в bare-репозиторий во время hooks/update

 ,


1

1

Добрый день, уважаемые знатоки.

Вот что пишет нам телезритель.

Пытаюсь решить странную проблему: во время hooks/update мне необходимо записать дату в файл и закоммитить эти изменения в ветку, в которую совершается push.

В bare-репозитории сделать git commit не получиться по понятным причинам.

А теперь внимание, вопрос:
Как правильно закоммитить некоторые изменения в ветку, в которую пришел push?

★★★★★

передать этот хук на клиентскую сторону, не? :)
а на сервере просто отвергать push если на клиенте были выполнены какие-лио действия по предотвращению выполнения хука.

aol ★★★★★
()
Последнее исправление: aol (всего исправлений: 1)
Ответ на: комментарий от aol

Возможный вариант, но больше похоже на костыль. К тому же с проверкой на сервере можно очень сильно налажать.

Интересно все же как это сделать именно на сервере.

trex6 ★★★★★
() автор топика

Ммм... Можно врукопашную создать коммит. Только после push, естественно, придётся делать pull, чтобы стянуть этот новый коммит.

Вот где-то так это делается:

#!/bin/sh

# .git/hooks/post-update
#
# Выполняется после того, как был успешно произведён push.
# Аргументы --- список обновлённых веток.
# Код возврата до лампочки.
# Весь вывод форвардится тому, кто выполняет push.

# Путь к файлу с логом коммитов, относительно корня репозитория
log_file="log.log"

# Временный файлик под обновление лога
new_log_file=$(tempfile)

# Проходимся по всем обновлённым веткам
while [ $# -ge 1 ]
do
    ref="$1"                 # Обновлённая ветка
    parent_sha=$(cat "$ref") # Хеш свежезапушенного коммита

    # git checkout $ref

        # Загружаем обновлённую ветку в индекс
        git read-tree "$ref"

    # (обновление лог-файла)

        # Достаём хеш объекта в обновлённой ветке, где лежит старое содержимое лога
        old_log_sha=$(git cat-file -p "$ref"^{tree} | grep "$log_file" | awk '{print $3}')

        # Записываем дату в новый лог (или что там надо)
        echo "Commit date: $(date)" > "$new_log_file"

        # Дописываем к новому логу содержимое старого
        git cat-file -p $old_log_sha >> "$new_log_file"

    # git add $log_file

        # Закидываем обновлённый лог из /tmp в базу объектов под правильным именем
        new_log_sha=$(git hash-object -w --path="$log_file" "$new_log_file")

        # Добавляем в индекс обновлённый лог
        git update-index --add --cacheinfo 100644 $new_log_sha "$log_file"

    # git commit -m "Update commit date log"

        # Сохраняем индекс в новый объект-дерево
        new_tree_sha=$(git write-tree)

        # Сохраняем дерево и сообщение в виде нового коммита
        commit_sha=$(echo "Update commit date log" | git commit-tree $new_tree_sha -p $parent_sha)

        # Перемещаем обновлённую ветку на свежесозданный коммит
        git update-ref "$ref" $commit_sha $parent_sha

    shift
done

echo "Successfuly updated commit log, do not forget to git pull"

# Стандартная нагрузка hooks/post-update
exec git update-server-info

ilammy ★★★
()
Ответ на: комментарий от zunkree

В 2х словах: интеграция с TFS и CodeCollaborator.

Да, кое-где приходится страдать, но это компенсируют зарплатой.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от ilammy

Большое спасибо! Очень похоже на правильный подход, хотя и не самый простой.

Буду пробовать

trex6 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.