Как добавить файл в индекс в проводке git pre-commit - программирование
Подтвердить что ты не робот

Как добавить файл в индекс в проводке git pre-commit

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

Я написал script, который работает на pre-commit и использует вывод git status --porcelain для компиляции любого LESS файла в моем проекте, который изменился. Эта часть работает нормально. Но я хочу, чтобы .css файлы включались в текущую фиксацию. Поэтому, помимо запуска компилятора, мой script работает git add <filename>. И здесь, где все становится сложно.

Файл добавляется в индекс, но он не является индексом текущей фиксации. Поэтому, если я изменяю style.less и запускаю git commit -a (или вручную git add style.less), компилятор должен сгенерировать style.css и style.min.css и добавить их в текущую фиксацию. Но поведение, которое я заметил, совершает только style.less, несмотря на то, что два файла .css добавляются в индекс для следующего коммита.

Итак, мой вопрос: есть ли способ добавить файлы к фиксации в привязке pre-commit, чтобы они вступили в силу для этой фиксации? Обратите внимание, что до того, как выполняется предварительный захват, эти два файла .css не изменяются, поэтому я не могу просто добавить их до этого. Я также знаю, что могу выйти из крючка с ненулевым статусом, поэтому фиксация отменяется, но файлы добавляются, но я надеюсь избежать этого. Любые лучшие идеи?

4b9b3361

Ответ 1

Почему вы хотите сделать это в первую очередь? Вы пытаетесь возглавить, чтобы включить сгенерированные файлы в элемент управления версиями, что в любом случае является не очень хорошим идеей. Если вам нужно, чтобы style.min.css находился там в кассе, почему вы не можете его создать после проверки на этапе сборки?

Ответ 2

Я не могу воспроизвести вашу проблему. Моя первоначальная догадка заключалась в том, что переменная окружения GIT_INDEX_FILE была отключена вашим тэгом pre-commit. Однако, когда я попытался отключить GIT_INDEX_FILE от pre-commit, у меня возникла другая проблема (Git жаловался, что .git/index заблокирован).

Вот пример script, показывающий, что Git функционирует так, как вы ожидаете, и что что-то еще должно быть неправильным. Этот script инициализирует новый тестовый репозиторий, создает крюк pre-commit, который эмулирует то, что делает ваш крючок, и совершает несколько тестовых транзакций:

#!/bin/sh

# initialize the test repository
rm -rf testrepo
git init testrepo
cd testrepo

# create the pre-commit hook
cat <<\EOF >.git/hooks/pre-commit
#!/bin/sh
git status --porcelain | while IFS= read -r line; do
    # todo: handle renames and deletions of a *.less file
    f=${line#???}
    case ${f} in
        *.less)
            fb=${f%.less}
            echo bar >>"${fb}".css
            echo baz >>"${fb}".min.css
            git add "${fb}".css "${fb}".min.css
            ;;
    esac
done
EOF
chmod +x .git/hooks/pre-commit

# create foo.less, commit it
echo foo >foo.less
git add foo.less
git commit -m "add foo.less"

# modify foo.less, commit it
echo foo2 >>foo.less
git commit -a -m "modify foo.less"

Если вы запустите git log -p в тестовом репозитории и посмотрите на полученные коммиты, вы увидите, что foo.css и foo.min.css были изменены, когда был изменен foo.less.

Вот почему я думал, что ваша проблема вызвана изменением/отключением переменной среды GIT_INDEX_FILE:

Когда выполняется git commit -a, Git создает временный индексный файл и использует это вместо стандартного .git/index для создания фиксации. Для того, чтобы операции типа git add выполнялись с помощью pre-commit hook, Git устанавливает переменную среды GIT_INDEX_FILE имя временного индекса, созданного до запуска pre-commit. Если ваш крючок отключает GIT_INDEX_FILE или устанавливает его на .git/index, то все операции Git из вашего крючка будут пытаться изменить исходный индекс, а не временный индекс, который используется для генерации фиксации.

Однако временный индексный файл также действует как блокировка исходного файла индекса. Если хук пытается изменить исходный индекс, а временный индекс существует, то Git прервется с ошибкой.

Ответ 3

Мне кажется, что атрибут git "clean" должен быть script, который обновляет сгенерированные файлы. Обычно этот крючок может запустить script, чтобы убрать ваш исходный код, но я думаю, что он может быть использован для "очистки" вашего сгенерированного вывода. Этот атрибут запускается, когда вы делаете "git add", и вы можете иметь script сделать еще один "git add" в сгенерированном файле.

Ответ 4

Вы можете воспользоваться исправлением последнего коммита. Просто идея.