| GIT-CVSSERVER(1) | Git Manual | GIT-CVSSERVER(1) |
نام (NAME)
git-cvsserver - یک شبیهساز سرور CVS برای گیت
خلاصه دستور (SYNOPSIS)
SSH:
export CVS_SERVER="git cvsserver" cvs -d :ext:user@server/path/repo.git co <HEAD_name>
pserver (/etc/inetd.conf):
cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver
کاربرد (Usage):
git-cvsserver [<options>] [pserver|server] [<directory> ...]
توضیحات (DESCRIPTION)
این برنامه یک لایهٔ شبیهساز CVS برای گیت (Git) است.
این ابزار قابلیتهای فراوانی دارد؛ با این حال، همهٔ متدها پیادهسازی نشدهاند و برای متدهای پیادهسازیشده نیز تمام سوییچها در دسترس نیستند.
آزمایشها با استفاده از کلاینت خط فرمانی CVS و افزونهٔ CVS اکلیپس (Eclipse) انجام شده است. بیشتر قابلیتها با هر دوی این کلاینتها به خوبی کار میکنند.
گزینهها (OPTIONS)
تمام این گزینهها مسلماً تنها در صورتی منطقی هستند که از سمت سرور اعمال شوند. آنها طوری پیادهسازی شدهاند که تا جای ممکن به گزینههای git-daemon(1) شباهت داشته باشند.
--base-path <path>
--strict-paths
--export-all
-V, --version
-h, -H, --help
<directory>
محدودیتها (LIMITATIONS)
کلاینتهای CVS قادر به برچسبگذاری (tag)، ایجاد شاخه (branch) یا انجام ادغامهای گیت (Git merge) نیستند.
دستور git-cvsserver شاخههای گیت را به ماژولهای CVS نگاشت میکند. این رفتار با انتظاری که اکثر کاربران CVS دارند بسیار متفاوت است، زیرا در CVS ماژولها معمولاً نشاندهندهٔ یک یا چند دایرکتوری هستند.
نصب و راهاندازی (INSTALLATION)
cvspserver stream tcp nowait nobody git-cvsserver pserver
نکته: برخی از سرورهای inetd به شما اجازه میدهند نام فایل اجرایی را مستقل از مقدار argv[0] (یعنی نامی که برنامه فرض میکند با آن اجرا شده است) مشخص کنید. در این حالت خط صحیح در /etc/inetd.conf به این صورت خواهد بود:
cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver
بهطور پیشفرض تنها دسترسی ناشناس (anonymous) توسط pserver ارائه میشود. برای کامیت کردن باید حسابهای کاربری pserver بسازید؛ کافی است تنظیم gitcvs.authdb را به فایل پیکربندی مخازنی که میخواهید cvsserver اجازهٔ نوشتن در آنها را بدهد اضافه کنید، برای مثال:
[gitcvs]
authdb = /etc/cvsserver/passwd
قالب این فایلها به صورت نام کاربری و به دنبال آن گذرواژهٔ رمزگذاریشده است، برای مثال:
myuser:sqkNi8zPf01HI myuser:$1$9K7FzU28$VfF6EoPYCJEYcVQwATgOP/ myuser:$5$.NqmNH1vwfzGpV8B$znZIcumu1tNLATgV2l6e1/mY8RzhUDHMOaVOeL1cxV3
میتوانید از ابزار htpasswd که همراه آپاچی ارائه میشود برای ایجاد این فایلها استفاده کنید، اما فقط با گزینهٔ -d (یا -B در صورتی که سیستم شما از آن پشتیبانی میکند).
ترجیحاً از ابزار اختصاصی پلتفرم خود برای مدیریت و ایجاد هش گذرواژه استفاده کنید (مانند mkpasswd در لینوکس، encrypt در OpenBSD یا pwhash در NetBSD) و آن را در محل مناسب قرار دهید.
سپس گذرواژهٔ خود را از طریق روش pserver ارائه دهید، برای مثال:
cvs -d:pserver:someuser:somepassword@server:/path/repo.git co <HEAD_name>
برای دسترسی از طریق SSH، نیازی به پیکربندی خاصی بهجز وجود ابزارهای گیت در PATH نیست. اگر کلاینتهایی دارید که متغیر محیطی CVS_SERVER را نمیپذیرند، میتوانید نام git-cvsserver را به cvs تغییر دهید.
نکته: نسخههای جدیدتر CVS (نسخهٔ 1.12.11 یا بالاتر) از تعیین مستقیم CVS_SERVER در CVSROOT نیز پشتیبانی میکنند، مانند:
cvs -d ":ext;CVS_SERVER=git cvsserver:user@server/path/repo.git" co <HEAD_name>
این مزیت را دارد که در فایلهای CVS/Root شما ذخیره میشود و نیازی نیست نگران تنظیم همیشگی متغیر محیطی مناسب باشید. کاربران SSH که به git-shell محدود شدهاند نیازی به بازنویسی پیشفرض با CVS_SERVER ندارند (و نباید این کار را بکنند)، زیرا git-shell متوجه میشود که cvs به معنای git-cvsserver است و بهتر تظاهر میکند که طرف دیگر کلاینت، یک cvs واقعی را اجرا میکند.
[gitcvs]
enabled=1
# اختیاری برای اشکالزدایی
logFile=/path/to/logfile
نکته: باید اطمینان حاصل کنید هر کاربری که قرار است git-cvsserver را فراخوانی کند، دسترسی نوشتن به فایل لاگ و پایگاهداده را داشته باشد (بخش «پایگاهداده پشتیبان» را ببینید). اگر میخواهید دسترسی نوشتن از طریق SSH ارائه دهید، کاربران مسلماً به دسترسی نوشتن در خود مخزن گیت نیز نیاز دارند.
همچنین برای کارکرد صحیح cvs commit باید اطمینان یابید که هر مخزن «خام» (bare - بدون فایل ایندکس گیت) باشد. به gitcvs-migration(7) مراجعه کنید.
تمام متغیرهای پیکربندی میتوانند برای یک روش دسترسی خاص نیز بازنویسی شوند. نامهای معتبر روشها عبارتند از "ext" (برای دسترسی SSH) و "pserver". نمونهٔ پیکربندی زیر دسترسی pserver را غیرفعال کرده در حالی که دسترسی از طریق SSH را همچنان مجاز نگه میدارد:
[gitcvs]
enabled=0
[gitcvs "ext"]
enabled=1
export CVSROOT=:ext:user@server:/var/git/project.git export CVS_SERVER="git cvsserver"
cvs co -d project-master master
پایگاهداده پشتیبان (DATABASE BACKEND)
دستور git-cvsserver برای هر شاخه/head گیت (یعنی ماژول CVS) از یک پایگاهداده برای ذخیرهٔ اطلاعات مخزن استفاده میکند تا شمارههای بازنگری CVS پایدار بمانند. این پایگاهداده باید پس از هر کامیت بهروزرسانی شود (یعنی در آن نوشته شود).
اگر کامیت مستقیماً با استفاده از git انجام شود (برخلاف استفاده از git-cvsserver)، بهروزرسانی باید در دسترسی بعدی به مخزن توسط git-cvsserver، مستقل از روش دسترسی و عملیات درخواستی، صورت پذیرد.
این بدان معناست که حتی اگر فقط دسترسی خواندن ارائه دهید (مثلاً با استفاده از روش pserver)، git-cvsserver باید دسترسی نوشتن به پایگاهداده را داشته باشد تا عملکرد قابل اعتمادی ارائه دهد (در غیر این صورت باید اطمینان حاصل کنید که پایگاهداده در هر بار اجرای git-cvsserver کاملاً بهروز باشد).
بهطور پیشفرض از پایگاهدادههای SQLite در دایرکتوری گیت با نام gitcvs.<module-name>.sqlite استفاده میشود. توجه داشته باشید که بکاند SQLite هنگام نوشتن، فایلهای موقتی در همان دایرکتوری فایل پایگاهداده ایجاد میکند؛ بنابراین ممکن است تنها اعطای دسترسی نوشتن به فایل پایگاهداده برای کاربرانی که از git-cvsserver استفاده میکنند کافی نباشد و نیاز به اعطای دسترسی نوشتن به دایرکتوری نیز داشته باشند.
پایگاهداده پس از تغییر شاخهای که ردیابی میکند، نمیتواند بهطور قابل اعتماد در یک فرم سازگار بازسازی شود. مثال: برای شاخههای ادغامشده، git-cvsserver تنها یک شاخه از توسعه را ردیابی میکند، و پس از یک git merge ممکن است پایگاهدادهای که بهصورت تدریجی بهروزرسانی شده، شاخهٔ متفاوتی را نسبت به پایگاهدادهای که از ابتدا بازسازی شده ردیابی کند و این امر باعث ناسازگاری شمارههای بازنگری CVS شود. دستور git-cvsserver هیچ راهی برای آگاهی از این موضوع ندارد که اگر پیش از ادغام بهطور تدریجی اجرا شده بود کدام شاخه را انتخاب میکرد. بنابراین اگر مجبور به بازسازی کامل یا جزئی (از یک پشتیبان قدیمی) پایگاهداده شدید، باید نسبت به سندباکسهای موجود CVS محتاط باشید.
میتوانید بکاند پایگاهداده را با متغیرهای پیکربندی زیر تنظیم کنید:
پیکربندی پایگاهداده پشتیبان
دستور git-cvsserver از ماژول DBI در پرل استفاده میکند. لطفاً در صورت تغییر این متغیرها مستندات آن را نیز بخوانید، بهویژه در مورد DBI->connect().
gitcvs.dbName
gitcvs.dbDriver
gitcvs.dbuser
gitcvs.dbPass
gitcvs.dbTableNamePrefix
تمام متغیرها میتوانند بر اساس هر روش دسترسی نیز تنظیم شوند، بالا را ببینید.
جایگزینی
متغیرها
در dbDriver و dbUser میتوانید از متغیرهای زیر استفاده کنید:
%G
%g
%m
%a
%u
محیط (ENVIRONMENT)
این متغیرها در برخی شرایط نیاز به گزینههای خط فرمان را برطرف میکنند و استفادهٔ محدودشدهٔ آسانتر را از طریق git-shell ممکن میسازند.
GIT_CVSSERVER_BASE_PATH
GIT_CVSSERVER_ROOT
هنگامی که این متغیرهای محیطی تنظیم شده باشند، آرگومانهای خط فرمان متناظر آنها نباید استفاده شوند.
نکات کلاینت CVS در اکلیپس (ECLIPSE CVS CLIENT NOTES)
برای انجام یک دریافت (checkout) با کلاینت CVS اکلیپس:
نکات پروتکل: اگر از دسترسی ناشناس از طریق pserver استفاده میکنید، همان را انتخاب نمایید. کسانی که از دسترسی SSH استفاده میکنند باید پروتکل ext را انتخاب کرده و دسترسی ext را در بخش Preferences→Team→CVS→ExtConnection پیکربندی کنند. مقدار CVS_SERVER را روی "git cvsserver" تنظیم کنید. توجه داشته باشید که هنگام استفاده از ext، پشتیبانی از گذرواژه مناسب نیست؛ قطعاً میخواهید کلیدهای SSH را راهاندازی کرده باشید.
همچنین میتوانید از پروتکل غیر استاندارد extssh که اکلیپس ارائه میدهد استفاده کنید. در این حالت CVS_SERVER نادیده گرفته میشود و باید ابزار cvs را روی سرور با git-cvsserver جایگزین کنید یا .bashrc خود را طوری تغییر دهید که اجرای cvs عملاً git-cvsserver را فراخوانی کند.
کلاینتهای سازگار و آزمایششده (CLIENTS KNOWN TO WORK)
عملیاتهای پشتیبانیشده (OPERATIONS SUPPORTED)
تمام عملیاتهای مورد نیاز برای استفادهٔ عادی پشتیبانی میشوند، از جمله checkout، diff، status، update، log، add، remove و commit.
بیشتر آرگومانهای دستور CVS که برچسبها یا شمارههای بازنگری CVS را میخوانند (معمولاً -r) کار میکنند، و همچنین از هر refspec گیت (برچسب، شاخه، شناسهٔ کامیت و غیره) پشتیبانی مینمایند. با این حال، شمارههای بازنگری CVS برای شاخههای غیرپیشفرض به خوبی شبیهسازی نمیشوند و دستور cvs log برچسبها یا شاخهها را اصلاً نمایش نمیدهد. (شمارههای بازنگری CVS برای شاخههای غیر اصلی ظاهراً شبیه شمارههای بازنگری CVS هستند، اما در واقع مستقیماً یک شناسهٔ کامیت گیت را کدگذاری میکنند، نه اینکه نشاندهندهٔ تعداد بازنگریها از زمان انشعاب شاخه باشند.)
توجه داشته باشید که دو راه برای checkout کردن یک شاخهٔ خاص وجود دارد. همانطور که در بخشهای دیگر این صفحه شرح داده شده است، پارامتر "module" در دستور cvs checkout به عنوان نام شاخه تفسیر میشود و به شاخهٔ اصلی تبدیل میگردد. این شاخه حتی اگر موقتاً با دستور cvs update -r شاخهٔ دیگری را پایدار (sticky) کنید، همچنان شاخهٔ اصلی برای یک سندباکس مشخص باقی میماند. بهعلاوه، آرگومان -r میتواند شاخهٔ دیگری را برای دریافت واقعی مشخص کند، حتی اگر ماژول همچنان شاخهٔ "اصلی" باشد. مقایسه و توازن (طبق پیادهسازی فعلی): هر "ماژول" جدید یک پایگاهدادهٔ جدید روی دیسک با تاریخچهٔ ماژول مشخصشده ایجاد میکند، و پس از ایجاد پایگاهداده، عملیاتها بر روی آن شاخهٔ اصلی سریع خواهند بود. در مقابل، گزینهٔ -r هیچ فضای دیسک اضافهای اشغال نمیکند، اما ممکن است برای بسیاری از عملیاتها مانند cvs update به میزان قابل توجهی کندتر باشد.
اگر میخواهید به یک refspec گیت ارجاع دهید که شامل نویسههای غیرمجاز در CVS است، دو گزینه پیش رو دارید. نخست اینکه شاید ارائهٔ مستقیم refspec گیت به آرگومان مناسب -r در CVS مستقیماً کار کند؛ زیرا به نظر میرسد برخی کلاینتهای CVS بررسی دقیقی روی آرگومان انجام نمیدهند. دوم، در صورت عدم موفقیت، میتوانید از یک سازوکار فرار (escape) نویسههای خاص استفاده کنید که تنها از نویسههای معتبر در برچسبهای CVS بهره میبرد. توالیای متشکل از ۴ یا ۵ نویسه به قالب (زیرخط ("_")، خط تیره ("-")، یک یا دو نویسه، و خط تیره ("-")) میتواند بر اساس آن یک یا دو حرف، نویسههای مختلفی را کدگذاری کند: "s" برای اسلش ("/")، "p" برای نقطه (".")، "u" برای زیرخط ("_")، یا دو رقم هگزادسیمال برای هر مقدار بایت دیگر (معمولاً یک عدد اسکی، یا بخشی از یک نویسه با کدگذاری UTF-8).
عملیاتهای پایش قدیمی (مانند edit، watch و موارد مرتبط) پشتیبانی نمیشوند. استخراج (Export) و برچسبگذاری (برچسبها و شاخهها) در این مرحله پشتیبانی نمیشوند.
تبدیل انتهای خط CRLF
بهطور پیشفرض سرور حالت -k را برای همهٔ فایلها خالی میگذارد، که باعث میشود کلاینت CVS با آنها مانند فایلهای متنی رفتار کند که در برخی پلتفرمها مشمول تبدیل انتهای خط میشوند.
میتوانید با تنظیم متغیر پیکربندی gitcvs.usecrlfattr کاری کنید که سرور از مشخصههای تبدیل انتهای خط برای تنظیم حالتهای -k فایلها استفاده کند. برای اطلاعات بیشتر در مورد تبدیل انتهای خط، gitattributes(5) را ببینید.
همچنین اگر پیکربندی gitcvs.usecrlfattr فعال نباشد یا مشخصهها اجازهٔ تشخیص خودکار برای یک نام فایل را ندهند، سرور از پیکربندی gitcvs.allBinary برای تنظیمات پیشفرض استفاده میکند. اگر gitcvs.allBinary تنظیم شده باشد، فایلهایی که وضعیت دیگری برای آنها مشخص نشده به حالت -kb پیشفرض خواهند شد. در غیر این صورت حالت -k خالی گذاشته میشود. اما اگر gitcvs.allBinary روی "guess" تنظیم شده باشد، حالت صحیح -k بر اساس محتوای فایل حدس زده میشود.
برای بیشترین سازگاری با cvs، احتمالاً بهترین کار این است که پیشفرضها را با تنظیم gitcvs.usecrlfattr روی true و gitcvs.allBinary روی "guess" بازنویسی کنید.
وابستگیها (DEPENDENCIES)
دستور git-cvsserver به DBD::SQLite وابسته است.
همچنین ببینید (SEE ALSO)
git(1), git-daemon(1), gitattributes(5), gitcvs-migration(7)
گیت (GIT)
بخشی از مجموعهٔ git(1)
| 2026-06-29 | Git 2.55.0 |