git commit -am "Подтвердить сообщение" не работает должным образом с бродячей машиной - PullRequest
0 голосов
/ 18 октября 2018

Я использую Git Bash в Windows 7. Для своего проекта я установил VirtualBox и Vagrant в Windows.В моем домашнем каталоге есть несколько папок проекта, которые синхронизируются с бродячей машиной на основе nfs.Поэтому Vagrant будет поддерживать синхронность файлов.

Коробка представляет собой веб-сервер на основе debian / contrib-jessie64 с некоторыми конфигурациями, такими как Git, для нескольких пакетов, устанавливаемых через Composer.Git предназначен для целей BitBucket только потому, что некоторым пакетам требуется разрешение ssh.Но сам Git никогда не используется мной в коробке, потому что он очень медленный.Кроме того, Git требуется для прослушивания нескольких хуков.На веб-сервере установлены PHP и Composer, а на моем хост-компьютере (Windows) - нет.Причина, по которой я не установил все это в Windows, заключается в том, что все версии остаются одинаковыми как на хост-компьютере, так и на гостевой.Я хочу, чтобы сервер делал для меня все php, и это нормально.

Итак, работа с Git в Windows требует, чтобы git-хуки были настроены как в Windows, так и для коробки.Все хуки, которые слушают изменения в Windows, выполняют соответствующие хуки в окне vagrant.Разумеется, все аргументы передаются по конвейеру.

Это мой файл предварительной фиксации в Windows

#!/usr/bin/env bash
coreDirectory="$HOME/projects/foo"

arguments=""

for arg in "$@"
do
    arguments="$arguments $arg"
done

cd $coreDirectory && vagrant ssh -c "cd /home/projects/foo && 
./.git/hooks/pre-commit $arguments"

Это прекрасно работает.Файл предварительной фиксации в окне выполняется и запускает специальный Executor, который вызывает файл ./vendor/bin/phpcs для анализа кода.

Я хочу запускать правила анализа кода только для промежуточных файлов,поэтому все измененные или неотслеживаемые файлы, которые были добавлены в область сцены, должны быть проанализированы.Это тоже отлично работает.Исполнитель подготавливает все файлы с помощью следующей команды:

git -C /home/projects/foo diff --name-only --diff-filter=AM --cached

В Windows добавление нужных файлов в промежуточную область с помощью git add --all и их фиксация работает должным образом и ловушка предварительной фиксациизапускает ловушку предварительной фиксации в поле, которое запускает CodeSniffer.

Но использование git commit -am "Foo bar" не работает должным образом с приведенной выше командой.Хук реагирует, но команда Executor внутри машины, которая пытается получить файлы --cached, возвращает пустой набор.

Я предполагаю, что либо окно vagrant недостаточно быстрое, чтобы переместить измененные файлы в промежуточную область после того, как я использовал команду git commit -am в Windows или команду git commit -am даже не перемещает файлы в промежуточную область.

У вас есть идеи?

1 Ответ

0 голосов
/ 18 октября 2018

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

Когда вы используете ssh для запуска команд на другом компьютере (даже если это ВМ, это еще один компьютер для этой цели)этот другой компьютер не получает настройки GIT_INDEX_FILE, поэтому он использует обычный ежедневный индекс. Этот индекс не содержит никаких изменений, поэтому наблюдаемое вами поведение является правильным: фактически ничто не является подготовленным.

Обратите внимание, что содержимое файла индексаразличаются в Windows и Linux (Git хранит почти необработанные данные системных вызовов stat), поэтому, как правило, неразумно пытаться совместно использовать файлы индекса между хостами.На самом деле, общие папки Virtualbox имеют ряд ... функций?ошибки?осложняющие?как бы вы их ни называли, вещи , которые плохо работают в среде Git.Я считаю гораздо более надежным рассматривать каждую виртуальную машину как действительно отдельный компьютер, используя функцию общих папок как можно меньше и, в частности, никогда не использовать ее для хранения текущей работы с Git.

...