GIT-SVN(1) Git Manual GIT-SVN(1)

git-svn - پل ارتباطی دومنظوره میان مخازن ساب‌ورژن و گیت

git svn <command> [<options>] [<arguments>]

ابزار git svn مجرایی ساده برای انتقال مجموعه‌تغییرات (changesetها) میان ساب‌ورژن و گیت است. این ابزار جریانی دوطرفه از تغییرات را میان یک مخزن ساب‌ورژن و یک مخزن گیت فراهم می‌کند.

git svn می‌تواند با استفاده از گزینه --stdlayout یک مخزن استاندارد ساب‌ورژن را که از ساختار رایج "trunk/branches/tags" پیروی می‌کند، ردگیری کند. همچنین با استفاده از گزینه‌های -T/-t/-b می‌تواند شاخه‌ها و برچسب‌ها را در هر ساختار و چیدمانی دنبال کند (گزینه‌های زیر برای init و همچنین دستور clone را ببینید).

پس از ردگیری یک مخزن ساب‌ورژن (با هر یک از روش‌های فوق)، می‌توان مخزن گیت را با استفاده از دستور fetch از ساب‌ورژن به‌روزرسانی کرد و ساب‌ورژن را نیز با استفاده از دستور dcommit از طریق گیت به‌روز نمود.

init

یک مخزن خالی گیت را به همراه دایرکتوری‌های فراداده (متادیتا) اضافی برای git svn مقداردهی اولیه می‌کند. نشانی وب (URL) ساب‌ورژن می‌تواند به عنوان یک آرگومان خط فرمان، یا به عنوان آرگومان‌های کامل URL برای گزینه‌های -T/-t/-b مشخص شود. به صورت اختیاری، دایرکتوری مقصد برای انجام عملیات می‌تواند به عنوان آرگومان دوم تعیین گردد. این دستور به طور معمول دایرکتوری جاری را مقداردهی اولیه می‌کند.

-T<trunk-subdir>, --trunk=<trunk-subdir>, -t<tags-subdir>, --tags=<tags-subdir>, -b<branches-subdir>, --branches=<branches-subdir>, -s, --stdlayout

این‌ها گزینه‌های اختیاری خط فرمان برای init هستند. هر یک از این گزینه‌ها می‌توانند به یک مسیر نسبی در مخزن (--tags=project/tags) یا یک URL کامل (--tags=https://foo.org/project/tags) اشاره کنند. در صورتی که مخزن ساب‌ورژن شما برچسب‌ها یا شاخه‌ها را در چندین مسیر قرار داده باشد، می‌توانید بیش از یک گزینه --tags و/یا --branches را مشخص کنید. گزینه --stdlayout روشی کوتاه برای تنظیم trunk، tags و branches به عنوان مسیرهای نسبی است که حالت پیش‌فرض ساب‌ورژن می‌باشد. اگر هر یک از گزینه‌های دیگر نیز همراه با آن داده شوند، اولویت با آن‌ها خواهد بود.

--no-metadata

گزینه noMetadata را در پیکربندی [svn-remote] تنظیم می‌کند. استفاده از این گزینه توصیه نمی‌شود؛ لطفاً پیش از استفاده از این گزینه، بخش svn.noMetadata در این صفحه راهنما را مطالعه کنید.

--use-svm-props

گزینه useSvmProps را در پیکربندی [svn-remote] تنظیم می‌کند.

--use-svnsync-props

گزینه useSvnsyncProps را در پیکربندی [svn-remote] تنظیم می‌کند.

--rewrite-root=<URL>

گزینه rewriteRoot را در پیکربندی [svn-remote] تنظیم می‌کند.

--rewrite-uuid=<UUID>

گزینه rewriteUUID را در پیکربندی [svn-remote] تنظیم می‌کند.

--username=<user>

نام کاربری را برای پروتکل‌های انتقالی که احراز هویت آن‌ها توسط SVN مدیریت می‌شود (مانند http، https و svn ساده) مشخص می‌کند. برای سایر پروتکل‌های انتقال (مانند svn+ssh://)، باید نام کاربری را در خود URL بگنجانید، مانند: svn+ssh://foo@svn.bar.com/project

--prefix=<prefix>

این گزینه امکان تعیین یک پیشوند را فراهم می‌کند که در صورت مشخص شدن trunk/branches/tags به ابتدای نام‌های ریموت افزوده می‌شود. این پیشوند به طور خودکار شامل یک اسلش پایانی نیست، بنابراین اگر چنین چیزی می‌خواهید، حتماً آن را در آرگومان بگنجانید. اگر --branches/-b مشخص شده باشد، پیشوند الزاماً باید شامل اسلش پایانی باشد. در هر صورت، تنظیم یک پیشوند (همراه با اسلش پایانی) اکیداً توصیه می‌شود، زیرا در این صورت ارجاعات ردگیری SVN شما در "refs/remotes/$prefix/*" قرار خواهند گرفت که با ساختار ارجاعات ردگیری ریموت خود گیت (refs/remotes/$remote/*) سازگار است. تنظیم پیشوند همچنین در صورتی که بخواهید چندین پروژه را که در یک مخزن مشترک قرار دارند ردگیری کنید، مفید است. این پیشوند به صورت پیش‌فرض روی origin/ تنظیم شده است.

نکته
پیش از نگارش ۲.۰ گیت، پیشوند پیش‌فرض "" (بدون پیشوند) بود. این بدان معنا بود که ارجاعات ردگیری SVN در "refs/remotes/*" قرار می‌گرفتند که با نحوه سازمان‌دهی ارجاعات ردگیری ریموت در خود گیت ناسازگار بود. اگر همچنان همان پیش‌فرض قدیمی را می‌خواهید، می‌توانید با پاس دادن --prefix "" در خط فرمان به آن برسید (اگر Getopt::Long پرل شما نسخه‌ای کمتر از ۲.۳۷ باشد ممکن است --prefix="" کار نکند).

--ignore-refs=<regex>

هنگامی که این عبارت باقاعده (regex) به init یا clone پاس داده شود، به عنوان یک کلید پیکربندی ذخیره خواهد شد. برای توضیحات مربوط به --ignore-refs دستور fetch را ببینید.

--ignore-paths=<regex>

هنگامی که این عبارت باقاعده به init یا clone پاس داده شود، به عنوان یک کلید پیکربندی ذخیره خواهد شد. برای توضیحات مربوط به --ignore-paths دستور fetch را ببینید.

--include-paths=<regex>

هنگامی که این عبارت باقاعده به init یا clone پاس داده شود، به عنوان یک کلید پیکربندی ذخیره خواهد شد. برای توضیحات مربوط به --include-paths دستور fetch را ببینید.

--no-minimize-url

هنگام ردگیری چندین دایرکتوری (با استفاده از گزینه‌های --stdlayout، --branches یا --tags)، ابزار git svn تلاش می‌کند تا به ریشه (یا بالاترین سطح مجاز) مخزن ساب‌ورژن متصل شود. این رفتار پیش‌فرض باعث می‌شود در صورت جابجایی کل پروژه‌ها در یک مخزن، تاریخچه به شکل بهتری دنبال شود، اما ممکن است در مخازنی که محدودیت‌های دسترسی خواندن دارند مشکلاتی ایجاد کند. ارسال گزینه --no-minimize-url به git svn اجازه می‌دهد تا URLها را همان‌طور که هستند و بدون تلاش برای اتصال به دایرکتوری سطح بالاتر بپذیرد. این گزینه زمانی که فقط یک URL/شاخه ردگیری می‌شود به طور پیش‌فرض غیرفعال است (چرا که فایده چندانی ندارد).

fetch

واکشی بازبینی‌های واکشی‌نشده از ریموت Subversion تحت ردیابی. نام بخش [svn-remote "..."] در فایل $GIT_DIR/config می‌تواند به عنوان یک آرگومان اختیاری در خط فرمان مشخص شود.

این دستور در صورت نیاز به طور خودکار rev_map را به‌روزرسانی می‌کند (برای جزئیات بیشتر به $GIT_DIR/svn/**/.rev_map.* در بخش FILES در ادامه مراجعه کنید).

--localtime

زمان کامیت‌های Git را به‌جای UTC در منطقه زمانی محلی ذخیره می‌کند. این کار باعث می‌شود git log (حتی بدون --date=local) همان زمان‌هایی را نشان دهد که svn log در منطقه زمانی محلی نشان می‌دهد.

این گزینه تداخلی در تعامل با مخزن Subversion که از آن کلون گرفته‌اید ایجاد نمی‌کند، اما اگر می‌خواهید مخزن محلی Git شما بتواند با مخزن محلی Git شخص دیگری تعامل داشته باشد، یا نباید از این گزینه استفاده کنید یا باید هر دو نفر در یک منطقه زمانی محلی یکسان از آن استفاده نمایید.

--parent

واکشی تنها از والد SVN مربوط به HEAD فعلی.

--ignore-refs=<regex>

نادیده‌گرفتن ارجاع‌ها (refها) برای شاخه‌ها یا برچسب‌هایی که با عبارت باقاعده Perl مطابقت دارند. یک «ادعای پیش‌نگری منفی» (negative look-ahead assertion) مانند ^refs/remotes/origin/(?!tags/wanted-tag|wanted-branch).*$ می‌تواند برای مجاز کردن تنها refهای خاصی استفاده شود.
config key: svn-remote.<name>.ignore-refs

اگر کلید پیکربندی ignore-refs تنظیم شده باشد و گزینه خط فرمان نیز داده شود، هر دو عبارت باقاعده استفاده خواهند شد.

--ignore-paths=<regex>

این گزینه امکان تعیین یک عبارت باقاعده Perl را فراهم می‌کند که باعث نادیده گرفتن و رد شدن از تمامی مسیرهای منطبق هنگام دریافت (checkout) از SVN می‌شود. گزینه --ignore-paths باید با هر fetch (شامل واکشی‌های خودکار ناشی از clone، dcommit، rebase و غیره) در یک مخزن معین مطابقت داشته باشد.
config key: svn-remote.<name>.ignore-paths

اگر کلید پیکربندی ignore-paths تنظیم شده باشد و گزینه خط فرمان نیز داده شود، هر دو عبارت باقاعده استفاده خواهند شد.

مثال‌ها:

نادیده‌گرفتن دایرکتوری "doc*" برای هر واکشی

--ignore-paths="^doc"

نادیده‌گرفتن "branches" و "tags" در دایرکتوری‌های سطح اول

--ignore-paths="^[^/]+/(?:branches|tags)"

--include-paths=<regex>

این گزینه امکان تعیین یک عبارت باقاعده Perl را فراهم می‌کند که باعث می‌شود هنگام دریافت (checkout) از SVN فقط مسیرهای منطبق گنجانده شوند. گزینه --include-paths باید با هر fetch (شامل واکشی‌های خودکار ناشی از clone، dcommit، rebase و غیره) در یک مخزن معین مطابقت داشته باشد. --ignore-paths بر --include-paths اولویت دارد.
config key: svn-remote.<name>.include-paths

--log-window-size=<n>

هنگام پیمایش تاریخچه Subversion، به ازای هر درخواست <n> مدخل لاگ را واکشی می‌کند. مقدار پیش‌فرض 100 است. برای مخازن بسیار بزرگ Subversion، ممکن است مقادیر بزرگ‌تری نیاز باشد تا clone/fetch در زمانی معقول به پایان برسد. اما مقادیر بیش از حد بزرگ ممکن است منجر به مصرف بیشتر حافظه و اتمام مهلت درخواست (timeout) شود.

clone

دستورات init و fetch را اجرا می‌کند. این دستور به طور خودکار دایرکتوری‌ای را بر اساس نام پایه (basename) نشانی URL ارسال‌شده به آن ایجاد می‌کند؛ یا در صورتی که آرگومان دومی ارسال شود، یک دایرکتوری ایجاد کرده و درون آن کار خواهد کرد. این دستور تمام آرگومان‌هایی را که دستورات init و fetch می‌پذیرند قبول می‌کند؛ به استثنای --fetch-all و --parent. پس از این‌که یک مخزن کلون شد، دستور fetch قادر خواهد بود بدون تأثیر بر درخت کاری (working tree)، بازبینی‌ها را به‌روزرسانی کند؛ و دستور rebase قادر خواهد بود درخت کاری را با آخرین تغییرات به‌روز کند.

--preserve-empty-dirs

برای هر دایرکتوری خالی که از Subversion واکشی می‌شود، یک فایل نگه‌دارنده مکان (placeholder) در مخزن محلی Git ایجاد می‌کند. این شامل دایرکتوری‌هایی نیز می‌شود که با حذف تمام ورودی‌ها در مخزن Subversion خالی شده‌اند (اما خود دایرکتوری حذف نشده است). فایل‌های نگه‌دارنده مکان نیز ردیابی شده و در صورت عدم نیاز حذف خواهند شد.

--placeholder-filename=<filename>

نام فایل‌های نگه‌دارنده مکان که توسط --preserve-empty-dirs ایجاد می‌شوند را تنظیم می‌کند. پیش‌فرض: ".gitignore"

rebase

این دستور بازبینی‌ها را از والد SVN شاخص HEAD جاری واکشی کرده و تغییرات جاری (کامیت‌نشده در SVN) را بر مبنای آن بازسازی (rebase) می‌کند.

این دستور مشابه svn update یا git pull عمل می‌کند، با این تفاوت که جهت سهولت در اجرای dcommit با git svn، تاریخچه خطی را با git rebase به‌جای git merge حفظ می‌کند.

این دستور تمام گزینه‌هایی را که git svn fetch و git rebase می‌پذیرند قبول می‌کند. با این حال، --fetch-all تنها از [svn-remote] جاری واکشی می‌کند، نه از تمامی تعاریف [svn-remote].

مشابه git rebase؛ این دستور مستلزم آن است که درخت کاری تمیز باشد و هیچ تغییر کامیت‌نشده‌ای نداشته باشد.

این دستور در صورت نیاز به طور خودکار rev_map را به‌روزرسانی می‌کند (برای جزئیات بیشتر به $GIT_DIR/svn/**/.rev_map.* در بخش FILES در ادامه مراجعه کنید).

-l, --local

واکشی را از راه دور انجام نمی‌دهد؛ تنها git rebase را در برابر آخرین کامیت واکشی‌شده از SVN بالادست اجرا می‌کند.

dcommit

هر diff (تغییرات) را از شاخه جاری مستقیماً در مخزن SVN کامیت می‌کند و سپس عملیات rebase یا reset را انجام می‌دهد (بسته به اینکه آیا تفاوتی میان SVN و head وجود دارد یا خیر). این کار به ازای هر کامیت در Git، یک ویرایش (revision) در SVN ایجاد خواهد کرد.

هنگامی که نام اختیاری یک شاخه Git (یا نام یک شیء کامیت Git) به عنوان آرگومان مشخص شود، این زیردستور روی شاخه مشخص‌شده کار می‌کند، نه روی شاخه جاری.

استفاده از dcommit بر set-tree (در ادامه) ترجیح داده می‌شود.

--no-rebase

پس از کامیت کردن، عملیات rebase یا reset را انجام ندهید.

--commit-url <URL>

در این نشانی وب (URL) ساب‌ورژن (مسیر کامل) کامیت می‌کند. این گزینه برای این منظور در نظر گرفته شده است تا مخازن موجود git svn که با یک روش انتقال (مثلاً svn:// یا http:// برای خواندن ناشناس) ایجاد شده‌اند، در صورتی که کاربر بعداً به روش انتقال دیگری (مثلاً svn+ssh:// یا https://) برای کامیت کردن دسترسی پیدا کند، مجدداً قابل استفاده باشند.
config key: svn-remote.<name>.commiturl
config key: svn.commiturl (overwrites all svn-remote.<name>.commiturl options)

توجه داشته باشید که نشانی وب (URL) ساب‌ورژن در کلید پیکربندی commiturl شامل شاخه SVN نیز می‌شود. اگر ترجیح می‌دهید نشانی کامیت را برای کل یک مخزن SVN تنظیم کنید، به‌جای آن از svn-remote.<name>.pushurl استفاده نمایید.

استفاده از این گزینه برای هر هدف دیگری (نپرسید چرا) اکیداً منع شده است.

--mergeinfo=<mergeinfo>

اطلاعات ادغام (merge) ارائه‌شده را در طول dcommit اضافه می‌کند (برای نمونه --mergeinfo="/branches/foo:1-10"). همه نسخه‌های سرور svn می‌توانند این اطلاعات را (به صورت یک ویژگی یا property) ذخیره کنند، و کلاینت‌های svn از نسخه 1.5 به بعد می‌توانند از آن استفاده نمایند. برای مشخص کردن اطلاعات ادغام از چندین شاخه، از یک نویسه فاصله منفرد میان شاخه‌ها استفاده کنید (--mergeinfo="/branches/foo:1-10 /branches/bar:3,5-6,8").
config key: svn.pushmergeinfo

این گزینه باعث می‌شود git-svn تلاش کند در صورت امکان، ویژگی svn:mergeinfo را به‌طور خودکار در مخزن SVN مقداردهی نماید. در حال حاضر، این کار تنها هنگام dcommit کردن ادغام‌های غیر رو به جلو (non-fast-forward) که در آن‌ها همه والدین به جز والد اول قبلاً در SVN ارسال (push) شده‌اند، امکان‌پذیر است.

--interactive

از کاربر درخواست تأیید می‌کند که آیا مجموعه وصله (patch set) واقعاً باید به SVN ارسال شود یا خیر. برای هر وصله، می‌توان با "yes" (پذیرش این وصله)، "no" (صرف‌نظر از این وصله)، "all" (پذیرش همه وصله‌ها) یا "quit" پاسخ داد.

اگر پاسخ "no" یا "quit" باشد، git svn dcommit بدون کامیت کردن چیزی در SVN، بلافاصله خاتمه می‌یابد.

branch

یک شاخه در مخزن SVN ایجاد می‌کند.

-m, --message

امکان تعیین پیام کامیت را فراهم می‌سازد.

-t, --tag

با استفاده از tags_subdir به‌جای branches_subdir مشخص‌شده در هنگام git svn init، یک برچسب ایجاد می‌کند.

-d<path>, --destination=<path>

اگر بیش از یک گزینه --branches (یا --tags) به دستور init یا clone داده شده باشد، باید مکان شاخه (یا برچسبی) را که مایلید در مخزن SVN ایجاد شود ارائه دهید. شناسه <path> مشخص می‌کند که از کدام مسیر برای ایجاد شاخه یا برچسب استفاده شود و باید با الگوی سمت چپ یکی از refspecهای پیکربندی‌شده برای شاخه‌ها یا برچسب‌ها مطابقت داشته باشد. می‌توانید این refspecها را با دستورهای زیر مشاهده کنید:
git config --get-all svn-remote.<name>.branches
git config --get-all svn-remote.<name>.tags

که در آن <name> نام مخزن SVN است که توسط گزینه -R در دستور init مشخص شده است (یا به‌طور پیش‌فرض "svn").

--username

نام کاربری SVN را برای انجام کامیت تعیین می‌کند. این گزینه بر ویژگی پیکربندی username اولویت دارد.

--commit-url

از نشانی وب (URL) مشخص‌شده برای اتصال به مخزن مقصد ساب‌ورژن استفاده می‌کند. این گزینه در شرایطی کاربرد دارد که مخزن مبدأ SVN فقط‌خواندنی است. این گزینه بر ویژگی پیکربندی commiturl اولویت دارد.
git config --get-all svn-remote.<name>.commiturl

--parents

پوشه‌های والد را ایجاد می‌کند. این پارامتر معادل پارامتر --parents در دستورهای svn cp بوده و برای ساختارهای غیر استاندارد مخزن مفید است.

tag

یک برچسب در مخزن SVN ایجاد می‌کند. این دستور صورت خلاصه برای branch -t است.

log

این دستور باید یافتن پیام‌های تاریخچه svn (یا svn log) را هنگامی که کاربران svn به شماره‌های -r/--revision اشاره می‌کنند، آسان کند.

ویژگی‌های زیر از ‘svn log’ پشتیبانی می‌شوند:

-r <n>[:<n>], --revision=<n>[:<n>]

پشتیبانی می‌شود، آرگومان‌های غیرعددی پشتیبانی نمی‌شوند: HEAD، NEXT، BASE، PREV و غیره ...

-v, --verbose

کاملاً با خروجی --verbose در svn log سازگار نیست، اما به اندازه معقولی نزدیک است.

--limit=<n>

با --max-count یکسان نیست، کامیت‌های ادغام‌شده/مستثنی‌شده را به حساب نمی‌آورد

--incremental

پشتیبانی می‌شود

قابلیت‌های جدید:

--show-commit

شناسه sha1 کامیت Git را نیز نمایش می‌دهد

--oneline

نسخه ما از --pretty=oneline

نکته
خود SVN زمان‌ها را تنها بر حسب UTC و نه چیز دیگری ذخیره می‌کند. کلاینت استاندارد svn زمان UTC را به زمان محلی (یا بر اساس متغیر محیطی TZ=) تبدیل می‌کند. این دستور نیز رفتار مشابهی دارد.
هر آرگومان دیگری مستقیماً به git log منتقل می‌شود.

blame

نمایش می‌دهد که چه ویرایش (revision) و نویسنده‌ای آخرین بار هر خط از یک فایل را تغییر داده است. خروجی این حالت به‌طور پیش‌فرض از نظر قالب با خروجی ‘svn blame’ سازگار است. همانند دستور SVN blame، تغییرات محلی کامیت‌نشده در درخت کاری نادیده گرفته می‌شوند؛ نسخه‌ای از فایل که در ویرایش HEAD قرار دارد حاشیه‌نویسی (ردیابی) می‌شود. آرگومان‌های ناشناخته مستقیماً به git blame ارسال می‌شوند.

--git-format

خروجی را در همان قالب git blame، اما با شماره‌های ویرایش SVN به‌جای هَش‌های کامیت Git تولید می‌کند. در این حالت، تغییراتی که در SVN کامیت نشده‌اند (شامل ویرایش‌های محلی رونوشت کاری) به عنوان ویرایش 0 نمایش داده می‌شوند.

find-rev

هنگامی که یک شماره ویرایش SVN به فرم rN داده شود، هش کامیت Git متناظر را برمی‌گرداند (به‌صورت اختیاری می‌تواند با یک شیء شبه‌درخت (tree-ish) همراه باشد تا مشخص شود کدام شاخه باید جستجو شود). هنگامی که یک شیء شبه‌درخت داده شود، شماره ویرایش SVN متناظر را بازمی‌گرداند.

-B, --before

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

-A, --after

در صورت دریافت یک ویرایش SVN، تطابق دقیق را الزامی نمی‌داند؛ اگر تطابق دقیقی وجود نداشته باشد، نزدیک‌ترین مورد را با جستجو رو به جلو در تاریخچه بازمی‌گرداند.

set-tree

بهتر است در نظر داشته باشید که به‌جای این دستور از dcommit استفاده کنید. اشیاء کامیت یا درخت مشخص‌شده را در SVN کامیت می‌کند. این دستور به به‌روز بودن داده‌های واکشی‌شده (fetch) وارداتی شما متکی است. هنگام کامیت به SVN، این دستور مطلقاً هیچ تلاشی برای وصله‌زدن انجام نمی‌دهد؛ بلکه صرفاً فایل‌ها را با فایل‌های مشخص‌شده در درخت یا کامیت بازنویسی می‌کند. فرض بر این است که تمامی ادغام‌ها مستقل از توابع git svn انجام شده‌اند.

create-ignore

ویژگی‌های svn:ignore و svn:global-ignores را به‌صورت بازگشتی روی دایرکتوری‌ها پیدا کرده و فایل‌های .gitignore متناظر را ایجاد می‌کند. فایل‌های حاصل برای کامیت شدن مرحله‌بندی (stage) می‌شوند، اما کامیت نمی‌گردند. برای ارجاع به یک ویرایش خاص از -r/--revision استفاده کنید.

show-ignore

ویژگی‌های svn:ignore و svn:global-ignores را به‌صورت بازگشتی در دایرکتوری‌ها پیدا کرده و فهرست می‌کند. خروجی برای اضافه کردن به انتهای فایل $GIT_COMMON_DIR/info/exclude مناسب است.

mkdirs

بر اساس اطلاعات موجود در فایل‌های $GIT_DIR/svn/<refname>/unhandled.log تلاش می‌کند تا پوشه‌های خالی را که هسته گیت (core Git) قادر به ردیابی آن‌ها نیست بازسازی کند. پوشه‌های خالی هنگام استفاده از "git svn clone" و "git svn rebase" به‌طور خودکار بازسازی می‌شوند، بنابراین "mkdirs" برای استفاده پس از دستوراتی مانند "git checkout" یا "git reset" در نظر گرفته شده است. (برای اطلاعات بیشتر به گزینه فایل پیکربندی svn-remote.<name>.automkdirs مراجعه کنید.)

commit-diff

تفاوت (diff) میان دو آرگومان شبه‌درخت (tree-ish) را از خط فرمان کامیت می‌کند. این دستور به قرار داشتن درون مخزنی که با git svn init مقداردهی اولیه شده باشد وابسته نیست. این دستور سه آرگومان می‌گیرد: (الف) درخت اصلی برای مقایسه، (ب) نتیجه درخت جدید، (ج) آدرس اینترنتی (URL) مخزن هدف Subversion. اگر در یک مخزن سازگار با git svn کار می‌کنید (که با git svn مقداردهی اولیه شده باشد)، آرگومان پایانی (URL) می‌تواند حذف شود. گزینه -r<revision> برای این کار الزامی است.

پیام کامیت یا مستقیماً از طریق گزینه -m یا -F فراهم می‌شود، یا به‌صورت غیرمستقیم از برچسب یا کامیت هنگامی که شبه‌درخت دوم چنین شیئی را نشان می‌دهد، یا با فراخوانی یک ویرایشگر درخواست می‌شود (گزینه --edit در زیر را ببینید).

-m <msg>, --message=<msg>

از msg داده‌شده به عنوان پیام کامیت استفاده می‌کند. این گزینه، سوییچ --edit را غیرفعال می‌کند.

-F <filename>, --file=<filename>

پیام کامیت را از فایل داده‌شده می‌خواند. این گزینه، سوییچ --edit را غیرفعال می‌کند.

info

اطلاعاتی را درباره یک فایل یا دایرکتوری مشابه آنچه ‘svn info’ ارائه می‌دهد نمایش می‌دهد. در حال حاضر از آرگومان -r/--revision پشتیبانی نمی‌کند. برای خروجی دادن تنها مقدار فیلد URL: از گزینه --url استفاده کنید.

proplist

ویژگی‌های (properties) ذخیره‌شده در مخزن Subversion را درباره یک فایل یا دایرکتوری داده‌شده فهرست می‌کند. برای ارجاع به یک ویرایش خاص در Subversion از -r/--revision استفاده کنید.

propget

ویژگی Subversion داده‌شده به عنوان آرگومان اول را برای یک فایل دریافت می‌کند. یک ویرایش خاص را می‌توان با -r/--revision مشخص کرد.

propset

ویژگی Subversion داده‌شده به عنوان آرگومان اول را به مقدار داده‌شده در آرگومان دوم برای فایل ارائه‌شده به عنوان آرگومان سوم تنظیم می‌کند.

مثال:

git svn propset svn:keywords "FreeBSD=%H" devel/py-tipper/Makefile

این دستور ویژگی svn:keywords را برای فایل devel/py-tipper/Makefile برابر با FreeBSD=%H قرار می‌دهد.

show-externals

موارد خارجی (externals) در Subversion را نمایش می‌دهد. برای مشخص کردن یک ویرایش خاص از -r/--revision استفاده کنید.

gc

فایل‌های $GIT_DIR/svn/<refname>/unhandled.log را فشرده کرده و فایل‌های $GIT_DIR/svn/<refname>/index را حذف می‌کند.

reset

اثرات fetch را تا ویرایش مشخص‌شده به عقب بازمی‌گرداند. این به شما امکان می‌دهد تا یک ویرایش SVN را مجدداً fetch کنید. در حالت عادی، محتویات یک ویرایش SVN هرگز نباید تغییر کند و reset نباید ضروری باشد. با این حال، اگر مجوزهای دسترسی SVN تغییر کنند، یا اگر گزینه --ignore-paths را تغییر دهید، ممکن است یک fetch با خطای "not found in commit" (فایلی که قبلاً قابل مشاهده نبوده است) یا "checksum mismatch" (از دست رفتن یک تغییر) با شکست مواجه شود. اگر فایل مشکل‌ساز را نتوان برای همیشه نادیده گرفت (با --ignore-paths)، تنها راه برای اصلاح مخزن استفاده از reset است.

تنها rev_map و refs/remotes/git-svn تغییر می‌کنند (برای جزئیات بیشتر به $GIT_DIR/svn/**/.rev_map.* در بخش فایل‌ها (FILES) در ادامه مراجعه کنید). پس از reset یک fetch و سپس git reset یا git rebase را اجرا کنید تا شاخه‌های محلی به درخت جدید منتقل شوند.

-r <n>, --revision=<n>

تازه‌ترین ویرایشی را که باید نگه داشته شود مشخص می‌کند. تمامی ویرایش‌های بعد از آن دور ریخته می‌شوند.

-p, --parent

ویرایش مشخص‌شده را نیز دور می‌ریزد و در عوض نزدیک‌ترین والد آن را نگه می‌دارد.

مثال:

فرض کنید تغییرات محلی در شاخه "master" دارید، اما نیاز دارید "r2" را مجدداً واکشی کنید.
r1---r2---r3 remotes/git-svn
            \
             A---B master

مشکل ignore-paths یا مجوزهای دسترسی SVN را که از ابتدا باعث ناقص بودن "r2" شده بود برطرف کنید. سپس:

git svn reset -r2 -p
git svn fetch
r1---r2'--r3' remotes/git-svn
  \
   r2---r3---A---B master

سپس "master" را با git rebase اصلاح کنید. از git merge استفاده نکنید، در غیر این صورت تاریخچه شما با dcommit آینده سازگار نخواهد بود!

git rebase --onto remotes/git-svn A^ master
r1---r2'--r3' remotes/git-svn
            \
             A'--B' master

--shared[=(false|true|umask|group|all|world|everybody)], --template=<template-directory>

تنها با دستور init استفاده می‌شود. این گزینه‌ها مستقیماً به git init پاس داده می‌شوند.

-r <arg>, --revision <arg>

با دستور fetch استفاده می‌شود.

این گزینه پشتیبانی از بازه‌های ویرایش (revision ranges) را برای تاریخچه جزئی/کوتاه‌شده فراهم می‌کند. بازه‌های $NUMBER، $NUMBER1:$NUMBER2 (بازه‌های عددی)، $NUMBER:HEAD، و BASE:$NUMBER همگی پشتیبانی می‌شوند.

این گزینه به شما اجازه می‌دهد هنگام اجرای واکشی (fetch)، یک آینه (mirror) جزئی بسازید؛ اما عموماً توصیه نمی‌شود زیرا بخش‌هایی از تاریخچه نادیده گرفته شده و از دست خواهد رفت.

-, --stdin

تنها با دستور set-tree استفاده می‌شود.

فهرستی از کامیت‌ها را از ورودی استاندارد (stdin) می‌خواند و آن‌ها را به ترتیب معکوس کامیت می‌کند. از هر سطر تنها مقدار ابتدایی sha1 خوانده می‌شود، بنابراین می‌توان از خروجی git rev-list --pretty=oneline استفاده کرد.

--rmdir

تنها با دستورهای dcommit، set-tree و commit-diff استفاده می‌شود.

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

config key: svn.rmdir

-e, --edit

تنها با دستورهای dcommit، set-tree و commit-diff استفاده می‌شود.

پیام کامیت را پیش از کامیت کردن به SVN ویرایش می‌کند. این ویژگی برای اشیایی که کامیت هستند به صورت پیش‌فرض غیرفعال است و هنگام کامیت اشیاء درختی (tree objects) اجباراً فعال می‌شود.

config key: svn.edit

-l<num>, --find-copies-harder

تنها با دستورهای dcommit، set-tree و commit-diff استفاده می‌شود.

هر دوی آن‌ها مستقیماً به git diff-tree پاس داده می‌شوند؛ برای اطلاعات بیشتر git-diff-tree(1) را ببینید.

config key: svn.l
config key: svn.findcopiesharder

-A<filename>, --authors-file=<filename>

سینتکس آن با فایل مورد استفاده در git cvsimport سازگار است، اما یک نشانی ایمیل خالی را می‌توان با <> مشخص کرد:
loginname = Joe User <user@example.com>

اگر این گزینه مشخص شود و git svn با نام ثبت‌کننده‌ای در SVN برخورد کند که در authors-file وجود ندارد، git svn عملیات را لغو خواهد کرد. سپس کاربر باید مدخل مربوطه را اضافه کند. اجرای مجدد دستور قبلی git svn پس از تغییر authors-file باید عملیات را ادامه دهد.

config key: svn.authorsfile

--authors-prog=<filename>

اگر این گزینه مشخص شود، برای هر نام ثبت‌کننده در SVN که در فایل نویسندگان وجود ندارد، فایل داده‌شده با نام ثبت‌کننده به عنوان اولین آرگومان اجرا می‌شود. انتظار می‌رود این برنامه یک سطر واحد به صورت "Name <email>" یا "Name <>" برگرداند که با آن همانند مدخلی موجود در فایل نویسندگان رفتار خواهد شد.

به دلایل تاریخی، یک filename نسبی برای init و clone ابتدا نسبت به پوشه جاری جستجو می‌شود و برای fetch نسبت به ریشه درخت کاری جستجو می‌گردد. اگر filename پیدا نشود، همانند هر دستور دیگری در $PATH جستجو می‌شود.

config key: svn.authorsProg

-q, --quiet

میزان پرگویی دستور git svn را کاهش می‌دهد. با مشخص کردن دوباره آن، پرگویی حتی کمتر خواهد شد.

-m, --merge, -s<strategy>, --strategy=<strategy>, -p, --rebase-merges

این موارد تنها با دستورهای dcommit و rebase استفاده می‌شوند.

هنگام استفاده از dcommit، در صورتی که امکان استفاده از git reset وجود نداشته باشد، مستقیماً به git rebase پاس داده می‌شوند (توضیحات dcommit را ببینید).

-n, --dry-run

می‌توان از این گزینه به همراه دستورهای dcommit، rebase، branch و tag استفاده کرد.

برای dcommit، مجموعه آرگومان‌های Git را چاپ می‌کند که نشان می‌دهد کدام diffها در SVN کامیت خواهند شد.

برای rebase، شاخه محلی مرتبط با مخزن svn بالادستی متصل به شاخه جاری و نشانی URL مخزن svn که واکشی از آن انجام خواهد شد را نمایش می‌دهد.

برای branch و tag، نشانی‌های URL را که هنگام ایجاد شاخه یا برچسب جهت کپی کردن استفاده خواهند شد نمایش می‌دهد.

--use-log-author

هنگام دریافت کامیت‌های svn در Git (به عنوان بخشی از عملیات‌های fetch، rebase یا dcommit)، به دنبال نخستین سطر From: یا تریلر (دنباله) Signed-off-by در پیام لاگ می‌گردد و از آن به عنوان رشته نویسنده استفاده می‌کند.
config key: svn.useLogAuthor

--add-author-from

هنگام کامیت کردن از Git به svn (به عنوان بخشی از عملیات‌های set-tree یا dcommit)، اگر پیام لاگ فعلی از پیش دارای سطر From: یا تریلر Signed-off-by نباشد، یک سطر From: را بر اساس رشته نویسنده کامیت Git به انتهای آن اضافه می‌کند. اگر از این گزینه استفاده کنید، در ادامه --use-log-author رشته نویسنده معتبری را برای تمام کامیت‌ها استخراج خواهد کرد.
config key: svn.addAuthorFrom

-i<GIT_SVN_ID>, --id <GIT_SVN_ID>

این گزینه مقدار GIT_SVN_ID را تنظیم می‌کند (به جای استفاده از متغیر محیطی). این به کاربر اجازه می‌دهد نام مرجع پیش‌فرض (refname) را برای واکشی هنگام ردیابی یک نشانی URL منفرد بازنویسی کند. دستورهای log و dcommit دیگر به این سوییچ به‌عنوان یک آرگومان نیاز ندارند.

-R<remote-name>, --svn-remote <remote-name>

بخش [svn-remote "<remote-name>"] را برای استفاده مشخص می‌کند، این امر امکان ردیابی چندین مخزن SVN را فراهم می‌سازد. پیش‌فرض: "svn"

--follow-parent

این گزینه تنها زمانی کاربرد دارد که در حال ردیابی شاخه‌ها باشیم (با استفاده از یکی از گزینه‌های ساختار مخزن --trunk، --tags، --branches، --stdlayout). برای هر شاخه ردیابی‌شده، تلاش می‌کند مشخص کند ویرایش آن از کجا کپی شده است، و یک والد مناسب در اولین کامیت Git برای آن شاخه قرار دهد. این قابلیت به‌ویژه زمانی که پوشه‌ای جابه‌جاشده در مخزن را ردیابی می‌کنیم سودمند است. در صورت غیرفعال بودن این قابلیت، شاخه‌های ایجادشده توسط git svn همگی خطی خواهند بود و هیچ تاریخچه مشترکی نخواهند داشت؛ بدین معنی که هیچ اطلاعاتی درباره اینکه شاخه‌ها از کجا منشعب شده یا ادغام گردیده‌اند وجود نخواهد داشت. با این حال، دنبال کردن تاریخچه‌های طولانی یا پیچیده ممکن است زمان زیادی ببرد، بنابراین غیرفعال کردن این قابلیت می‌تواند فرآیند کلون کردن را تسریع بخشد. این قابلیت به‌طور پیش‌فرض فعال است؛ برای غیرفعال کردن آن از --no-follow-parent استفاده کنید.
config key: svn.followparent

svn.noMetadata, svn-remote.<name>.noMetadata

این خطوط git-svn-id: را در انتهای هر کامیت حذف می‌کند.

این گزینه فقط برای درون‌ریزی‌های یک‌باره قابل استفاده است زیرا git svn بدون متادیتا قادر به واکشی دوباره نخواهد بود. علاوه بر این، در صورت از دست رفتن فایل‌های $GIT_DIR/svn/**/.rev_map.* شما، git svn نمی‌تواند آن‌ها را دوباره بسازد.

دستور git svn log نیز روی مخازنی که از این گزینه استفاده می‌کنند کار نخواهد کرد. همچنین استفاده از این گزینه به دلایلی (امیدواریم) کاملاً مشخص، با گزینه useSvmProps تداخل دارد.

استفاده از این گزینه توصیه نمی‌شود زیرا پیگیری ارجاعات قدیمی به شماره ویرایش‌های SVN را در مستندات موجود، گزارش‌های اشکال و بایگانی‌ها دشوار می‌سازد. اگر قصد دارید در نهایت از SVN به Git مهاجرت کنید و از کنار گذاشتن تاریخچه SVN مطمئن هستید، در عوض استفاده از git-filter-repo[1] را در نظر بگیرید. همچنین filter-repo امکان قالب‌بندی مجدد متادیتا برای خوانایی بهتر و بازنویسی اطلاعات پدیدآورنده را برای کاربرانی که از "svn.authorsFile" استفاده نمی‌کنند، فراهم می‌کند.

svn.useSvmProps, svn-remote.<name>.useSvmProps

این گزینه به git svn اجازه می‌دهد تا نشانی‌های URL مخزن و UUIDها را از آینه‌های ایجادشده توسط SVN::Mirror (یا svk) برای متادیتا بازنگاشت کند.

اگر یک ویرایش SVN دارای ویژگی "svm:headrev" باشد، احتمالاً آن ویرایش توسط SVN::Mirror (که توسط SVK نیز به کار می‌رود) ایجاد شده است. این ویژگی حاوی یک شناسه یکتای مخزن (UUID) و یک شماره ویرایش است. ما می‌خواهیم چنین به نظر برسد که در حال آینه‌سازی نشانی URL اصلی هستیم، بنابراین یک تابع کمکی معرفی می‌شود که نشانی URL هویتی و UUID اصلی را بازمی‌گرداند و هنگام تولید متادیتا در پیام‌های کامیت از آن استفاده می‌کند.

svn.useSvnsyncProps, svn-remote.<name>.useSvnsyncprops

مشابه گزینه useSvmProps؛ این برای کاربران دستور svnsync(1) است که به همراه SVN نسخه 1.4.x و بالاتر توزیع شده است.

svn-remote.<name>.rewriteRoot

این به کاربران اجازه می‌دهد مخازن را از نشانی‌های URL جایگزین ایجاد کنند. برای مثال، یک مدیر سیستم می‌تواند git svn را به‌صورت محلی روی سرور اجرا کند (با دسترسی از طریق file://) اما بخواهد مخزن را با یک نشانی URL عمومی http:// یا svn:// در متادیتا توزیع کند تا کاربران آن نشانی URL عمومی را ببینند.

svn-remote.<name>.rewriteUUID

مشابه گزینه useSvmProps؛ این برای کاربرانی است که نیاز دارند UUID را به‌صورت دستی بازنگاشت کنند. این ممکن است در شرایطی که UUID اصلی نه از طریق useSvmProps و نه useSvnsyncProps در دسترس است، مفید باشد.

svn-remote.<name>.pushurl

مشابه remote.<name>.pushurl در Git، این کلید برای مواردی طراحی شده است که url از طریق یک پروتکل انتقال فقط‌خواندنی به یک مخزن SVN اشاره دارد، تا یک پروتکل جایگزین خواندن/نوشتن فراهم آورد. فرض بر این است که هر دو کلید به یک مخزن مشترک اشاره دارند. بر خلاف commiturl، کلید pushurl یک مسیر پایه است. اگر هر یک از commiturl یا pushurl قابل استفاده باشند، commiturl اولویت خواهد داشت.

svn.brokenSymlinkWorkaround

این گزینه بررسی‌های بالقوه سنگین را برای دور زدن پیوندهای نمادین خرابی که توسط کلاینت‌های معیوب در SVN ثبت شده‌اند، غیرفعال می‌کند. اگر یک مخزن SVN را با تعداد زیادی blob خالی که پیوند نمادین نیستند ردیابی می‌کنید، این گزینه را روی "false" تنظیم کنید. این گزینه در حین اجرای git svn نیز می‌تواند تغییر یابد و روی ویرایش بعدی که واکشی می‌شود اعمال شود. در صورت تنظیم نشدن، git svn این گزینه را "true" فرض می‌کند.

svn.pathnameencoding

این به git svn دستور می‌دهد تا نام مسیرها را به یک کدگذاری مشخص بازکدگذاری کند. این گزینه می‌تواند توسط کاربران ویندوز و کسانی که در محیط‌های غیر utf8 کار می‌کنند به کار رود تا از خرابی نام فایل‌های حاوی نویسه‌های غیر ASCII جلوگیری شود. کدگذاری‌های معتبر مواردی هستند که توسط ماژول Encode در پرل پشتیبانی می‌شوند.

svn-remote.<name>.automkdirs

به‌طور معمول، دستورهای "git svn clone" و "git svn rebase" تلاش می‌کنند پوشه‌های خالی موجود در مخزن Subversion را دوباره بسازند. اگر این گزینه روی "false" تنظیم شود، پوشه‌های خالی تنها در صورتی ایجاد می‌شوند که دستور "git svn mkdirs" به‌طور صریح اجرا گردد. در صورت تنظیم نشدن، git svn این گزینه را "true" فرض می‌کند.

از آنجا که گزینه‌های noMetadata، rewriteRoot، rewriteUUID، useSvnsyncProps و useSvmProps همگی بر متادیتای تولیدشده و استفاده‌شده توسط git svn اثر می‌گذارند؛ آن‌ها باید پیش از درون‌ریزی هرگونه تاریخچه در فایل پیکربندی تنظیم شوند و این تنظیمات پس از مشخص شدن هرگز نباید تغییر یابند.

علاوه بر این، در هر بخش svn-remote فقط از یکی از این گزینه‌ها می‌توان استفاده کرد زیرا آن‌ها بر خط متادیتای git-svn-id: اثر می‌گذارند، به استثنای rewriteRoot و rewriteUUID که می‌توانند با هم استفاده شوند.

ردیابی و مشارکت در تنه (trunk) پروژه‌ای که با Subversion مدیریت می‌شود (با نادیده گرفتن برچسب‌ها و شاخه‌ها):

# Clone a repo (like git clone):
        git svn clone http://svn.example.com/project/trunk
# Enter the newly cloned directory:
        cd trunk
# You should be on master branch, double-check with 'git branch'
        git branch
# Do some work and commit locally to Git:
        git commit ...
# Something is committed to SVN, rebase your local changes against the
# latest changes in SVN:
        git svn rebase
# Now commit your changes (that were committed previously using Git) to SVN,
# as well as automatically updating your working HEAD:
        git svn dcommit
# Append svn:ignore and svn:global-ignores settings to the default Git exclude file:
        git svn show-ignore >> .git/info/exclude

ردیابی و مشارکت در کل پروژه‌ای که با Subversion مدیریت می‌شود (همراه با یک تنه، برچسب‌ها و شاخه‌ها):

# Clone a repo with standard SVN directory layout (like git clone):
        git svn clone http://svn.example.com/project --stdlayout --prefix svn/
# Or, if the repo uses a non-standard directory layout:
        git svn clone http://svn.example.com/project -T tr -b branch -t tag --prefix svn/
# View all branches and tags you have cloned:
        git branch -r
# Create a new branch in SVN
        git svn branch waldo
# Reset your master to trunk (or any other branch, replacing 'trunk'
# with the appropriate name):
        git reset --hard svn/trunk
# You may only dcommit to one branch/tag/trunk at a time.  The usage
# of dcommit/rebase/show-ignore should be the same as above.

فرآیند اولیه git svn clone می‌تواند بسیار زمان‌بر باشد (به‌ویژه برای مخازن بزرگ Subversion). اگر چندین نفر (یا یک نفر با چندین دستگاه) بخواهند از git svn برای تعامل با همان مخزن Subversion استفاده کنند، می‌توانید کلون اولیه git svn clone را روی مخزنی در یک سرور انجام دهید و از هر نفر بخواهید آن مخزن را با git clone کلون کند:

# Do the initial import on a server
        ssh server "cd /pub && git svn clone http://svn.example.com/project [options...]"
# Clone locally - make sure the refs/remotes/ space matches the server
        mkdir project
        cd project
        git init
        git remote add origin server:/pub/project
        git config --replace-all remote.origin.fetch '+refs/remotes/*:refs/remotes/*'
        git fetch
# Prevent fetch/pull from remote Git server in the future,
# we only want to use git svn for future updates
        git config --remove-section remote.origin
# Create a local branch from one of the branches just fetched
        git checkout -b master FETCH_HEAD
# Initialize 'git svn' locally (be sure to use the same URL and
# --stdlayout/-T/-b/-t/--prefix options as were used on server)
        git svn init http://svn.example.com/project [options...]
# Pull the latest changes from Subversion
        git svn rebase

ترجیحاً برای همگام‌سازی کامیت‌های ادغام‌نشده با یک شاخه git svn، به جای git pull یا git merge از git svn rebase یا git rebase استفاده کنید. انجام این کار تاریخچه کامیت‌های ادغام‌نشده را نسبت به مخزن بالادست SVN به صورت خطی حفظ می‌کند و امکان استفاده از زیرفرمان ترجیحی git svn dcommit را برای ارسال مجدد کامیت‌های ادغام‌نشده به SVN فراهم می‌سازد.

در ابتدا، git svn توصیه می‌کرد توسعه‌دهندگان از شاخه git svn عملیات pull یا merge را انجام دهند. علت این امر آن بود که پدیدآورنده، دستور git svn set-tree B را برای کامیت کردن یک سرشاخه (head) منفرد، به نگارش git svn set-tree A..B جهت اعمال چندین کامیت ترجیح می‌داد. استفاده از git pull یا git merge همراه با git svn set-tree A..B هنگام کامیت در SVN باعث هموارسازی (flatten شدن) تاریخچه غیرخطی می‌شود و این موضوع می‌تواند به این بینجامد که کامیت‌های ادغام به طور غیرمنتظره‌ای کامیت‌های قبلی را در SVN معکوس و بی‌اثر کنند.

اگرچه git svn می‌تواند تاریخچه کپی‌ها (از جمله شاخه‌ها و برچسب‌ها) را برای مخازنی با ساختار استاندارد ردیابی کند، اما هنوز قادر نیست تاریخچه ادغام‌های انجام‌شده درون گیت را به کاربران بالادست در SVN منعکس کند. بنابراین به کاربران توصیه می‌شود برای تسهیل سازگاری با SVN، تاریخچه را درون گیت تا حد امکان خطی نگه دارند (بخش «هشدارها و نکات مهم» را در زیر ببینید).

اگر git svn برای واکشی شاخه‌ها پیکربندی شده باشد (و گزینه --follow-branches برقرار باشد)، گاهی برای یک شاخه SVN چندین شاخه گیت ایجاد می‌کند، که این شاخه‌های اضافی نام‌هایی به صورت branchname@nnn (که در آن nnn شماره بازبینی SVN است) خواهند داشت. این شاخه‌های اضافی زمانی ایجاد می‌شوند که git svn نتواند برای نخستین کامیت در یک شاخه SVN یک کامیت والد پیدا کند تا شاخه را به تاریخچه شاخه‌های دیگر متصل نماید.

به طور معمول، نخستین کامیت در یک شاخه SVN شامل یک عملیات کپی است. git svn این کامیت را می‌خواند تا شماره بازبینی SVN را که شاخه از آن ایجاد شده است به دست آورد. سپس تلاش می‌کند کامیت گیت متناظر با این بازبینی SVN را پیدا کرده و از آن به عنوان والد شاخه استفاده کند. با این حال، ممکن است کامیت گیت مناسبی برای ایفای نقش والد وجود نداشته باشد. این حالت از جمله زمانی رخ می‌دهد که شاخه SVN رونوشتی از بازبینی‌ای باشد که توسط git svn واکشی نشده است (برای نمونه به این دلیل که بازبینی قدیمی بوده و با --revision نادیده گرفته شده است)، یا در SVN دایرکتوری‌ای کپی شده باشد که توسط git svn ردیابی نمی‌شود (مانند شاخه‌ای که اصلاً ردیابی نمی‌شود، یا زیردایرکتوری‌ای از یک شاخه ردیابی‌شده). در چنین مواردی، git svn همچنان شاخه گیت را ایجاد خواهد کرد، اما به جای استفاده از یک کامیت گیت موجود به عنوان والد شاخه، تاریخچه SVN دایرکتوری‌ای را که شاخه از آن کپی شده می‌خواند و کامیت‌های گیت مناسب را می‌سازد. این وضعیت با پیام «Initializing parent: <branchname>» نشان داده می‌شود.

علاوه بر این، یک شاخه ویژه به نام <branchname>@<SVN-Revision> ایجاد می‌کند که در آن <SVN-Revision> شماره بازبینی SVN است که شاخه از روی آن کپی شده است. این شاخه به کامیت والد تازه‌ساخته‌شده شاخه اشاره خواهد کرد. اگر شاخه در SVN حذف شده و بعداً از نسخه متفاوتی دوباره ایجاد شود، چندین شاخه از این دست با کاراکتر @ وجود خواهد داشت.

توجه داشته باشید که این ممکن است به این معنا باشد که برای یک بازبینی منفرد در SVN، چندین کامیت گیت ایجاد می‌شود.

یک مثال: در یک مخزن SVN با ساختار استاندارد trunk/tags/branches، دایرکتوری trunk/sub در r.100 ایجاد می‌شود. در r.200، دایرکتوری trunk/sub با کپی شدن درون branches/ شاخه‌بندی می‌شود. سپس دستور git svn clone -s یک شاخه به نام sub ایجاد می‌کند. همچنین کامیت‌های گیت جدیدی برای r.100 تا r.199 می‌سازد و از آن‌ها به عنوان تاریخچه شاخه sub استفاده می‌کند. بدین ترتیب برای هر بازبینی از r.100 تا r.199 دو کامیت گیت وجود خواهد داشت (یکی حاوی trunk/ و دیگری حاوی trunk/sub/). در نهایت، شاخه‌ای به نام sub@200 ایجاد می‌کند که به کامیت والد جدید شاخه sub (یعنی کامیت مربوط به r.200 و trunk/sub/) اشاره دارد.

به منظور سادگی و تعامل‌پذیری با Subversion، توصیه می‌شود که همه کاربران git svn عملیات‌های clone، fetch و dcommit را مستقیماً از سرور SVN انجام دهند و از تمامی عملیات‌های git clone/pull/merge/push میان مخازن و شاخه‌های گیت پرهیز کنند. روش توصیه‌شده برای تبادل کد میان شاخه‌ها و کاربران گیت، استفاده از git format-patch و git am، یا صرفاً اجرای 'dcommit’ بر روی مخزن SVN است.

اجرای git merge یا git pull روی شاخه‌ای که قصد دارید از آن dcommit کنید توصیه «نمی‌شود»، زیرا کاربران Subversion نمی‌توانند هیچ‌یک از ادغام‌هایی را که انجام داده‌اید مشاهده کنند. افزون بر این، اگر از یک شاخه گیت که آینه‌ای از یک شاخه SVN است merge یا pull کنید، ممکن است dcommit تغییرات را به اشتباه روی شاخه دیگری کامیت کند.

اگر اقدام به ادغام می‌کنید، به این قاعده توجه داشته باشید: git svn dcommit تلاش خواهد کرد کامیت‌ها را بر روی کامیت SVN ذکرشده در خروجی دستور زیر ثبت کند:

git log --grep=^git-svn-id: --first-parent -1

بنابراین شما باید اطمینان حاصل کنید که تازه‌ترین کامیت شاخه‌ای که می‌خواهید به آن dcommit کنید، والد نخست (first parent) ادغام باشد. در غیر این صورت آشفتگی رخ خواهد داد، به‌ویژه اگر والد نخست یک کامیت قدیمی‌تر در همان شاخه SVN باشد.

دستور git clone شاخه‌های موجود در سلسله‌مراتب refs/remotes/ یا متادیتا و پیکربندی‌های git svn را کلون نمی‌کند. بنابراین مخازنی که با استفاده از git svn ایجاد و مدیریت می‌شوند، در صورتی که نیاز به کلون‌سازی داشته باشند، باید از rsync برای کلون کردن استفاده کنند.

از آنجا که dcommit در لایه درونی خود از rebase استفاده می‌کند، هر شاخه گیتی که پیش از اجرای dcommit دستور git push را روی آن اجرا کرده باشید، نیازمند بازنویسی اجباری (force) ارجاع موجود در مخزن دوردست خواهد بود. این کار عموماً یک شیوه نامناسب تلقی می‌شود؛ برای جزئیات به مستندات git-push(1) مراجعه کنید.

از گزینه --amend در دستور git-commit(1) روی تغییری که قبلاً آن را dcommit کرده‌اید استفاده نکنید. بازنویسی با --amend برای کامیت‌هایی که پیش‌تر برای سایر کاربران به یک مخزن دوردست push شده‌اند کاری نادرست به شمار می‌رود و dcommit در SVN نیز مشابه همان است.

هنگام کلون کردن یک مخزن SVN، اگر از هیچ‌یک از گزینه‌های تعیین ساختار مخزن (--trunk، --tags، --branches، --stdlayout) استفاده نشود، git svn clone یک مخزن گیت با تاریخچه‌ای کاملاً خطی ایجاد خواهد کرد که در آن شاخه‌ها و برچسب‌ها به صورت دایرکتوری‌های جداگانه در کپی کاری ظاهر می‌شوند. اگرچه این آسان‌ترین راه برای به دست آوردن رونوشتی از کل مخزن است، اما در پروژه‌هایی با شاخه‌های متعدد به ایجاد کپی کاری چندین برابر بزرگ‌تر از صرفاً شاخه trunk می‌انجامد. بنابراین برای پروژه‌هایی که از ساختار دایرکتوری استاندارد (trunk/branches/tags) استفاده می‌کنند، توصیه می‌شود کلون کردن با گزینه --stdlayout انجام پذیرد. اگر پروژه از ساختاری غیراستاندارد پیروی می‌کند، و/یا نیازی به شاخه‌ها و برچسب‌ها نیست، ساده‌ترین کار این است که تنها یک دایرکتوری (معمولاً trunk) بدون هیچ‌گونه گزینه ساختار مخزن کلون شود. اگر به کل تاریخچه به همراه شاخه‌ها و برچسب‌ها نیاز است، باید گزینه‌های --trunk / --branches / --tags به کار روند.

هنگام استفاده از چندین --branches یا --tags، ابزار git svn تداخل نام‌ها را به طور خودکار مدیریت نمی‌کند (به عنوان مثال، اگر دو شاخه از مسیرهای گوناگون نام یکسانی داشته باشند، یا اگر یک شاخه و یک برچسب دارای نام یکسان باشند). در این موارد، ابتدا از init برای راه‌اندازی مخزن گیت خود استفاده کنید و سپس پیش از نخستین fetch، فایل $GIT_DIR/config را ویرایش نمایید تا شاخه‌ها و برچسب‌ها با فضاهای نام (namespaces) متفاوتی مرتبط شوند. به عنوان مثال:

branches = stable/*:refs/remotes/svn/stable/*
branches = debug/*:refs/remotes/svn/debug/*

ابزار git svn اطلاعات پیکربندی [svn-remote] را در فایل $GIT_DIR/config مخزن ذخیره می‌کند. این بخش شبیه به بخش‌های [remote] در هسته گیت است، به جز اینکه کلیدهای fetch آرگومان‌های الگوی تطبیق (glob) را نمی‌پذیرند؛ بلکه در عوض توسط کلیدهای branches و tags مدیریت می‌شوند. از آنجا که برخی مخازن SVN به شیوه‌ای غیرمعمول با چندین پروژه پیکربندی شده‌اند، گسترش‌های glob مانند مواردی که در ادامه آمده مجاز هستند:

[svn-remote "project-a"]
        url = http://server.org/svn
        fetch = trunk/project-a:refs/remotes/project-a/trunk
        branches = branches/*/project-a:refs/remotes/project-a/branches/*
        branches = branches/release_*:refs/remotes/project-a/branches/release_*
        branches = branches/re*se:refs/remotes/project-a/branches/*
        tags = tags/*/project-a:refs/remotes/project-a/tags/*

به خاطر داشته باشید که نویسه عام * (ستاره) در ارجاع محلی (سمت راست :) باید راست‌ترین جزء مسیر باشد؛ با این حال نویسه عام دوردست می‌تواند در هر کجایی قرار گیرد تا زمانی که یک جزء مسیر مستقل باشد (که توسط / یا انتهای خط احاطه شده باشد). این نوع پیکربندی به صورت خودکار توسط init ایجاد نمی‌شود و باید به طور دستی با یک ویرایشگر متنی یا با استفاده از git config درج گردد.

همچنین توجه داشته باشید که در هر کلمه تنها یک ستاره مجاز است. برای مثال:

branches = branches/re*se:refs/remotes/project-a/branches/*

با شاخه‌های release، rese و re123se مطابقت خواهد داشت، در حالی که

branches = branches/re*s*e:refs/remotes/project-a/branches/*

باعث ایجاد خطا خواهد شد.

همچنین می‌توان زیرمجموعه‌ای از شاخه‌ها یا برچسب‌ها را با استفاده از فهرستی از نام‌های جداشده با کاما درون آکولاد واکشی کرد. به عنوان مثال:

[svn-remote "huge-project"]
        url = http://server.org/svn
        fetch = trunk/src:refs/remotes/trunk
        branches = branches/{red,green}/src:refs/remotes/project-a/branches/*
        tags = tags/{1.0,2.0}/src:refs/remotes/project-a/tags/*

استفاده از چندین کلید fetch، branches و tags پشتیبانی می‌شود:

[svn-remote "messy-repo"]
        url = http://server.org/svn
        fetch = trunk/project-a:refs/remotes/project-a/trunk
        fetch = branches/demos/june-project-a-demo:refs/remotes/project-a/demos/june-demo
        branches = branches/server/*:refs/remotes/project-a/branches/*
        branches = branches/demos/2011/*:refs/remotes/project-a/2011-demos/*
        tags = tags/server/*:refs/remotes/project-a/tags/*

ایجاد یک شاخه در چنین پیکربندی‌ای مستلزم رفع ابهام از این است که با بهره‌گیری از فلگ -d یا --destination از کدام مکان استفاده شود:

$ git svn branch -d branches/server release-2-3-0

توجه داشته باشید که git-svn بالاترین بازبینی‌ای را که یک شاخه یا برچسب در آن ظاهر شده است ردیابی می‌کند. اگر زیرمجموعه شاخه‌ها یا برچسب‌ها پس از واکشی تغییر یابد، آنگاه فایل $GIT_DIR/svn/.metadata باید به صورت دستی ویرایش شود تا branches-maxRev و/یا tags-maxRev در صورت لزوم حذف (یا بازنشانی) شوند.

$GIT_DIR/svn/**/.rev_map.*

نگاشت میان شماره‌های بازبینی Subversion و نام‌های کامیت Git. در مخزنی که گزینه noMetadata تنظیم نشده باشد، این نگاشت را می‌توان از خطوط git-svn-id: که در انتهای هر کامیت قرار دارند بازسازی کرد (برای جزئیات به بخش svn.noMetadata در بالا مراجعه کنید).

git svn fetch و git svn rebase در صورت مفقود بودن یا به‌روز نبودن rev_map، آن را به طور خودکار به‌روزرسانی می‌کنند. git svn reset به طور خودکار آن را به عقب بازمی‌گرداند.

ما تمامی ویژگی‌های SVN را به جز svn:executable نادیده می‌گیریم. هر ویژگی مدیریت‌نشده در فایل $GIT_DIR/svn/<refname>/unhandled.log ثبت می‌شود.

دایرکتوری‌های تغییرنام‌یافته و کپی‌شده توسط Git شناسایی نمی‌شوند و در نتیجه هنگام کامیت کردن در SVN ردیابی نخواهند شد. من برنامه‌ای برای افزودن پشتیبانی از این قابلیت ندارم، چرا که پیاده‌سازی آن برای تمامی حالت‌های مرزی (corner cases) ممکن بسیار دشوار و زمان‌بر است (خود گیت هم این کار را انجام نمی‌دهد). کامیت کردن فایل‌های تغییرنام‌یافته و کپی‌شده در صورتی که به اندازه کافی شبیه باشند تا Git بتواند آن‌ها را تشخیص دهد، به طور کامل پشتیبانی می‌شود.

در SVN این امکان وجود دارد (اگرچه توصیه نمی‌شود) که تغییرات روی یک برچسب کامیت شوند (زیرا یک برچسب صرفاً رونوشتی از یک دایرکتوری است و از نظر فنی با یک شاخه یکسان است). هنگام کلون کردن یک مخزن SVN، ابزار git svn نمی‌تواند پیش‌بینی کند که آیا چنین کمیتی روی یک برچسب در آینده رخ خواهد داد یا خیر. بنابراین محافظه‌کارانه عمل کرده و تمام برچسب‌های SVN را به عنوان شاخه وارد می‌کند و نام برچسب را با پیشوند tags/ قرار می‌دهد.

git-rebase(1)

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

1.
git-filter-repo
2026-06-29 Git 2.55.0