使用launchd在OS X上启动git-daemon

时间:2011-03-22 08:13:47

标签: git macos launchd git-daemon

我正在尝试使用我的OS X桌面设置内部git服务器(主要作为测试用例)。当涉及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

2 个答案:

答案 0 :(得分:6)

问题是 git-daemon 在从 launchd继承的PATH中的任何目录中找不到 git 可执行文件处理。它从shell启动时有效,因为从shell继承的PATH包含相应的目录。

通常,Git命令是通过主 git 命令调用的(例如git commit,而不是(不再)git-commit)。除此之外,主 git 命令将内置的“exec路径”添加到“子命令”将继承的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是普通shell会话中的which git个报告。

答案 1 :(得分:0)

你没有告诉它跑。尝试取出OnDemand并添加此内容:

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

或者,您可以使用inetdCompatibility(另请参阅:Sockets)和git-daemon的{​​{1}}标志,以便仅在连接时启动该过程。这对你来说可能是一个更好的配置,但也许还有一些工作要做。

launchd.plist(5)手册页包含所有详细信息。