4

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
4

2 に答える 2

6

問題は、git-daemonがlaunchdプロセスから継承した PATH 内のどのディレクトリにもgit実行可能ファイルを見つけられないことです。シェルから継承された PATH には適切なディレクトリが含まれているため、シェルから起動すると機能します。

通常、Git コマンドはメインのgitコマンドから呼び出されます (例: git commitnot (anymore) 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>

where/path/to/gitwhich git、通常のシェル セッションで報告されるものです。

于 2011-03-23T06:19:33.550 に答える
0

あなたはそれを実行するように言っていません。を取り出してOnDemandこれを追加してみてください:

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

または、inetdCompatibility(参照: Sockets) とgit-daemon--inetdフラグを使用して、接続時にのみプロセスを開始することもできます。おそらくもう少し作業が必要ですが、それはあなたにとってより良い構成になるでしょう。

launchd.plist(5)のman ページに詳細がすべて記載されています。

于 2011-03-22T16:49:16.317 に答える