Как зафиксировать файлы, измененные хуком 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.