Как зафиксировать файлы, измененные хуком pre-commit в Git


4

Я борюсь за пару часов, чтобы сделать метаданные git store (permissions / flags / etc) из файлов, используя metastore, и я использую hooks/pre-commitдля этого.

Сценарий вызывается правильно, и файл «метаданные» изменяется, но не добавляется в коммит.

Я пытался позвонить:

git add ./metadata 

а также

git add -u ./metadata

из сценария предварительной фиксации, но эффекта нет. Файл заканчивается незафиксированным и помечается как измененный или помеченный, НО не переданный, никогда.

Есть ли способ сделать эту работу? По сути, я хочу, чтобы он обновлял и фиксировал файл «метаданные» при каждом коммите (желательно, как тот же коммит, чтобы я мог восстановить все разрешения после проверки)

Спасибо!

PS Если вам интересно, зачем мне это нужно, ответ - я храню файлы ОС для встроенного устройства, для которого нужны флаги permisions / suid и т. Д.


Это должно работать, может быть, вы делаете что-то не так. Хук pre-commit выполняется автоматически, когда вы делаете «git commit». У него должен быть установлен исполняемый бит. Поэтому попробуйте добавить некоторые файлы в постановку вручную, а затем выполните «git commit». После этого выполните «git show», чтобы увидеть, какие изменения были внесены в этот коммит, и посмотреть, были ли зафиксированы метаданные.
Аркадиуш Драбчик

Ответы:


1

Вы можете сделать что-то вроде этого:

#!/bin/sh
#

perl -i -pe 's/var app_version = "\d+\.\d+\.\K(\d+)/ $1+1 /e' ./version.js

git add ./version.js

Что он делает: изменяет строку var app_version = "0.1.1"; к var app_version = "0.1.2"; и добавляет файл обратно в процесс git commit. Когда вы фиксируете последние изменения будут включены.


2
неправильный вопрос?
димовнике

1
Проблема здесь в том, что вы будете фиксировать все изменения в этом конкретном файле. Не только ранее поставленные изменения. Может работать для файлов, которые содержат только версию, хотя.
Мартин Герхарди

0

Я нашел решение. Проблема в том, что при изменении из файла ловушки pre-commit единственный измененный файл - фиксация не происходит. Во время тестирования я вносил изменения только в файл «метаданных», и поэтому он не работал для меня.

Как только я изменю некоторые другие файлы в репозитории, добавьте новые / добавьте новые файлы - файл метаданных будет принят!

Итог: чтобы зафиксировать измененные файлы из ловушки pre-commit, git нужны некоторые другие поэтапные изменения, иначе фиксация не произойдет (вероятно, git ошибочно обнаружит, что нечего коммитить).

Это кажется немного неожиданным поведением для меня. Я проверял это в git 1.8 и git 2.0, поведение такое же.


У меня та же проблема, но изменение других промежуточных файлов не решает проблему. Git не
воспринимает

Удостоверьтесь, что вы делаете git add для canges, сделанного скриптом предварительной фиксации (в конце скрипта).
димовнике

Я не могу этого сделать. Я получаю сообщение index.lockоб ошибке, так git-commitкак вызывает pre-commit. Работает ли это для вас?
frhd

0

Чтобы изменить файл в pre-commitхуке таким образом, чтобы он не мешал неустановленным изменениям (т. Е. git-add -pДружественным), вам необходимо отредактировать версию файла в индексе.

Вот пример pre-commitловушки, которая обновляет номер версии в виде метки времени в заголовке файла :

#!/bin/bash
set -eEuo pipefail

date=$(date +%Y%m%d%H%M)

# Enumerate *.el files that have been edited for this commit
git diff-index --name-only --cached -z HEAD |
    grep -z '\.el$' |
    while read -r -d '' fn
    do
        # Patch index
        blob_sha1=$(git show :"$fn" |
                        sed "s/^;; Version:  .*/;; Version:  $date/" |
                        git hash-object -w --stdin)
        printf '100644 blob %s\t%s\0' "$blob_sha1" "$fn" |
            git update-index -z --index-info

        # Patch working tree to match index
        sed -i "s/^;; Version:  .*/;; Version:  $date/" "$fn"
    done
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.