Git - перехватывать пост-получение не работает на удаленном сервере Windows - PullRequest
2 голосов
/ 23 февраля 2012

Я пытаюсь заставить git post-receive работать в Windows.

Я использую Git 1.7.9 (Msysgit) и имею локальное репо и пустое репо на удаленном сервере. Я могу получить, зафиксировать, отправить и т. Д. Я установил хук после получения, который должен извлекать файлы в рабочую папку (часть процесса развертывания), но, похоже, он не работает.

Вот что я делаю:

  1. Изменить файл, подготовить и зафиксировать его
  2. Push на удаленный сервер - успешно
  3. Ожидайте увидеть эхо - не видите эхо
  4. Проверить рабочую папку на сервере - там нет последних файлов
  5. Войдите на сервер и запустите скрипт подключения вручную - последние файлы извлекаются в рабочую папку.

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

Я проталкиваю HTTP с помощью git dot aspx на сервере, обрабатывающем запрос и выполняющим локальную загрузку через графический интерфейс. После того, как это не удалось, я попробовал Bonobo, и ловушка не работает при нажатии через графический интерфейс или консоль bash.

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

(кстати, я новичок в стиле git).

Приветствие.

Обновление

Я начинаю думать, что это может быть связано с разрешениями - но разрешениями Unix, а не NTFS. Когда @eis упомянул разрешения, я принял NTFS. Но после дальнейших исследований кажется, что Git в Windows все еще проверяет наличие файлов Unix.

Так что я подозреваю, что проблема в том, что файл после получения не является исполняемым, как когда я делаю ls -o, это -rw-r - r-- (644, я полагаю). Если я попытаюсь изменить это через bash и chmod 777 post-receive, тогда сделайте ls -o, разрешения будут такими же.

Странно, что, как только я отредактировал post-receive (с помощью notepad ++), бит выполнения удаляется. (мой тестовый скрипт, заканчивающийся на .bat, сохраняет свои исполняемые биты ...)

Кстати, пользователь, в который я вошел, является владельцем файлов (согласно ls -o), но я не могу установить права доступа.

Становится действительно запутанным сейчас. Я что-то упускаю действительно очевидное?

Обновление 2

Ни chmod 777 post-receive, ни chmod a+x post-receive не работают. Я взял новый чистый файл пост-получения, загрузил его на сервер и проверил разрешения, и он выполнил. Если я переименую файл (чтобы удалить образец) в Windows, то выполнение будет удалено. Если я делаю это в bash с mv, выполнение сохраняется. Но всякий раз, когда я редактирую файл (в Windows или в bash с помощью vi), выполнение удаляется.

Итак, проблема теперь в том, почему он удаляет биты выполнения при редактировании файла?

Надеюсь, это последнее препятствие и причина его неисполнения ...

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Вам нужно будет пропатчить git, чтобы сделать эту работу. Проверки во встроенном / receive-pack.c предназначены для access(path, X_OK). В msysgit это перенаправляет на mingw_access, который отбрасывает бит X_OK, поскольку он просто не поддерживается в Windows.

В windows у нас нет флага, указывающего, что файл является исполняемым. Системы часто делают эмуляцию этого. Например, tcl будет искать любое расширение в переменной среды PATHEXT, чтобы решить, является ли файл исполняемым. Мы не можем сделать это здесь, поскольку имена хуков закодированы без каких-либо расширений.

Вместо этого я предлагаю изменить тест доступа, чтобы просто проверить, существует ли файл, а затем вызвать execv по пути. Версия этого mingw (в compat / mingw.c) ищет файлы сценариев, читает строку shbang и запускает соответствующий интерпретатор (sh, perl и т. Д.). Поэтому изменение builtin/receive-pack.c:run_update_hook должно позволить вам работать. В настоящее время для запуска ловушек используется start_command, и я думаю, что для вас следует вызвать execv.

Короче говоря, измените тест доступа, и он, вероятно, будет работать.

0 голосов
/ 26 мая 2013

При использовании msysgit на сервере и отправке через перехват файлов, общий доступ теперь работает без проблем.Возможно это было исправлено в mysysgit, так как ответ был написан.Я не смотрел на это.

Я также заметил, что оригинальный вопрос гласил git dot aspx и Bonobo, которые используют GitSharp.dll.Это будет означать, что приложение не обрабатывает git.exe, и перехватчики не будут обрабатываться одинаково.

Например, GitSharp.dll, используемый в git dot aspx, имеет свой собственный перехват перехвата после полученияреализация, которая может быть выполнена в C #:

public void Receive(Stream inputStream, Stream outputStream) 
{
    using (var repository = GetRepository()) 
    {
        var pack = new ReceivePack(repository);
        pack.setBiDirectionalPipe(false);

        //setup post receive hook here
        pack.setPostReceiveHook(new PostRecieveHook());

        pack.receive(inputStream, outputStream, outputStream);
     }
}


public class PostRecieveHook : IPostReceiveHook 
{
    public void OnPostReceive(ReceivePack rp, ICollection<ReceiveCommand> commands) 
    {
        //Do PostRecieve Hook Work Here
    }
}

Я надеюсь помочь другим в путанице между библиотеками, которые являются реализациями Git, и приложениями, которые обращаются к реальному git.exe.

...