Стартиране на 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