Запуск git-daemon в OS X с помощью launchd

Я пытаюсь настроить внутренний сервер git, используя свой рабочий стол OS X (в основном в качестве тестового примера). Все работает, когда задействованы ключи SSH, но сейчас я пытаюсь использовать git-daemon для клонирования только для чтения. Если я запускаю git-daemon в терминале:

sudo -u git git-daemon --basepath=/Users/git/repos/ --export-all

тогда все работает нормально, т.е.

git clone git://localhost/My_Project.git

Но когда я пытаюсь настроить это с помощью launchd, он отклоняет все запросы. Я использую этот файл plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>git</string>
        <key>UserName</key>
        <string>git</string>
        <key>OnDemand</key>
        <false/>
        <key>ProgramArguments</key>
        <array>
                <string>/path/to/git-daemon</string>
                <string>--base-path=/Users/git/repos/</string>
                <string>--export-all</string>
        </array>
</dict>
</plist>

И получить следующую ошибку, если я попытаюсь клонировать My_Project:

Cloning into My_Project...
fatal: The remote end hung up unexpectedly

Разочаровывает то, что я считаю, что раньше это работало, поэтому проблема может быть связана не столько с моим файлом plist или использованием launchd, сколько с любыми сетевыми настройками, которые могли измениться. Мы будем очень признательны за любые советы.

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

Обновление: консоль сообщает о следующей ошибке, если репо существует:

git[431]
error: cannot run upload-pack: No such file or directory

person marshall.ward    schedule 22.03.2011    source источник


Ответы (2)


Проблема в том, что git-daemon не может найти исполняемый файл git ни в одном из каталогов в PATH, унаследованном от процесса launchd. Он работает, когда вы запускаете его из своей оболочки, потому что PATH, унаследованный от оболочки, включает соответствующий каталог.

Обычно команды Git вызываются через основную команду git (например, git commit, а не (больше) git-commit). Среди прочего, основная команда git добавляет встроенный «путь выполнения» к переменной среды PATH, которую наследуют «подкоманды».

Ваша конфигурация launchd напрямую вызывает «внутреннюю» программу — git-daemon — вместо того, чтобы позволить обычной программе верхнего уровня вызвать ее (после расширения PATH она унаследуется).

Используйте следующие ProgramArguments:

        <array>
                <string>/path/to/git</string>
                <string>daemon</string>
                <string>--base-path=/Users/git/repos/</string>
                <string>--export-all</string>
        </array>

где /path/to/git — это то, что which git сообщает в вашем обычном сеансе оболочки.

person Chris Johnsen    schedule 23.03.2011

Вы не говорите ему бежать. Попробуйте убрать OnDemand и добавить это:

<key>KeepAlive</key>
<true/>
<key>RunAtLoad</key>
<true/>

В качестве альтернативы вы можете использовать inetdCompatibility (см. также: Sockets) и флаг --inetd git-daemon, чтобы процесс запускался только при подключении. Это, вероятно, будет лучшей конфигурацией для вас, хотя, возможно, потребуется немного больше работы, чтобы начать работу.

launchd.plist(5 ) справочная страница содержит все подробности.

person Dustin    schedule 22.03.2011
comment
Пока не повезло, замена OnDemand на те, которые вы предлагаете, ничего не изменила. git-daemon появляется, когда я использую любой набор ключей plist, так как я вижу его с ps -A, но оба выдают сообщение об ошибке выше. Работает только запуск git-daemon в командной строке. - person marshall.ward; 23.03.2011