GITWEB(1) دستورات عمومی کاربر GITWEB(1)

gitweb - رابط تحت وب گیت (فرانت‌اند تحت وب برای مخازن گیت)

برای شروع کار با gitweb، دستور git-instaweb(1) را درون یک مخزن گیت اجرا کنید. این کار وب‌سرور شما را پیکربندی کرده و راه‌اندازی می‌کند، و مرورگر وبی را باز می‌نماید که به gitweb اشاره دارد.

ابزار Gitweb یک رابط تحت وب برای مخازن گیت فراهم می‌کند. قابلیت‌های آن شامل موارد زیر است:

•مشاهده چندین مخزن گیت با یک ریشه مشترک.
•مرور تمام بازبینی‌های مخزن.
•مشاهده محتویات فایل‌ها در مخزن در هر بازبینی دلخواه.
•مشاهده سیاهه بازبینی شاخه‌ها، تاریخچه فایل‌ها و دایرکتوری‌ها، و دیدن اینکه چه چیزی، در چه زمانی و توسط چه کسی تغییر کرده است.
•مشاهده جزئیات انتساب/حاشیه‌نویسی (blame/annotation) هر فایل (در صورت فعال بودن).
•تولید خوراک‌های RSS و Atom برای کامیت‌ها، برای هر شاخه. این خوراک‌ها در مرورگرهای وب امروزی به صورت خودکار قابل شناسایی هستند.
•مشاهده تمام تغییرات اعمال‌شده در یک بازبینی، و گام برداشتن در بازبینی‌ها یکی پس از دیگری جهت بررسی تاریخچه مخزن.
•یافتن کامیت‌هایی که پیام کامیت آن‌ها با عبارت جستجوی ارائه‌شده مطابقت دارد.

جهت مشاهده کد منبع gitweb که با استفاده از خود gitweb مرور می‌شود، به https://repo.or.cz/w/git.git/tree/HEAD:/gitweb مراجعه کنید.

جنبه‌های مختلف رفتار gitweb را می‌توان از طریق فایل پیکربندی gitweb_config.perl یا /etc/gitweb.conf کنترل کرد. برای جزئیات به gitweb.conf(5) مراجعه کنید.

ابزار Gitweb می‌تواند اطلاعات یک یا چند مخزن گیت را نمایش دهد. تمام این مخازن باید روی فایل‌سیستم محلی قرار داشته باشند و ریشه مخزن مشترکی داشته باشند؛ یعنی همگی زیر یک مخزن والد منفرد قرار گیرند (البته زیربخش «پیکربندی وب‌سرور با چند ریشه پروژه» در بخش «راه‌اندازی پیشرفته وب‌سرور» را نیز ببینید).

our $projectroot = '/path/to/parent/directory';

مقدار پیش‌فرض برای $projectroot برابر با /pub/git است. می‌توانید هنگام ساخت gitweb آن را از طریق متغیر پیکربندی ساخت GITWEB_PROJECTROOT تغییر دهید.

به طور پیش‌فرض تمام مخازن گیت واقع در $projectroot برای gitweb قابل مشاهده و در دسترس هستند. فهرست پروژه‌ها به طور پیش‌فرض با پیمایش دایرکتوری $projectroot برای یافتن مخازن گیت تولید می‌شود (به بیان دقیق‌تر برای پایگاه‌های داده اشیاء؛ gitweb نیازی به ناحیه کاری ندارد و برای نمایش مخازن «bare» مناسب‌تر است).

نام مخزن در gitweb همان مسیر به $GIT_DIR آن (پایگاه داده اشیاء آن) به صورت نسبی نسبت به $projectroot است. بنابراین مخزن $repo را می‌توان در "$projectroot/$repo" پیدا کرد.

به جای اینکه gitweb با پیمایش فایل‌سیستم از $projectroot مخازن را پیدا کند، می‌توانید با تنظیم متغیر $projects_list به نحوی که به یک فایل متنی ساده حاوی فهرستی از پروژه‌ها (همراه با برخی اطلاعات اضافی) اشاره کند، فهرستی از پیش تولیدشده از پروژه‌های قابل مشاهده را ارائه دهید.

این فایل از قالب زیر استفاده می‌کند:

•هر رکورد (برای پروژه / مخزن) در یک خط قرار می‌گیرد؛ شکستن خط در ادامه‌اش (گریز از خط جدید) پشتیبانی نمی‌شود.
•فاصله‌های خالی ابتدایی و انتهایی نادیده گرفته می‌شوند.
•فیلدها با فاصله‌های خالی از هم جدا می‌شوند؛ هر دنباله‌ای از فاصله‌های خالی می‌تواند به عنوان جداکننده فیلد عمل کند (قوانین مربوط به "split(" ", $line)" در پرل).
•فیلدها از کدگذاری اصلاح‌شده URI استفاده می‌کنند که در RFC 3986، بخش ۲.۱ (کدگذاری درصدی) یا به عبارت دقیق‌تر «کدگذاری رشته پرسمان» (نگاه کنید به https://en.wikipedia.org/wiki/Query_string#URL_encoding) تعریف شده است؛ تفاوت در این است که SP (" ") می‌تواند به صورت "+" کدگذاری شود (و بنابراین خود "+" نیز باید با درصد کدگذاری گردد).

نویسه‌های رزرو شده عبارتند از: "%" (برای کدگذاری)، "+" (می‌تواند برای کدگذاری فاصله خالی استفاده شود)، و تمام نویسه‌های فاصله خالی طبق تعریف پرل، شامل SP، TAB و LF (برای جداسازی فیلدها در یک رکورد).

•فیلدهایی که در حال حاضر شناسایی می‌شوند عبارتند از:

<repository path>

مسیر به GIT_DIR مخزن، به صورت نسبی نسبت به $projectroot

<repository owner>

به عنوان مالک مخزن نمایش داده می‌شود، ترجیحاً نام کامل، یا ایمیل، یا هر دو

می‌توانید فایل نمایه فهرست پروژه‌ها را با استفاده از کنش project_index (پیوند TXT در صفحه فهرست پروژه‌ها) مستقیماً از gitweb تولید کنید؛ همچنین بخش «تولید فهرست پروژه‌ها با استفاده از gitweb» در زیر را ببینید.

نمونه محتویات:

foo.git       Joe+R+Hacker+<joe@example.com>
foo/bar.git   O+W+Ner+<owner@example.org>

به طور پیش‌فرض این فایل تنها مشخص می‌کند که کدام پروژه‌ها در صفحه فهرست پروژه‌ها قابل مشاهده هستند (توجه داشته باشید مواردی که به مخازن به درستی شناسایی‌شده گیت اشاره نکنند توسط gitweb نمایش داده نخواهند شد). حتی اگر پروژه‌ای در صفحه فهرست پروژه‌ها قابل مشاهده نباشد، همچنان می‌توانید با ساخت دستی یک نشانی اینترنتی gitweb آن را مشاهده کنید. با تنظیم متغیر پیکربندی $strict_export (به gitweb.conf(5) مراجعه کنید) روی یک مقدار درستی (true)، می‌توانید اجازه دهید تنها مخازنی مشاهده شوند که در صفحه مرور کلی نمایش داده شده‌اند (یعنی فقط پروژه‌هایی که صریحاً در فایل فهرست پروژه‌ها ذکر شده‌اند در دسترس خواهند بود).

فرض می‌کنیم که GITWEB_CONFIG مقدار پیش‌فرض Makefile خود یعنی gitweb_config.perl را دارد. خطوط زیر را در فایل gitweb_make_index.perl قرار دهید:

read_config_file("gitweb_config.perl");
$projects_list = $projectroot;

سپس اسکریپت زیر را ایجاد کنید تا فهرست پروژه‌ها را در قالبی مناسب برای متغیر پیکربندی ساخت GITWEB_LIST (یا متغیر $projects_list در پیکربندی gitweb) دریافت نمایید:

#!/bin/sh
export GITWEB_CONFIG="gitweb_make_index.perl"
export GATEWAY_INTERFACE="CGI/1.1"
export HTTP_ACCEPT="*/*"
export REQUEST_METHOD="GET"
export QUERY_STRING="a=project_index"
perl -- /var/www/cgi-bin/gitweb.cgi

این اسکریپت را اجرا کرده و خروجی آن را در یک فایل ذخیره کنید. سپس می‌توان از این فایل به عنوان فایل فهرست پروژه‌ها استفاده کرد، به این معنی که می‌توانید $projects_list را روی نام فایل آن تنظیم کنید.

به طور پیش‌فرض تمام مخازن گیت واقع در $projectroot برای gitweb قابل مشاهده و در دسترس هستند. با این حال می‌توانید نحوه کنترل دسترسی به مخازن توسط gitweb را پیکربندی کنید.

•همان‌طور که در بخش «قالب فایل فهرست پروژه‌ها» شرح داده شد، می‌توانید پروژه‌های قابل مشاهده را با گنجاندن انتخابی مخازن در فایل فهرست پروژه‌ها، و تنظیم متغیر پیکربندی $projects_list در gitweb به منظور اشاره به آن کنترل کنید. با تنظیم بودن $strict_export ، فایل فهرست پروژه‌ها می‌تواند برای کنترل اینکه کدام مخازن در دسترس هستند نیز استفاده شود.
•می‌توانید gitweb را به گونه‌ای پیکربندی کنید که تنها مخازنی را فهرست و مجاز به مشاهده کند که صریحاً صادر شده‌اند؛ این کار از طریق متغیر $export_ok در فایل پیکربندی gitweb انجام می‌شود؛ به صفحه راهنمای gitweb.conf(5) مراجعه کنید. اگر مقدار این متغیر درستی ارزیابی شود، gitweb مخازن را تنها در صورتی نمایش می‌دهد که فایل نام‌گذاری‌شده توسط $export_ok در پایگاه داده اشیاء آن وجود داشته باشد (اگر دایرکتوری دارای فایل جادویی به نام $export_ok باشد).

برای نمونه، دستور git-daemon(1) به طور پیش‌فرض (مگر اینکه گزینه --export-all استفاده شود) تنها دریافت مخازنی را مجاز می‌داند که فایل git-daemon-export-ok را داشته باشند. افزودن

our $export_ok = "git-daemon-export-ok";

باعث می‌شود gitweb فقط مخازنی را نمایش دهد و اجازه دسترسی به آن‌ها را بدهد که امکان واکشی از آن‌ها از طریق پروتکل git:// وجود داشته باشد.

•در نهایت، امکان تعیین یک زیرروال دلخواه در پرل وجود دارد که برای هر مخزن فراخوانی می‌شود تا مشخص گردد آیا امکان صدور آن وجود دارد یا خیر. این زیرروال یک مسیر مطلق به پروژه (مخزن) را به عنوان تنها پارامتر خود دریافت می‌کند (یعنی "$projectroot/$project").

برای مثال، اگر از mod_perl برای اجرای اسکریپت استفاده می‌کنید و احراز هویت پروتکل سنتی HTTP (dumb HTTP) برای مخازن شما پیکربندی شده است، می‌توانید از قلاب زیر برای اعطای دسترسی تنها در صورت مجاز بودن کاربر به خواندن فایل‌ها استفاده کنید:

$export_auth_hook = sub {
        use Apache2::SubRequest ();
        use Apache2::Const -compile => qw(HTTP_OK);
        my $path = "$_[0]/HEAD";
        my $r    = Apache2::RequestUtil->request;
        my $sub  = $r->lookup_file($path);
        return $sub->filename eq $path
            && $sub->status == Apache2::Const::HTTP_OK;
};

می‌توانید مخازن منفرد نمایش‌داده‌شده در gitweb را با ایجاد فایل در GIT_DIR مخزن گیت، یا با تنظیم برخی متغیرهای پیکربندی مخزن (در GIT_DIR/config، به git-config(1) مراجعه کنید) پیکربندی نمایید.

می‌توانید از فایل‌های زیر در مخزن استفاده کنید:

README.html

یک فایل html (قطعه HTML) که در صفحه خلاصه ("summary") پروژه در gitweb درون یک عنصر بلوکی <div> گنجانده می‌شود. می‌توانید از آن برای توضیحات طولانی‌تر یک پروژه، ارائه پیوندها (مثلاً به صفحه خانگی پروژه) و غیره استفاده کنید. این مورد تنها در صورتی شناسایی می‌شود که جلوگیری از XSS غیرفعال باشد ($prevent_xss نادرست باشد، به gitweb.conf(5) مراجعه کنید)؛ راهکاری برای گنجاندن امن README در زمان فعال بودن جلوگیری از XSS ممکن است در آینده تدوین شود.

description (یا gitweb.description)

توضیح تک‌خطی کوتاه (کوتاه‌شده به $projects_list_description_width در صفحه فهرست پروژه‌ها که به طور پیش‌فرض ۲۵ نویسه است؛ به gitweb.conf(5) مراجعه کنید) از یک پروژه (یک مخزن). فایل متنی ساده؛ کدهای HTML گریز داده خواهند شد. به طور پیش‌فرض روی مقدار زیر تنظیم می‌شود:
Unnamed repository; edit this file to name it for gitweb.

که در زمان ایجاد مخزن از قالب برداشته شده و معمولاً در /usr/share/git-core/templates/ نصب شده است. می‌توانید از متغیر پیکربندی مخزن gitweb.description استفاده کنید، اما فایل اولویت دارد.

category (یا gitweb.category)

دسته‌بندی تک‌خطی یک پروژه که برای گروه‌بندی پروژه‌ها در صورت فعال بودن $projects_list_group_categories به کار می‌رود. به طور پیش‌فرض (در صورت نبود فایل و متغیر پیکربندی)، پروژه‌های دسته‌بندی‌نشده در دسته $project_list_default_category قرار می‌گیرند. می‌توانید از متغیر پیکربندی مخزن gitweb.category استفاده کنید، اما فایل اولویت دارد.

متغیرهای پیکربندی $projects_list_group_categories و $project_list_default_category در gitweb.conf(5) شرح داده شده‌اند.

cloneurl (یا چندمقداری gitweb.url)

فایلی شامل نشانی‌های اینترنتی مخزن (مورد استفاده برای کلون و واکشی)، هر کدام در یک خط. در صفحه خلاصه پروژه نمایش داده می‌شود. می‌توانید از متغیر چندمقداری gitweb.url در پیکربندی مخزن برای این منظور استفاده کنید، اما فایل اولویت دارد.

این قابلیت نسخه پیشرفته‌تر / اختصاصی برای هر مخزن از متغیر پیکربندی سراسری و مبتنی بر پیشوند @git_base_url_list در gitweb است (به gitweb.conf(5) مراجعه کنید).

gitweb.owner

می‌توانید از متغیر پیکربندی مخزن gitweb.owner برای تعیین مالک مخزن استفاده کنید. این مقدار در فهرست پروژه‌ها و صفحه خلاصه نمایش داده می‌شود.

اگر تنظیم نشده باشد، در صورتی که $projects_list تنظیم نشده باشد (هنگامی که gitweb دایرکتوری $projectroot را برای یافتن مخازن جستجو می‌کند) از مالک دایرکتوری در فایل‌سیستم استفاده می‌شود (از طریق فیلد GECOS، یعنی فیلد نام واقعی حاصل از getpwuid(3))؛ و اگر $projects_list به فایلی حاوی فهرست مخازن اشاره کند، مقدار پیش‌فرض مالک پروژه همان مقدار موجود در این فایل برای مخزن مورد نظر خواهد بود.

متغیرهای پیکربندی مختلف gitweb.* (در پیکربندی)

توضیحات مربوط به درهم‌سازی (هش) %feature را برای دریافت فهرست تفصیلی و توضیحات مطالعه کنید. همچنین به بخش «پیکربندی قابلیت‌های gitweb» در gitweb.conf(5) مراجعه نمایید.

ابزار Gitweb می‌تواند از نشانی‌های اینترنتی مبتنی بر path_info (مؤلفه‌ای) استفاده کند، یا تمام اطلاعات لازم را از طریق پارامترهای پرسمان (query) انتقال دهد. نشانی‌های اینترنتی معمول gitweb به پنج مؤلفه تقسیم می‌شوند:

.../gitweb.cgi/<repo>/<action>/<revision>:/<path>?<arguments>

repo

مخزنی که کنش روی آن اجرا خواهد شد.

تمام کنش‌ها به جز کنش‌هایی که تمام پروژه‌های موجود را به هر شکلی فهرست می‌کنند، به این پارامتر نیاز دارند.

action

کنشی که اجرا خواهد شد. در صورت تنظیم نبودن repo، مقدار پیش‌فرض آن projects_list و در غیر این صورت summary است.

revision

بازبینی نمایش‌داده‌شده. مقدار پیش‌فرض HEAD است.

path

مسیری درون <repository> که کنش بر روی آن برای آن دسته از کنش‌هایی که به آن نیاز دارند، انجام می‌شود.

arguments

هر آرگومانی که رفتار کنش را کنترل می‌کند.

برخی کنش‌ها نیازمند تعیین دو بازبینی، و گاهی حتی دو نام مسیر هستند یا این امکان را می‌دهند. در کلی‌ترین حالت، چنین نشانی‌های اینترنتی مبتنی بر path_info (مؤلفه‌ای) در gitweb به صورت زیر خواهند بود:

.../gitweb.cgi/<repo>/<action>/<revision-from>:/<path-from>..<revision-to>:/<path-to>?<arguments>

هر کنش به صورت یک زیرروال پیاده‌سازی شده و باید در درهم‌سازی (هش) %actions وجود داشته باشد. برخی کنش‌ها به طور پیش‌فرض غیرفعال هستند و باید از طریق سازوکار قابلیت‌ها (feature) فعال شوند. برای نمونه جهت فعال‌سازی نمای blame، خط زیر را به فایل پیکربندی gitweb اضافه کنید:

$feature{'blame'}{'default'} = [1];

کنش‌های استاندارد عبارتند از:

project_list

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

summary

خلاصه‌ای از مخزن داده‌شده را نمایش می‌دهد. اگر هیچ کنشی در نشانی مشخص نشده باشد و تنها مخزن مشخص شده باشد، این دستور پیش‌فرض است.

heads, remotes

تمام شاخه‌های محلی یا تمام شاخه‌های ردیابی از راه دور را در مخزن داده‌شده فهرست می‌کند.

مورد دوم به طور پیش‌فرض در دسترس نیست، مگر اینکه پیکربندی شده باشد.

tags

تمام برچسب‌ها (سبک و حاشیه‌نویسی‌شده) را در مخزن داده‌شده فهرست می‌کند.

blob, tree

فایل‌ها و دایرکتوری‌ها را در یک مسیر مشخص از مخزن و در بازبینی داده‌شده نمایش می‌دهد. اگر هیچ کنشی در نشانی مشخص نشده باشد و مسیر مشخص شده باشد، این دستور پیش‌فرض است.

blob_plain

داده‌های خام فایل را در مخزن داده‌شده در مسیر و بازبینی مشخص بازمی‌گرداند. پیوندهای مربوط به این کنش با برچسب raw مشخص می‌شوند.

blobdiff

تفاوت میان دو بازبینی از یک فایل یکسان را نمایش می‌دهد.

blame, blame_incremental

اطلاعات انتساب (یا حاشیه‌نویسی) یک فایل را نمایش می‌دهد. به صورت خط به خط بازبینی‌ای را که آن خط در آن آخرین بار تغییر کرده و کاربری که آن تغییر را کامیت کرده است نمایش می‌دهد. نسخه افزایشی (که در صورت پیکربندی و فعال بودن جاوااسکریپت به طور خودکار استفاده می‌شود)، از Ajax برای اضافه کردن تدریجی اطلاعات انتساب به محتویات فایل استفاده می‌کند.

این کنش به دلایل مربوط به کارایی به طور پیش‌فرض غیرفعال است.

commit, commitdiff

اطلاعات مربوط به یک کامیت خاص را در یک مخزن نمایش می‌دهد. نمای commit اطلاعات کامیت را با جزئیات بیشتر نشان می‌دهد و کنش commitdiff مجموعه تغییرات (changeset) کامیت مورد نظر را نمایش می‌دهد.

patch

کامیت را در قالب نامه متنی ساده که برای اعمال با git-am(1) مناسب است، بازمی‌گرداند.

tag

برچسب حاشیه‌نویسی‌شده مشخص (شیء برچسب) را نمایش می‌دهد.

log, shortlog

اطلاعات سیاهه‌ها (پیام کامیت یا فقط موضوع کامیت) را برای یک شاخه مشخص (شروع از بازبینی داده‌شده) نمایش می‌دهد.

نمای shortlog فشرده‌تر است؛ در هر خط یک کامیت را نمایش می‌دهد.

history

تاریخچه فایل یا دایرکتوری را در مسیر مشخصی از مخزن، از بازبینی داده‌شده شروع می‌کند (پیش‌فرض آن HEAD یعنی شاخه پیش‌فرض است).

این نما شبیه به نمای shortlog است.

rss, atom

خوراک RSS (یا Atom) تغییرات اعمال‌شده در مخزن را تولید می‌کند.

این بخش نحوه پیکربندی برخی از وب‌سرورهای متداول برای اجرای gitweb را شرح می‌دهد. در تمام مثال‌ها، مسیر /path/to/gitweb دایرکتوری‌ای است که gitweb نصب‌شده در آن اجرا شده و شامل gitweb_config.perl است.

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

آپاچی باید به گونه‌ای پیکربندی شود که از اسکریپت‌های CGI در دایرکتوری محل نصب gitweb پشتیبانی کند. فرض کنیم این دایرکتوری /var/www/cgi-bin باشد.

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
    Options Indexes FollowSymlinks ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

با این پیکربندی، مسیر کامل برای مرور مخازن به صورت زیر خواهد بود:

می‌توانید از mod_perl همراه با gitweb استفاده کنید. برای فعال‌سازی این پشتیبانی باید بسته Apache::Registry (برای mod_perl 1.x) یا ModPerl::Registry (برای mod_perl 2.x) را نصب کنید.

با فرض اینکه gitweb در /var/www/perl نصب شده باشد، پیکربندی آپاچی زیر (برای mod_perl 2.x) مناسب است.

Alias /perl "/var/www/perl"
<Directory "/var/www/perl">
    SetHandler perl-script
    PerlResponseHandler ModPerl::Registry
    PerlOptions +ParseHeaders
    Options Indexes FollowSymlinks +ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

با این پیکربندی، مسیر کامل برای مرور مخازن به صورت زیر خواهد بود:

ابزار Gitweb با آپاچی و FastCGI کار می‌کند. ابتدا باید فایل gitweb.cgi را به gitweb.fcgi تغییر نام داده، کپی کرده یا به صورت پیوند نمادین درآورید. فرض کنیم gitweb در دایرکتوری /usr/share/gitweb نصب شده است. پیکربندی آپاچی زیر مناسب است (تست‌نشده!)

FastCgiServer /usr/share/gitweb/gitweb.cgi
ScriptAlias /gitweb /usr/share/gitweb/gitweb.cgi
Alias /gitweb/static /usr/share/gitweb/static
<Directory /usr/share/gitweb/static>
    SetHandler default-handler
</Directory>

با این پیکربندی، مسیر کامل برای مرور مخازن به صورت زیر خواهد بود:

تمام این مثال‌ها از بازنویسی درخواست‌ها استفاده می‌کنند و نیازمند ماژول mod_rewrite (یا معادل آن؛ مثال‌های زیر برای آپاچی نوشته شده‌اند) هستند.

اگر می‌خواهید یک نشانی اینترنتی یکسان برای هم gitweb و هم مخازن http:// خود داشته باشید، می‌توانید آپاچی را به این صورت پیکربندی کنید:

<VirtualHost *:80>
    ServerName    git.example.org
    DocumentRoot  /pub/git
    SetEnv        GITWEB_CONFIG   /etc/gitweb.conf
    # turning on mod rewrite
    RewriteEngine on
    # make the front page an internal rewrite to the gitweb script
    RewriteRule ^/$  /cgi-bin/gitweb.cgi
    # make access for "dumb clients" work
    RewriteRule ^/(.*\.git/(?!/?(HEAD|info|objects|refs)).*)?$ \
                /cgi-bin/gitweb.cgi%{REQUEST_URI}  [L,PT]
</VirtualHost>

پیکربندی بالا انتظار دارد مخازن عمومی شما زیر دایرکتوری /pub/git قرار داشته باشند و آن‌ها را به صورت http://git.domain.org/dir-under-pub-git ارائه می‌دهد، هم به عنوان یک نشانی اینترنتی قابل کلون در گیت و هم به عنوان رابط قابل مرور در gitweb. اگر سپس git-daemon(1) خود را با --base-path=/pub/git --export-all راه‌اندازی کنید، حتی می‌توانید از نشانی git:// با دقیقاً همان مسیر استفاده کنید.

تنظیم متغیر محیطی GITWEB_CONFIG به gitweb می‌گوید که از فایل نام‌برده (یعنی در این مثال /etc/gitweb.conf) به عنوان پیکربندی برای gitweb استفاده کند. در مثال بالا واقعاً به آن نیازی ندارید؛ این مورد تنها زمانی الزامی است که فایل پیکربندی شما در مکانی متفاوت از فایل‌های توکار (هنگام کامپایل gitweb) یعنی gitweb_config.perl یا /etc/gitweb.conf قرار داشته باشد. برای جزئیات، به ویژه اطلاعات مربوط به قوانین اولویت‌بندی، به gitweb.conf(5) مراجعه کنید.

اگر از قوانین بازنویسی موجود در این مثال استفاده می‌کنید، ممکن است به چیزی شبیه به موارد زیر نیز در فایل پیکربندی gitweb خود (/etc/gitweb.conf مطابق این مثال) نیاز داشته باشید:

@stylesheets = ("/some/absolute/path/gitweb.css");
$my_uri    = "/";
$home_link = "/";
$per_request_config = 1;

هرچند امروزه gitweb باید در صورت نیاز تگ پایه HTML (برای تنظیم URI پایه پیوندهای نسبی) را به درستی ایجاد کند، بنابراین باید به طور خودکار کار کند.

اگر می‌خواهید از gitweb با چندین ریشه پروژه استفاده کنید، می‌توانید میزبان مجازی آپاچی و فایل‌های پیکربندی gitweb خود را به روش زیر ویرایش نمایید.

پیکربندی میزبان مجازی (در فایل پیکربندی آپاچی) باید به شکل زیر باشد:

<VirtualHost *:80>
    ServerName    git.example.org
    DocumentRoot  /pub/git
    SetEnv        GITWEB_CONFIG  /etc/gitweb.conf
    # turning on mod rewrite
    RewriteEngine on
    # make the front page an internal rewrite to the gitweb script
    RewriteRule ^/$  /cgi-bin/gitweb.cgi  [QSA,L,PT]
    # look for a public_git directory in unix users' home
    # http://git.example.org/~<user>/
    RewriteRule ^/\~([^\/]+)(/|/gitweb.cgi)?$   /cgi-bin/gitweb.cgi \
                [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT]
    # http://git.example.org/+<user>/
    #RewriteRule ^/\+([^\/]+)(/|/gitweb.cgi)?$  /cgi-bin/gitweb.cgi \
                 [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT]
    # http://git.example.org/user/<user>/
    #RewriteRule ^/user/([^\/]+)/(gitweb.cgi)?$ /cgi-bin/gitweb.cgi \
                 [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT]
    # defined list of project roots
    RewriteRule ^/scm(/|/gitweb.cgi)?$ /cgi-bin/gitweb.cgi \
                [QSA,E=GITWEB_PROJECTROOT:/pub/scm/,L,PT]
    RewriteRule ^/var(/|/gitweb.cgi)?$ /cgi-bin/gitweb.cgi \
                [QSA,E=GITWEB_PROJECTROOT:/var/git/,L,PT]
    # make access for "dumb clients" work
    RewriteRule ^/(.*\.git/(?!/?(HEAD|info|objects|refs)).*)?$ \
                /cgi-bin/gitweb.cgi%{REQUEST_URI}  [L,PT]
</VirtualHost>

در اینجا ریشه واقعی پروژه از طریق متغیر محیطی GITWEB_PROJECT_ROOT از وب‌سرور به gitweb ارسال می‌شود، بنابراین باید خط زیر را در فایل پیکربندی gitweb (در مثال بالا /etc/gitweb.conf) قرار دهید:

$projectroot = $ENV{'GITWEB_PROJECTROOT'} || "/pub/git";

توجه داشته باشید که این مورد نیازمند آن است که برای هر درخواست تنظیم شود، بنابراین یا باید $per_request_config نادرست باشد، یا کد فوق باید در کدی قرار گیرد که توسط $per_request_config ارجاع داده می‌شود؛

این پیکربندی‌ها دو قابلیت را فعال می‌کنند. نخست اینکه هر کاربر یونیکس (<user>) در سرور می‌تواند مخازن گیت موجود در ~/public_git/ را از طریق gitweb با نشانی زیر مرور کند:

http://git.example.org/~<user>/

اگر این ویژگی را روی سرور خود نمی‌خواهید، کافی است قانون دوم بازنویسی را حذف کنید.

اگر پیش‌تر از ‘mod_userdir` در میزبان مجازی خود استفاده می‌کنید یا نمی‌خواهید از '~’ به عنوان اولین نویسه استفاده کنید، کافی است قانون بازنویسی دوم را کامنت یا حذف کرده و بسته به آنچه می‌خواهید یکی از خطوط پس از آن را از حالت کامنت خارج نمایید.

دوم اینکه، مخازن موجود در /pub/scm/ و /var/git/ از طریق http://git.example.org/scm/ و http://git.example.org/var/ در دسترس خواهند بود. با افزودن قوانین بازنویسی شبیه به قوانین سوم و چهارم، می‌توانید هر تعداد ریشه پروژه را که می‌خواهید اضافه کنید.

اگر استفاده از PATH_INFO را در gitweb با قرار دادن

$feature{'pathinfo'}{'default'} = [1];

در فایل پیکربندی gitweb خود فعال کنید، می‌توان سرور را به گونه‌ای راه‌اندازی کرد که نشانی‌های اینترنتی را به شکل زیر دریافت و تولید کند:

یعنی بدون بخش gitweb.cgi، با استفاده از پیکربندی‌ای مانند موارد زیر. این پیکربندی فرض می‌کند که /var/www/gitweb همان ریشه سند (DocumentRoot) وب‌سرور شما است، و شامل اسکریپت gitweb.cgi و فایل‌های استاتیک مکمل (برگه استایل، فاوآیکون، جاوااسکریپت) است:

<VirtualHost *:80>
        ServerAlias git.example.com
        DocumentRoot /var/www/gitweb
        <Directory /var/www/gitweb>
                Options ExecCGI
                AddHandler cgi-script cgi
                DirectoryIndex gitweb.cgi
                RewriteEngine On
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteRule ^.* /gitweb.cgi/$0 [L,PT]
        </Directory>
</VirtualHost>

قانون بازنویسی تضمین می‌کند که فایل‌های استاتیک موجود به درستی ارائه شوند، در حالی که هر نشانی دیگری به عنوان پارامتر PATH_INFO به gitweb ارسال خواهد شد.

توجه کنید که در این حالت شما به تنظیمات خاصی برای @stylesheets، $my_uri و $home_link نیاز ندارید، اما دسترسی «کلاینت‌های سنتی (dumb clients)» به دایرکتوری‌های git. پروژه خود را از دست می‌دهید (که در بخش «نشانی اینترنتی یکسان برای gitweb و برای واکشی مخزن» شرح داده شد). یک راهکار احتمالی برای این مورد به شرح زیر است: در دایرکتوری ریشه پروژه خود (مثلاً /pub/git) نام پروژه‌ها را بدون پسوند git. قرار دهید (مثلاً /pub/git/project به جای /pub/git/project.git) و آپاچی را به این صورت پیکربندی کنید:

<VirtualHost *:80>
        ServerAlias git.example.com
        DocumentRoot /var/www/gitweb
        AliasMatch ^(/.*?)(\.git)(/.*)?$ /pub/git$1$3
        <Directory /var/www/gitweb>
                Options ExecCGI
                AddHandler cgi-script cgi
                DirectoryIndex gitweb.cgi
                RewriteEngine On
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteRule ^.* /gitweb.cgi/$0 [L,PT]
        </Directory>
</VirtualHost>

دستور اضافی AliasMatch شرایطی را فراهم می‌کند که

دسترسی خام به دایرکتوری گیت پروژه را فراهم نماید (تا امکان کلون کردن پروژه وجود داشته باشد)، در حالی که

دسترسی کاربرپسند به gitweb را فراهم خواهد ساخت.

این راهکار کاملاً و ۱۰۰٪ بی‌نقص نیست، به این معنا که اگر پروژه‌ای دارای یک مرجع (شاخه، برچسب) باشد که با git/ آغاز شود، مسیرهایی مانند

با خطای ۴۰۴ مواجه خواهند شد.

لطفاً هرگونه باگ یا درخواست ویژگی را به git@vger.kernel.org[1] گزارش دهید و عبارت "gitweb" را در موضوع ایمیل قرار دهید.

gitweb.conf(5), git-instaweb(1)

gitweb/README, gitweb/INSTALL

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

1.
git@vger.kernel.org
mailto:git@vger.kernel.org
2026-06-29 Git 2.55.0