Skip to content

Commit 60a4f54

Browse files
authored
refactor(import-svn):
1 parent a3c1042 commit 60a4f54

File tree

1 file changed

+26
-63
lines changed

1 file changed

+26
-63
lines changed
Lines changed: 26 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,42 @@
1-
==== ساب‌ورژن
1+
==== Subversion (ساب‌ورژن)
22

33
(((Subversion)))
44
(((Importing, from Subversion)))
5-
اگر بخش قبلی را درباره استفاده از `git svn` خوانده‌اید، می‌توانید به راحتی از آن دستورالعمل‌ها برای
6-
`git svn clone` یک مخزن استفاده کنید؛ سپس، استفاده از سرور ساب‌ورژن را متوقف کرده، به یک سرور گیت
7-
جدید فشار دهید و شروع به استفاده از آن کنیدارائه داده است.
8-
اگر می‌خواهید تاریخچه را داشته باشید، می‌توانید این کار را به سرعت انجام دهید، همانطور که می‌توانید داده‌ها را
9-
از سرور ساب‌ورژن خارج کنید (که ممکن است مدتی طول بکشد).
10-
11-
با این حال، واردات کامل نیست؛ و از آنجا که این کار زمان زیادی می‌برد، بهتر است آن را به درستی انجام دهید.
12-
اولین مشکل اطلاعات نویسنده است.
13-
در ساب‌ورژن، هر شخصی که کامیت می‌کند، یک کاربر در سیستم دارد که در اطلاعات کامیت ثبت می‌شود.
14-
مثال‌های بخش قبلی نشان می‌دهند که `schacon` در برخی مکان‌ها، مانند خروجی `blame` و `git
15-
svn log` وجود دارد.
16-
اگر می‌خواهید این را به داده‌های نویسنده بهتری در گیت نگاشت کنید، به یک نگاشت از کاربران ساب‌ورژن به نویسندگان
17-
گیت نیاز دارید.
18-
یک فایل به نام `users.txt` ایجاد کنید که این نگاشت را به فرمت زیر داشته باشد:
5+
6+
اگر بخش قبلی در مورد استفاده از `git svn` را خوانده باشید، می‌توانید به راحتی از آن دستورالعمل‌ها برای `git svn clone` یک مخزن استفاده کنید؛ سپس از استفاده از سرور Subversion دست بردارید، به سرور جدید Git منتقل کنید و شروع به استفاده از آن کنید. اگر می‌خواهید تاریخچه را نیز حفظ کنید، می‌توانید به سرعت این کار را انجام دهید، به شرطی که داده‌ها را از سرور Subversion استخراج کنید (که ممکن است کمی زمان ببرد).
7+
8+
با این حال، واردات کامل نیست؛ و چون این فرآیند طولانی خواهد بود، بهتر است آن را به درستی انجام دهید. اولین مشکل اطلاعات نویسنده است. در Subversion، هر شخصی که commit می‌کند، یک کاربر در سیستم دارد که در اطلاعات commit ثبت می‌شود. نمونه‌های بخش قبلی schacon را در برخی مکان‌ها نشان می‌دهند، مانند خروجی blame و git svn log. اگر می‌خواهید این را به داده‌های نویسنده بهتری در Git نگاشت کنید، به یک نگاشت از کاربران Subversion به نویسندگان Git نیاز دارید. یک فایل به نام users.txt ایجاد کنید که این نگاشت را در فرمت زیر داشته باشد:
9+
1910

2011
[source]
2112
----
2213
schacon = Scott Chacon <[email protected]>
2314
selse = Someo Nelse <[email protected]>
2415
----
2516

26-
برای دریافت لیستی از نام‌های نویسنده‌ای که SVN استفاده می‌کند، می‌توانید این دستور را اجرا کنید:
17+
برای دریافت فهرستی از نام‌های نویسندگان که SVN استفاده می‌کند، می‌توانید دستور زیر را اجرا کنید:
2718

2819
[source,console]
2920
----
3021
$ svn log --xml --quiet | grep author | sort -u | \
3122
perl -pe 's/.*>(.*?)<.*/$1 = /'
3223
----
3324

34-
این خروجی لاگ را به فرمت XML تولید می‌کند، سپس فقط خطوطی که اطلاعات نویسنده را دارند نگه می‌دارد، تکراری‌ها را
35-
حذف می‌کند و تگ‌های XML را حذف می‌کند.
36-
بدیهی است که این فقط بر روی سیستمی که `grep`، `sort` و `perl` نصب شده کار
37-
می‌کند.
38-
سپس، آن خروجی را به فایل `users.txt` خود هدایت کنید تا بتوانید داده‌های معادل کاربر گیت را در کنار هر
39-
ورودی اضافه کنید.
25+
این دستور خروجی لاگ را در فرمت XML تولید می‌کند، سپس فقط خطوطی که اطلاعات نویسنده را دارند نگه می‌دارد، تکراری‌ها را حذف می‌کند و برچسب‌های XML را حذف می‌کند. مشخصاً این تنها روی سیستمی که `grep`، `sort` و `perl` نصب شده باشد کار می‌کند. سپس آن خروجی را به فایل `users.txt` هدایت کنید تا بتوانید داده‌های معادل نویسنده Git را در کنار هر ورودی اضافه کنید.
4026

4127
[NOTE]
4228
====
43-
اگر این کار را بر روی یک ماشین ویندوزی انجام می‌دهید، اینجا جایی است که با مشکل مواجه خواهید شد.
44-
مایکروسافت برخی نکات و نمونه‌های خوب را در https://docs.microsoft.com/en-us/azure/devops/repos/git/perform-migration-from-svn-to-git[].
29+
اگر این کار را روی یک سیستم ویندوزی امتحان می‌کنید، این نقطه‌ای است که ممکن است با مشکل مواجه شوید. مایکروسافت مشاوره‌ها و نمونه‌های خوبی را در آدرس https://docs.microsoft.com/en-us/azure/devops/repos/git/perform-migration-from-svn-to-git[] ارائه داده است.
4530
====
4631

47-
شما می‌توانید این فایل را به `git svn` ارائه دهید تا به آن کمک کند داده‌های نویسنده را به طور
48-
دقیق‌تری نگاشت کند.
49-
همچنین می‌توانید به `git svn` بگویید که متاداده‌ای که ساب‌ورژن معمولاً وارد می‌کند را شامل نشود، با
50-
عبور از `--no-metadata` به دستور `clone` یا `init`.
51-
متاداده شامل یک `git-svn-id` در هر پیام کامیت است که گیت در حین واردات تولید می‌کند.
52-
این می‌تواند لاگ گیت شما را بزرگ کند و ممکن است کمی نامشخص باشد.
32+
شما می‌توانید این فایل را به دستور `git svn` ارائه دهید تا به آن کمک کند اطلاعات نویسنده را دقیق‌تر نگاشت کند. همچنین می‌توانید به `git svn` بگویید که متاداده‌هایی که معمولاً توسط Subversion وارد می‌شود را شامل نکند، با استفاده از فلگ `--no-metadata` در دستور `clone` یا `init`. متاداده شامل یک `git-svn-id` در داخل هر پیغام commit است که Git در حین واردات تولید می‌کند. این می‌تواند لاگ Git شما را بزرگ کرده و ممکن است آن را کمی غیرقابل فهم کند.
5333

5434
[NOTE]
5535
====
56-
شما باید متاداده را نگه دارید زمانی که می‌خواهید کامیت‌های انجام شده در مخزن گیت را به مخزن اصلی
57-
ساب‌ورژن برگردانید.
58-
اگر نمی‌خواهید همگام‌سازی در لاگ کامیت شما باشد، می‌توانید پارامتر `--no-metadata` را حذف
59-
کنید.
36+
شما نیاز به نگهداری متاداده زمانی دارید که بخواهید commitهای انجام شده در مخزن Git را دوباره به مخزن اصلی SVN منتقل کنید. اگر نمی‌خواهید همگام‌سازی در لاگ commit شما ظاهر شود، می‌توانید از پارامتر `--no-metadata` صرف‌نظر کنید.
6037
====
6138

62-
این دستور `import` شما را به شکل زیر می‌کند:
39+
این دستور باعث می‌شود که دستور `import` شما به شکل زیر باشد:
6340

6441
[source,console]
6542
----
@@ -68,13 +45,12 @@ $ git svn clone http://my-project.googlecode.com/svn/ \
6845
$ cd my_project
6946
----
7047

71-
اکنون باید یک واردات ساب‌ورژن زیباتر در دایرکتوری `my_project` خود داشته باشید.
72-
به جای کامیت‌هایی که به این شکل به نظر می‌رسند
48+
حالا باید یک واردات بهتر از Subversion در دایرکتوری `my_project` خود داشته باشید. به جای commitهایی که به این شکل هستند
7349

7450
[source]
7551
----
7652
commit 37efa680e8473b615de980fa935944215428a35a
77-
Author: schacon <schacon@>
53+
Author: schacon <schacon@4c93b258-373f-11de-be05-5f7a86268029>
7854
Date: Sun May 3 00:12:22 2009 +0000
7955
8056
fixed install - go to trunk
@@ -83,7 +59,7 @@ Date: Sun May 3 00:12:22 2009 +0000
8359
be05-5f7a86268029
8460
----
8561

86-
آن‌ها به این شکل به نظر می‌رسند:
62+
آنها به این شکل هستند:
8763

8864
[source]
8965
----
@@ -94,68 +70,55 @@ Date: Sun May 3 00:12:22 2009 +0000
9470
fixed install - go to trunk
9571
----
9672

97-
نه تنها فیلد نویسنده به مراتب بهتر به نظر می‌رسد، بلکه `git-svn-id` نیز دیگر وجود ندارد.
73+
نه تنها فیلد Author خیلی بهتر به نظر می‌رسد، بلکه `git-svn-id` نیز دیگر وجود ندارد.
9874

99-
شما همچنین باید کمی تمیزکاری پس از واردات انجام دهید.
100-
برای یک چیز، باید ارجاعات عجیبی که `git svn` تنظیم کرده است را پاک کنید.
101-
اول، برچسب‌ها را به گونه‌ای منتقل کنید که برچسب‌های واقعی باشند نه شاخه‌های دور از نوع عجیب، و سپس بقیه شاخه‌ها
102-
را به شاخه‌های محلی منتقل کنید.
75+
همچنین باید کمی تمیزکاری پس از واردات انجام دهید. اولاً، باید ارجاعات عجیبی که `git svn` ایجاد کرده است را پاک کنید. ابتدا تگ‌ها را جابه‌جا خواهید کرد تا تگ‌های واقعی شوند نه شاخه‌های عجیب از راه دور، سپس باقی‌مانده شاخه‌ها را جابه‌جا خواهید کرد تا به شاخه‌های محلی تبدیل شوند.
10376

104-
برای انتقال برچسب‌ها به برچسب‌های واقعی گیت، این دستور را اجرا کنید:
77+
برای جابه‌جایی تگ‌ها به تگ‌های مناسب Git، دستور زیر را اجرا کنید:
10578

10679
[source,console]
10780
----
10881
$ for t in $(git for-each-ref --format='%(refname:short)' refs/remotes/tags); do git tag ${t/tags\//} $t && git branch -D -r $t; done
10982
----
11083

111-
این ارجاعات را که شاخه‌های دور بودند و با `refs/remotes/tags/` شروع می‌شدند، به برچسب‌های واقعی
112-
(سبک) تبدیل می‌کند.
84+
این دستور ارجاعات مربوط به شاخه‌های از راه دور که با `refs/remotes/tags/` شروع می‌شدند را گرفته و آن‌ها را به تگ‌های واقعی (سبک‌وزن) تبدیل می‌کند.
11385

114-
سپس، بقیه ارجاعات زیر `refs/remotes` را به شاخه‌های محلی منتقل کنید:
86+
سپس، باقی‌مانده ارجاعات زیر `refs/remotes` را به شاخه‌های محلی تبدیل کنید:
11587

11688
[source,console]
11789
----
11890
$ for b in $(git for-each-ref --format='%(refname:short)' refs/remotes); do git branch $b refs/remotes/$b && git branch -D -r $b; done
11991
----
12092

121-
ممکن است ببینید که برخی از شاخه‌های اضافی وجود دارند که با `@xxx` (که xxx یک عدد است) ختم می‌شوند،
122-
در حالی که در ساب‌ورژن فقط یک شاخه می‌بینید.
123-
این واقعاً یک ویژگی ساب‌ورژن به نام "peg-revisions" است که چیزی است که گیت به سادگی معادل نحوی ندارد.
124-
بنابراین، `git svn` به سادگی شماره نسخه svn را به نام شاخه اضافه می‌کند، درست به همان روشی که شما در
125-
svn می‌نویسید تا به peg-revision آن شاخه اشاره کنید.
126-
اگر دیگر به peg-revisions اهمیتی نمی‌دهید، به سادگی آن‌ها را حذف کنید:
93+
ممکن است با برخی شاخه‌های اضافی روبه‌رو شوید که با `@xxx` (که در آن xxx یک عدد است) پسوند خورده‌اند، در حالی که در Subversion فقط یک شاخه مشاهده می‌کنید. این در واقع یک ویژگی از Subversion به نام `peg-revisions` است، که چیزی است که Git هیچ معادل نحوی برای آن ندارد. بنابراین، `git svn` به سادگی شماره نسخه svn را به نام شاخه اضافه می‌کند، به همان روشی که شما در svn برای ارجاع به peg-revision آن شاخه نوشته‌اید. اگر دیگر به peg-revisions اهمیتی نمی‌دهید، به سادگی آن‌ها را حذف کنید:
12794

12895
[source,console]
12996
----
13097
$ for p in $(git for-each-ref --format='%(refname:short)' | grep @); do git branch -D $p; done
13198
----
13299

133-
اکنون تمام شاخه‌های قدیمی، شاخه‌های واقعی گیت هستند و تمام برچسب‌های قدیمی، برچسب‌های واقعی گیت هستند.
100+
حال همه شاخه‌های قدیمی به شاخه‌های واقعی Git تبدیل شده‌اند و تمام تگ‌های قدیمی به تگ‌های واقعی Git تبدیل شده‌اند.
134101

135-
یک چیز آخر برای تمیز کردن وجود دارد.
136-
متأسفانه، `git svn` یک شاخه اضافی به نام `trunk` ایجاد می‌کند که به شاخه پیش‌فرض ساب‌ورژن
137-
اشاره دارد، اما ارجاع `trunk` به همان مکان `master` اشاره می‌کند.
138-
از آنجا که `master` به طور ایدئولوژیک گیت است، اینجا چگونگی حذف شاخه اضافی است:
102+
یک چیز آخر برای تمیزکاری باقی‌مانده است. متاسفانه، `git svn` یک شاخه اضافی به نام `trunk` ایجاد می‌کند که به شاخه پیش‌فرض Subversion اشاره دارد، اما ارجاع trunk به همان مکانی اشاره می‌کند که `master` است. از آنجا که `master` به طور معمول در Git استفاده می‌شود، اینجا نحوه حذف شاخه اضافی آورده شده است:
139103

140104
[source,console]
141105
----
142106
$ git branch -d trunk
143107
----
144108

145-
آخرین کاری که باید انجام دهید این است که سرور گیت جدید خود را به عنوان یک ریموت اضافه کنید و به آن فشار دهید.
146-
در اینجا یک مثال از افزودن سرور خود به عنوان یک ریموت است:
109+
آخرین کاری که باید انجام دهید، اضافه کردن سرور جدید Git خود به عنوان یک remote و سپس push کردن به آن است. در اینجا یک مثال از اضافه کردن سرور خود به عنوان یک remote آورده شده است:
147110

148111
[source,console]
149112
----
150113
$ git remote add origin git@my-git-server:myrepository.git
151114
----
152115

153-
زیرا می‌خواهید تمام شاخه‌ها و برچسب‌های خود را بالا ببرید، اکنون می‌توانید این را اجرا کنید:
116+
چون می‌خواهید تمام شاخه‌ها و تگ‌های خود را ارسال کنید، اکنون می‌توانید دستور زیر را اجرا کنید:
154117

155118
[source,console]
156119
----
157120
$ git push origin --all
158121
$ git push origin --tags
159122
----
160123

161-
تمام شاخه‌ها و برچسب‌های شما باید در سرور گیت جدید شما در یک واردات زیبا و تمیز باشد.
124+
تمام شاخه‌ها و تگ‌های شما باید در سرور جدید Git شما در یک واردات تمیز و مرتب قرار داشته باشند.

0 commit comments

Comments
 (0)