GIT-DAEMON(1) Git Manual GIT-DAEMON(1)

git-daemon - یک کارساز بسیار ساده برای مخازن گیت

git daemon [--verbose] [--syslog] [--export-all]
           [--timeout=<n>] [--init-timeout=<n>] [--max-connections=<n>]
           [--strict-paths] [--base-path=<path>] [--base-path-relaxed]
           [--user-path | --user-path=<path>]
           [--interpolated-path=<pathtemplate>]
           [--reuseaddr] [--detach] [--pid-file=<file>]
           [--enable=<service>] [--disable=<service>]
           [--allow-override=<service>] [--forbid-override=<service>]
           [--access-hook=<path>] [--[no-]informative-errors]
           [--inetd |
             [--listen=<host-or-ipaddr>] [--port=<n>]
             [--user=<user> [--group=<group>]]]
           [--log-destination=(stderr|syslog|none)]
           [<directory>...]

یک دیمون (کارساز پس‌زمینه) فوق‌العاده ساده TCP برای گیت که به طور معمول روی درگاه «DEFAULT_GIT_PORT» یعنی ۹۴۱۸ گوش فرا می‌دهد. این برنامه منتظر برقراری اتصال برای درخواست یک سرویس می‌ماند، و در صورت فعال بودن آن سرویس، به آن پاسخ می‌دهد.

این برنامه بررسی می‌کند که دایرکتوری دارای فایل ویژه "git-daemon-export-ok" باشد، و از صادر کردن هر دایرکتوری گیت که صریحاً به این روش برای صدور علامت‌گذاری نشده باشد خودداری می‌کند (مگر اینکه پارامتر --export-all مشخص شده باشد). اگر مسیرهایی از دایرکتوری‌ها را به عنوان آرگومان‌های git daemon ارسال کنید، خدمات محدود به مخازن درون همان دایرکتوری‌ها خواهد شد.

به طور پیش‌فرض، فقط سرویس upload-pack فعال است که به کلاینت‌های git fetch-pack و git ls-remote (که از سوی git fetch، git pull و git clone فراخوانی می‌شوند) سرویس‌دهی می‌کند.

این حالت برای به‌روزرسانی‌های فقط‌خواندنی، یعنی دریافت (pull) از مخازن گیت، ایده‌آل است.

همچنین سرویس upload-archive برای سرویس‌دهی به git archive وجود دارد.

--strict-paths

تطبیق دقیق مسیرها (یعنی عدم پذیرش "/foo/repo" وقتی مسیر واقعی "/foo/repo.git" یا "/foo/repo/.git" است) و عدم استفاده از مسیرهای نسبی کاربر. git daemon در صورت فعال بودن این گزینه و عدم ارائه آرگومان‌های دایرکتوری، از شروع به کار خودداری می‌کند.

--base-path=<path>

نگاشت مجدد تمام درخواست‌های مسیر به صورت نسبی نسبت به مسیر داده‌شده. این گزینه نوعی «ریشه گیت» است - اگر git daemon را با --base-path=/srv/git روی example.com اجرا کنید، اگر بعداً بخواهید از git://example.com/hello.git دریافت کنید، git daemon مسیر را به عنوان /srv/git/hello.git تفسیر خواهد کرد.

--base-path-relaxed

اگر --base-path فعال باشد و جستجوی مخزن ناموفق شود، با این گزینه git daemon تلاش خواهد کرد تا بدون افزودن پیشوند مسیر پایه جستجو را انجام دهد. این برای تغییر تدریجی به استفاده از --base-path در عین مجاز دانستن مسیرهای قدیمی مفید است.

--interpolated-path=<pathtemplate>

برای پشتیبانی از میزبانی مجازی، می‌توان از یک الگوی مسیر درون‌یابی‌شده برای ساخت پویای مسیرهای جایگزین استفاده کرد. این الگو از موارد زیر پشتیبانی می‌کند: %H برای نام میزبان هدف ارائه‌شده توسط کلاینت که به حروف کوچک تبدیل شده است، %CH برای نام میزبان متعارف (canonical)، %IP برای نشانی IP کارساز، %P برای شماره درگاه، و %D برای مسیر مطلق مخزن تعیین‌شده. پس از درون‌یابی، مسیر در برابر فهرست دایرکتوری‌ها اعتبارسنجی می‌شود.

--export-all

اجازه دریافت از تمام دایرکتوری‌هایی که شبیه مخازن گیت هستند (دارای زیردایرکتوری‌های objects و refs هستند)، حتی اگر فایل git-daemon-export-ok را نداشته باشند.

--inetd

اجرای کارساز به عنوان یک سرویس inetd. متضمن --syslog است (ممکن است با --log-destination= لغو شود). ناسازگار با گزینه‌های --detach، --port، --listen، --user و --group.

--listen=<host-or-ipaddr>

گوش دادن روی یک آدرس IP یا نام میزبان مشخص. آدرس‌های IP در صورت پشتیبانی می‌توانند آدرس IPv4 یا IPv6 باشند. اگر IPv6 پشتیبانی نشود، در نتیجه --listen=<hostname> نیز پشتیبانی نمی‌شود و به --listen باید یک آدرس IPv4 داده شود. این گزینه می‌تواند بیش از یک بار مشخص شود. ناسازگار با گزینه --inetd.

--port=<n>

گوش دادن روی یک درگاه جایگزین. ناسازگار با گزینه --inetd.

--init-timeout=<n>

مهلت زمانی (بر حسب ثانیه) بین لحظه برقراری اتصال و دریافت درخواست کلاینت (معمولاً مقداری نسبتاً کم است، زیرا اصولاً باید بلافاصله انجام شود).

--timeout=<n>

مهلت زمانی (بر حسب ثانیه) برای زیردرخواست‌های خاص کلاینت. این شامل مدت زمانی است که کارساز برای پردازش زیردرخواست صرف می‌کند و همچنین زمانی که در انتظار درخواست بعدی کلاینت سپری می‌شود.

--max-connections=<n>

حداکثر تعداد کلاینت‌های همزمان؛ پیش‌فرض ۳۲ است. برای نامحدود بودن، آن را صفر قرار دهید.

--syslog

کوتاه‌شده --log-destination=syslog.

--log-destination=<destination>

ارسال پیام‌های گزارش به مقصد مشخص‌شده. توجه داشته باشید که این گزینه متضمن --verbose نیست، بنابراین به طور پیش‌فرض فقط شرایط خطا ثبت می‌شوند. مقدار <destination> باید یکی از موارد زیر باشد:

stderr

نوشتن در خروجی خطای استاندارد. توجه داشته باشید که اگر --detach مشخص شده باشد، فرایند از خطای استاندارد واقعی جدا می‌شود و این مقصد عملاً معادل none خواهد بود.

syslog

نوشتن در syslog با استفاده از شناسه git-daemon.

none

غیرفعال کردن تمام وقایع‌نگاری‌ها.

مقصد پیش‌فرض در صورتی که --inetd یا --detach مشخص شده باشد syslog است، در غیر این صورت stderr می‌باشد.

--user-path, --user-path=<path>

اجازه استفاده از نماد ~user در درخواست‌ها. هنگامی که بدون پارامتر مشخص شود، درخواستی برای git://host/~alice/foo به عنوان درخواستی برای دسترسی به مخزن foo در دایرکتوری خانگی کاربر alice در نظر گرفته می‌شود. اگر --user-path=<path> مشخص شود، همان درخواست به عنوان درخواست دسترسی به مخزن <path>/foo در دایرکتوری خانگی کاربر alice در نظر گرفته خواهد شد.

--verbose

ثبت جزئیات مربوط به اتصالات ورودی و فایل‌های درخواست‌شده در وقایع‌نگاری.

--reuseaddr

استفاده از SO_REUSEADDR هنگام اتصال سوکت شنونده (bind). این به کارساز اجازه می‌دهد بدون انتظار برای به پایان رسیدن مهلت زمانی اتصالات قدیمی، مجدداً راه‌اندازی شود.

--detach

جدا شدن از پوسته و اجرا در پس‌زمینه. متضمن --syslog.

--pid-file=<file>

ذخیره شناسه فرایند در <file>. هنگامی که دیمون تحت --inetd اجرا شود، نادیده گرفته می‌شود.

--user=<user>, --group=<group>

تغییر شناسه کاربری (uid) و شناسه گروهی (gid) دیمون قبل از ورود به حلقه سرویس. هنگامی که فقط --user بدون --group داده شود، شناسه گروه اصلی کاربر استفاده می‌شود. مقادیر این گزینه به getpwnam(3) و getgrnam(3) داده می‌شوند و شناسه‌های عددی پشتیبانی نمی‌شوند.

دادن این گزینه‌ها در صورت استفاده با --inetd یک خطا محسوب می‌شود؛ در صورت نیاز، پیش از راه‌اندازی git daemon از امکانات دیمون inet برای دستیابی به همین هدف استفاده کنید.

مانند بسیاری از برنامه‌هایی که شناسه کاربر را تعویض می‌کنند، این دیمون هنگام اجرای برنامه‌های گیت مانند upload-pack و receive-pack متغیرهای محیطی نظیر HOME را بازنشانی نمی‌کند. هنگام استفاده از این گزینه، ممکن است بخواهید پیش از شروع دیمون HOME را طوری تنظیم و export کنید که به دایرکتوری خانگی <user> اشاره کند، و اطمینان حاصل کنید که هر فایل پیکربندی گیت در آن دایرکتوری توسط <user> قابل خواندن باشد.

--enable=<service>, --disable=<service>

فعال/غیرفعال کردن سرویس در سطح کارساز به صورت پیش‌فرض. توجه داشته باشید که یک سرویس غیرفعال‌شده در سطح سرور همچنان می‌تواند برای هر مخزن فعال شود، در صورتی که قابل بازنویسی علامت‌گذاری شده باشد و مخزن با یک آیتم پیکربندی آن سرویس را فعال نماید.

--allow-override=<service>, --forbid-override=<service>

اجازه/ممنوعیت بازنویسی پیش‌فرض سرور با پیکربندی مخصوص هر مخزن. به طور پیش‌فرض، تمام سرویس‌ها ممکن است بازنویسی شوند.

--informative-errors, --no-informative-errors

هنگامی که خطاهای آگاهی‌بخش فعال باشند، git-daemon خطاهای پرجزئیات‌تری را به کلاینت گزارش می‌دهد، و وضعیت‌هایی مانند «no such repository» (چنین مخزنی وجود ندارد) را از «repository not exported» (مخزن صادر نشده است) متمایز می‌کند. این برای کلاینت‌ها راحت‌تر است، اما ممکن است اطلاعاتی را درباره وجود مخازن صادرنشده فاش سازد. هنگامی که خطاهای آگاهی‌بخش فعال نباشند، تمام خطاها پیام «access denied» (دسترسی رد شد) را به کلاینت گزارش می‌دهند. حالت پیش‌فرض --no-informative-errors است.

--access-hook=<path>

هر بار که یک کلاینت متصل می‌شود، ابتدا یک دستور خارجی مشخص‌شده توسط <path> را با نام سرویس (مانند "upload-pack")، مسیر مخزن، نام میزبان (%H)، نام میزبان متعارف (%CH)، نشانی IP (%IP)، و درگاه TCP (%P) به عنوان آرگومان‌های خط فرمان آن اجرا کنید. دستور خارجی می‌تواند با خروج با یک وضعیت غیر صفر از ارائه سرویس خودداری کند (یا با خروج با وضعیت صفر به آن اجازه دهد). همچنین می‌تواند متغیرهای محیطی $REMOTE_ADDR و $REMOTE_PORT را بررسی کند تا هنگام تصمیم‌گیری، اطلاعاتی در مورد درخواست‌کننده به دست آورد.

دستور خارجی می‌تواند به صورت اختیاری یک سطر در خروجی استاندارد خود بنویسد تا هنگام رد سرویس، به عنوان پیام خطا برای درخواست‌کننده ارسال شود.

<directory>

آرگومان‌های باقی‌مانده فهرستی از دایرکتوری‌ها را ارائه می‌دهند. اگر دایرکتوری‌هایی مشخص شده باشند، فرایند git-daemon تنها در صورتی به دایرکتوری درخواستی پاسخ می‌دهد که درون یکی از این دایرکتوری‌ها قرار داشته باشد. اگر --strict-paths مشخص شده باشد، دایرکتوری درخواستی باید دقیقاً با یکی از این دایرکتوری‌ها مطابقت داشته باشد.

این سرویس‌ها می‌توانند با استفاده از گزینه‌های خط فرمان این دستور به صورت سراسری فعال/غیرفعال شوند. اگر کنترل دقیق‌تری مورد نیاز باشد (برای مثال، اجازه اجرای git archive تنها در چند مخزن منتخب که دیمون ارائه می‌دهد)، می‌توان از فایل پیکربندی اختصاصی هر مخزن برای فعال یا غیرفعال کردن آنها استفاده کرد.

upload-pack

این سرویس به کلاینت‌های git fetch-pack و git ls-remote پاسخ می‌دهد. به طور پیش‌فرض فعال است، اما یک مخزن می‌تواند با تنظیم آیتم پیکربندی daemon.uploadpack روی false آن را غیرفعال کند.

upload-archive

این سرویس به git archive --remote پاسخ می‌دهد. به طور پیش‌فرض غیرفعال است، اما یک مخزن می‌تواند با تنظیم آیتم پیکربندی daemon.uploadarch روی true آن را فعال کند.

receive-pack

این سرویس به کلاینت‌های git send-pack پاسخ می‌دهد و اجازه ارسال (push) ناشناس را می‌دهد. به طور پیش‌فرض غیرفعال است، زیرا هیچ احراز هویتی در این پروتکل وجود ندارد (به عبارت دیگر، هر کسی می‌تواند هر چیزی را به مخزن ارسال کند، از جمله حذف مراجع). این صرفاً برای یک محیط شبکه محلی (LAN) بسته که همه کاربران در آن مورد اعتماد هستند در نظر گرفته شده است. این سرویس را می‌توان با تنظیم آیتم پیکربندی daemon.receivepack روی true فعال کرد.

ما موارد زیر را در /etc/services فرض می‌کنیم:

$ grep 9418 /etc/services
git             9418/tcp                # Git Version Control System

git daemon به عنوان کارساز inetd

برای راه‌اندازی git daemon به عنوان یک سرویس inetd که به هر مخزنی درون /pub/foo یا /pub/bar پاسخ می‌دهد، ورودی‌ای مانند زیر را در یک سطر در /etc/inetd قرار دهید:
git stream tcp nowait nobody  /usr/bin/git
        git daemon --inetd --verbose --export-all
        /pub/foo /pub/bar

git daemon به عنوان کارساز inetd برای میزبان‌های مجازی

برای راه‌اندازی git daemon به عنوان یک سرویس inetd که مخازن میزبان‌های مجازی مختلف مانند www.example.com و www.example.org را مدیریت می‌کند، ورودی‌ای مانند زیر را در یک سطر در /etc/inetd قرار دهید:
git stream tcp nowait nobody /usr/bin/git
        git daemon --inetd --verbose --export-all
        --interpolated-path=/pub/%H%D
        /pub/www.example.org/software
        /pub/www.example.com/software
        /software

در این مثال، دایرکتوری سطح ریشه /pub شامل یک زیردایرکتوری برای هر نام میزبان مجازی پشتیبانی‌شده خواهد بود. علاوه بر این، هر دو میزبان مخازن را صرفاً به عنوان git://www.example.com/software/repo.git اعلان می‌کنند. برای کلاینت‌های قبل از ۱.۴.۰، یک پیوند نمادین از /software به مخزن پیش‌فرض مناسب نیز می‌تواند ایجاد شود.

git daemon به عنوان یک دیمون معمولی برای میزبان‌های مجازی

برای راه‌اندازی git daemon به عنوان یک سرویس معمولی غیر inetd که مخازن چندین میزبان مجازی را بر اساس آدرس‌های IP آنها مدیریت می‌کند، دیمون را به این صورت شروع کنید:
git daemon --verbose --export-all
        --interpolated-path=/pub/%IP/%D
        /pub/192.168.1.200/software
        /pub/10.10.220.23/software

در این مثال، دایرکتوری سطح ریشه /pub شامل یک زیردایرکتوری برای هر آدرس IP میزبان مجازی پشتیبانی‌شده خواهد بود. با این حال، با فرض اینکه نام‌های میزبان متناظر با این آدرس‌های IP باشند، مخازن همچنان از طریق نام میزبان نیز قابل دسترسی هستند.

فعال/غیرفعال کردن انتخابی سرویس‌ها به ازای هر مخزن

برای فعال‌سازی git archive --remote و غیرفعال‌سازی git fetch روی یک مخزن، عبارت زیر را در فایل پیکربندی درون مخزن (یعنی فایل config در کنار HEAD، refs و objects) قرار دهید:
[daemon]
        uploadpack = false
        uploadarch = true

دستور git daemon در صورت در دسترس بودن آدرس IP، متغیر REMOTE_ADDR را روی آدرس IP کلاینتی که به آن متصل شده است تنظیم می‌کند. متغیر REMOTE_ADDR در محیط قلاب‌هایی که هنگام اجرای سرویس‌ها فراخوانی می‌شوند در دسترس خواهد بود.

بخشی از مجموعه git(1)

2026-06-29 Git 2.55.0