این دستور git-subtree است که می تواند در ارائه دهنده میزبانی رایگان OnWorks با استفاده از یکی از چندین ایستگاه کاری آنلاین رایگان ما مانند Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا شود.
برنامه:
نام
git-subtree - زیردرخت ها را با هم ادغام کنید و مخزن را به زیر درختان تقسیم کنید
خلاصه
دستگاه گوارش زیر درخت اضافه کردن -P
دستگاه گوارش زیر درخت اضافه کردن -P
دستگاه گوارش زیر درخت کشیدن -P
دستگاه گوارش زیر درخت فشار -P
دستگاه گوارش زیر درخت ادغام -P
دستگاه گوارش زیر درخت تقسیم -P [گزینه ها] [ ]
شرح
زیردرختها به پروژههای فرعی اجازه میدهند تا در زیر شاخهای از پروژه اصلی گنجانده شوند.
به صورت اختیاری شامل کل تاریخچه پروژه فرعی است.
به عنوان مثال، می توانید کد منبع یک کتابخانه را به عنوان یک زیر شاخه خود قرار دهید
نرم افزار.
زیردرخت ها را نباید با زیر ماژول هایی که برای یک کار در نظر گرفته شده اند اشتباه گرفت. بر خلاف
زیر ماژول ها، زیردرخت ها به هیچ ساختار خاصی نیاز ندارند (مانند فایل های .gitmodule یا
gitlinks) در مخزن شما وجود داشته باشد، و کاربران نهایی مخزن شما را مجبور به
کار خاصی انجام دهید یا درک کنید که درختان فرعی چگونه کار می کنند. یک زیردرخت فقط یک زیر شاخه است
که می تواند به هر نحوی که شما می توانید به پروژه شما متعهد، شاخه و ادغام شود
خواستن.
همچنین نباید آنها را با استفاده از استراتژی ادغام زیردرخت اشتباه گرفت. اصلی
تفاوت این است که، علاوه بر ادغام پروژه دیگر به عنوان یک زیر شاخه، شما همچنین می توانید
کل تاریخچه یک زیر شاخه را از پروژه خود استخراج کنید و آن را به یک تبدیل کنید
پروژه مستقل بر خلاف استراتژی ادغام درخت فرعی، می توانید به طور متناوب به عقب و جلو بروید
بین این دو عملیات اگر کتابخانه مستقل به روز شود، می توانید
به طور خودکار تغییرات را در پروژه خود ادغام کنید. اگر کتابخانه داخل خود را به روز کنید
پروژه، میتوانید تغییرات را دوباره «تقسیم» کرده و دوباره در کتابخانه ادغام کنید
پروژه.
برای مثال، اگر کتابخانه ای که برای یک برنامه ساخته اید در جای دیگری مفید واقع شود، شما
می تواند کل تاریخچه خود را استخراج کند و آن را به عنوان مخزن git خودش منتشر کند، بدون آن
در هم آمیختن تصادفی تاریخچه پروژه برنامه شما.
نوک
به منظور تمیز نگه داشتن پیام های commit خود، توصیه می کنیم افراد پیام های خود را تقسیم کنند
بین زیر درختان و پروژه اصلی تا حد امکان متعهد می شود. یعنی اگر شما
تغییری ایجاد کنید که هم کتابخانه و هم برنامه اصلی را تحت تأثیر قرار دهد، آن را به دو صورت انجام دهید
قطعات. به این ترتیب، هنگامی که کتابخانه را بعداً متعهد میکنید، توضیحات آنها را تقسیم میکنید
همچنان معنا خواهد داشت اما اگر این برای شما مهم نیست، مهم نیست لازم. git
زیردرخت به سادگی بخشهای غیر مرتبط با کتابخانه commit را حذف میکند
بعداً آن را به زیر پروژه تقسیم می کند.
دستورات
اضافه کردن
ایجاد کنید درخت فرعی با وارد کردن محتویات آن از داده شده یا
و از راه دور . یک commit جدید به طور خودکار ایجاد می شود و به آن می پیوندد
سابقه پروژه وارد شده با خودتان. با --اسکواش، واردات فقط یک commit است
از پروژه فرعی، به جای کل تاریخ آن.
ادغام کردن
ادغام تغییرات اخیر تا به درون زیردرخت مثل حالت عادی دستگاه گوارش
ادغام کردن، این تغییرات محلی شما را حذف نمی کند. فقط آن تغییرات را با هم ادغام می کند
آخرین . با --اسکواش، تنها یک commit ایجاد می کند که شامل تمام موارد است
تغییرات، به جای ادغام در کل تاریخ.
در صورت استفاده از --اسکواش، جهت ادغام همیشه نباید رو به جلو باشد. تو می توانی
برای مثال، از این دستور برای بازگشت به گذشته از نسخه 2.5 به نسخه 2.4 استفاده کنید. اگر ادغام شما
یک درگیری را معرفی می کند، می توانید آن را به روش های معمول حل کنید.
کشیدن
دقیقا شبیه ادغام کردن، اما موارد مشابه دستگاه گوارش کشیدن به این صورت که ref داده شده را از
مخزن از راه دور مشخص شده
فشار
انجام می دهد انشعاب (به زیر مراجعه کنید) با استفاده از عرضه می شود و سپس یک دستگاه گوارش فشار فشار دادن
نتیجه به مخزن و رفر. از این می توان برای فشار دادن زیردرخت خود استفاده کرد
شاخه های مختلف مخزن راه دور
انشعاب
یک تاریخچه جدید و مصنوعی پروژه را از تاریخچه استخراج کنید زیردرخت در
تاریخچه جدید فقط شامل تعهدات (از جمله ادغام) است که تحت تأثیر قرار گرفته است ، و
هر یک از آن commit ها اکنون دارای محتویات هستند در ریشه پروژه
به جای در یک زیر شاخه بنابراین، تاریخ جدید ایجاد شده برای صادرات مناسب است
به عنوان یک مخزن git جداگانه.
پس از تقسیم موفقیت آمیز، یک شناسه commit در stdout چاپ می شود. این
مربوط به HEAD درخت تازه ایجاد شده است که می توانید آن را دستکاری کنید
شما می خواهی.
تقسیمهای مکرر دقیقاً یکسان تضمین شده است که یکسان هستند (یعنی
همان commit ID ها را تولید کنید). به همین دلیل، اگر commit های جدید اضافه کنید و سپس
تقسیم مجدد، commit های جدید به عنوان commit در بالای تاریخچه شما پیوست می شوند
تولید آخرین بار، بنابراین دستگاه گوارش ادغام کردن و دوستان همانطور که انتظار می رود کار خواهند کرد.
توجه داشته باشید که اگر استفاده می کنید --اسکواش وقتی ادغام میشوید، معمولاً نباید فقط -- دوباره ملحق شوید
وقتی جدا شدی
OPTIONS
-q، --آرام
پیام های خروجی غیر ضروری را در stderr سرکوب کنید.
-d، --debug
حتی پیام های خروجی غیر ضروری بیشتری را در stderr تولید کنید.
-پ ، --پیشوند=
مسیر زیردرختی را که می خواهید دستکاری کنید در مخزن مشخص کنید. این گزینه
برای همه دستورات اجباری است.
-m ، --پیام=
این گزینه فقط برای افزودن، ادغام و کشیدن (مطمئن نیست) معتبر است. مشخص كردن به عنوان
پیام commit برای commit ادغام.
OPTIONS برای اضافه کردن، ادغام، فشار دادن، کشیدن
--اسکواش
این گزینه فقط برای دستورات افزودن، ادغام و کشش معتبر است.
به جای ادغام کل تاریخ از پروژه زیردرخت، فقط یک تک تولید کنید
commit که شامل تمام تفاوت هایی است که می خواهید ادغام کنید و سپس آن جدید را ادغام کنید
به پروژه خود متعهد شوید
استفاده از این گزینه به کاهش شلوغی لاگ کمک می کند. مردم به ندرت می خواهند هر تغییری را ببینند
که بین نسخه 1.0 و 1.1 کتابخانه ای که آنها استفاده می کنند، اتفاق افتاده است، زیرا هیچ یک از این موارد
نسخه های موقت همیشه در برنامه آنها گنجانده شده است.
با استفاده از --اسکواش همچنین به جلوگیری از مشکلات زمانی که یک پروژه فرعی یکسان شامل چندگانه می شود کمک می کند
بار در همان پروژه، یا حذف شده و سپس دوباره اضافه می شود. در چنین حالتی اینطور نیست
به هر حال ترکیب تاریخ ها منطقی است، زیرا مشخص نیست کدام بخش از آن
تاریخ متعلق به کدام زیردرخت است.
علاوه بر این ، با --اسکواش، می توانید بین نسخه های مختلف به عقب و جلو بروید
از یک درخت فرعی، به جای اینکه کاملاً جلو باشد. دستگاه گوارش زیر درخت ادغام کردن --اسکواش همیشه تنظیم می کند
درخت فرعی برای مطابقت با commit دقیقاً مشخص شده، حتی اگر به آن commit برسد
نیاز به واگرد کردن برخی از تغییراتی که قبلاً اضافه شده است.
استفاده می کنید یا نه --اسکواش، تغییرات ایجاد شده در مخزن محلی شما دست نخورده باقی می ماند
و می تواند بعداً تقسیم شود و در بالادست به پروژه فرعی ارسال شود.
OPTIONS برای شکاف
--annotate=
این گزینه فقط برای دستور split معتبر است.
هنگام تولید تاریخچه مصنوعی، اضافه کنید به عنوان پیشوند هر commit
پیام از آنجایی که ما در حال ایجاد commit های جدید با همان پیام commit هستیم، اما احتمالا
محتوای متفاوت، از commit های اصلی، این می تواند به تمایز آنها کمک کند و
اجتناب از سردرگمی
هر زمان که تقسیم می کنید، باید از همان استفاده کنید ، یا در غیر این صورت شما یک
تضمین می کند که تاریخ بازآفرینی شده جدید با تاریخ قبلی یکسان خواهد بود. که خواهد شد
از عملکرد صحیح ادغام جلوگیری کنید. زیردرخت git سعی می کند به هر حال آن را به کار ببرد،
به خصوص اگر از --rejoin استفاده می کنید، اما ممکن است همیشه موثر نباشد.
-ب ، --شاخه=
این گزینه فقط برای دستور split معتبر است.
پس از تولید تاریخچه مصنوعی، یک شاخه جدید به نام ایجاد کنید که
شامل تاریخچه جدید است این برای فشار دادن فوری به بالادست مناسب است.
نباید از قبل وجود داشته باشد.
--نادیده گرفتن-پیوستن
این گزینه فقط برای دستور split معتبر است.
در صورت استفاده از -- دوباره ملحق شوید، زیردرخت git تلاش می کند تا بازسازی تاریخچه خود را بهینه کند
فقط commit های جدید را از آخرین بار ایجاد کنید -- دوباره ملحق شوید. --نادیده گرفتن-پیوستن این را غیرفعال می کند
رفتاری که آن را مجبور به بازسازی کل تاریخ می کند. در یک پروژه بزرگ، این می تواند
طول بکشد
--onto=
این گزینه فقط برای دستور split معتبر است.
اگر زیردرخت شما در ابتدا با استفاده از چیزی غیر از زیردرخت git وارد شده است، اینطور است
ممکن است تاریخچه با آنچه که زیردرخت git انتظار دارد مطابقت نداشته باشد. در این صورت می توانید آن را مشخص کنید
commit id که با اولین بازبینی تاریخچه پروژه فرعی مطابقت دارد
که به پروژه شما وارد شد و زیر درخت git سعی خواهد کرد تا تاریخچه آن را بسازد
از آنجا.
اگر استفاده کردید دستگاه گوارش زیر درخت اضافه کردن، هرگز نباید به این گزینه نیاز داشته باشید.
-- دوباره ملحق شوید
این گزینه فقط برای دستور split معتبر است.
پس از تقسیم، تاریخچه مصنوعی جدید ایجاد شده را دوباره در اصلی خود ادغام کنید
پروژه به این ترتیب، انشعاب های آینده می توانند تنها بخشی از تاریخ را جستجو کنند که بوده است
اضافه شده از آخرین --rejoin.
اگر commit های تقسیم شما در نهایت در پروژه فرعی upstream ادغام شدند، و سپس شما می خواهید
آخرین نسخه upstream را دریافت کنید، این به الگوریتم ادغام git اجازه می دهد تا بیشتر شود
هوشمندانه از درگیری اجتناب کنید (زیرا می داند که این تعهدات مصنوعی قبلاً بخشی هستند
مخزن بالادست).
متأسفانه استفاده از این گزینه نتیجه می دهد دستگاه گوارش ورود به سیستم نمایش یک کپی اضافی از هر جدید
commit که ایجاد شد (اصل و مصنوعی).
اگر تمام ادغام های خود را با --اسکواش، استفاده نکنید -- دوباره ملحق شوید وقتی جدا شدی، چون
به هر حال نمی خواهید تاریخچه پروژه فرعی بخشی از پروژه شما باشد.
مثال 1. افزودن COMMAND
بیایید فرض کنیم که شما یک مخزن محلی دارید که می خواهید یک مخزن خارجی اضافه کنید
کتابخانه فروشنده به. در این مورد ما مخزن git-subtree را به عنوان یک زیر شاخه اضافه می کنیم
از مخزن git-extensions موجود شما در ~/git-extensions/:
$ git subtree اضافه کردن --prefix=git-subtree --squash \
git://github.com/apenwarr/git-subtree.git master
استاد باید یک مرجع معتبر از راه دور باشد و می تواند نام شاخه دیگری باشد
شما می توانید پرچم --squash را حذف کنید، اما انجام این کار تعداد commit هایی را افزایش می دهد
در مخزن محلی شما گنجانده شده است.
ما در حال حاضر یک ~/git-extensions/git-subtree دایرکتوری حاوی کد از استاد
شاخه git://github.com/apenwarr/git-subtree.git در مخزن git-extensions ما.
مثال 2. استخراج کردن A زیر درخت استفاده كردن مرتکب شدن، ادغام و کشیدن
بیایید از مخزن برای کد منبع git به عنوان مثال استفاده کنیم. ابتدا کپی خود را دریافت کنید
از مخزن git.git:
$ git clone git://git.kernel.org/pub/scm/git/git.git test-git
$ cd test-git
gitweb (commit 1130ef3) در commit 0a8f4f0 در git ادغام شد، پس از آن هیچ
دیگر به طور جداگانه نگهداری می شود. اما تصور کنید که به طور جداگانه نگهداری می شد و ما می خواستیم
برای استخراج تغییرات git در gitweb از آن زمان، برای اشتراک گذاری با upstream. شما می توانید
این کار را انجام دهید:
$ git subtree split --prefix=gitweb --annotate='(split) ' \
0a8f4f0^.. --onto=1130ef3 --rejoin \
--شاخه gitweb-جدیدترین
$ gitk gitweb-latest
$ git push [ایمیل محافظت شده]:whatever/gitweb.git gitweb-latest:master
(ما استفاده می کنیم 0a8f4f0^.. زیرا این بدان معنی است که "همه تغییرات از 0a8f4f0 به فعلی
نسخه، از جمله خود 0a8f4f0.")
اگر gitweb در ابتدا با استفاده از آن ادغام شده بود دستگاه گوارش زیر درخت اضافه کردن (یا انشعاب قبلی داشت
قبلاً با --rejoin مشخص شده انجام شده است) سپس می توانید تمام تقسیمات خود را بدون داشتن انجام دهید
برای به خاطر سپردن شناسه های commit عجیب و غریب:
$ git subtree split --prefix=gitweb --annotate='(split) ' --rejoin \
--شاخه gitweb-latest2
و می توانید به همین راحتی تغییرات را در پروژه بالادستی ادغام کنید:
$ git subtree pull --prefix=gitweb \
[ایمیل محافظت شده]:whatever/gitweb.git master
یا، با استفاده از --اسکواش، در واقع می توانید به نسخه قبلی gitweb برگردید:
$ git subtree ادغام --prefix=gitweb --squash gitweb-latest~10
سپس تغییراتی ایجاد کنید:
$ date > gitweb/myfile
$ git gitweb/myfile را اضافه کنید
$ git commit -m 'ایجاد myfile'
و دوباره سریع جلو بروید:
$ git subtree ادغام --prefix=gitweb --squash gitweb-latest
و توجه کنید که تغییر شما هنوز دست نخورده است:
$ ls -l gitweb/myfile
و می توانید آن را تقسیم کنید و به تغییرات خود در مقایسه با gitweb استاندارد نگاه کنید:
git log gitweb-latest..$(git subtree split --prefix=gitweb)
مثال 3. استخراج کردن A زیر درخت استفاده كردن شاخه
فرض کنید یک دایرکتوری منبع با تعداد زیادی فایل و زیر شاخه ها دارید و می خواهید
دایرکتوری lib را به پروژه git خودش استخراج کند. در اینجا یک راه کوتاه برای انجام آن وجود دارد:
ابتدا مخزن جدید را در هر کجا که می خواهید بسازید:
$
$ git init --bare
بازگشت به فهرست اصلی خود:
$ git subtree split --prefix=lib --annotate="(split)" -b split
سپس شاخه جدید را روی مخزن خالی جدید فشار دهید:
$ git push تقسیم: استاد
از git-subtree آنلاین با استفاده از خدمات onworks.net استفاده کنید