گیت مشهورترین و پرکاربردترین ابزار کنترل نسخه در جهان است. پروژههای معمول و عمومی، توسعهدهندگان متفاوتی دارند که بهصورت موازی روی پروژه کار میکنند. به همین دلیل به یک ابزار کنترل نسخه برای جلوگیری از تداخل بین کدهایی که توسط توسعهدهندگان تولید میشوند، نیاز داریم. اما چگونه یک پروژهی بزرگ را در گیت مدیریت کنیم؟
در این مقاله با هم چند تکنیک را برای مدیریت پروژههای بزرگ بررسی میکنیم.
ریپازیتوری(repository)های بزرگ به دو دسته تقسیم میشوند:
- آنهایی که تاریخچهای بسیار طولانی دارند (پروژه در یک دورهی زمانی بسیار طولانی رشد میکند).
- آنهایی که دادههای باینری عظیمی دارند که باید با کد ردیابی و جفت شوند.
البته یک ریپازیتوری بزرگ میتواند به هر دو دسته نیز تعلق داشته باشد و مشکل آنجایی تشدید میشود که مصنوعات باینری قدیمی و منسوخ هنوز در ریپازیتوری وجود داشته باشند.
راهحلهایی برای ریپازیتوری با تاریخچهی طولانی
راهحل ساده: git shallow clone
اولین و سادهترین راهحل که برای صرفهجویی در زمان و حافظه به کار گرفته میشود، کلونکردن آخرین ویرایشهای پروژه است. git shallow clone که به معنی کلونهای کمعمق و سطحی است به ما این امکان را میدهد که فقط n کامیت آخر ریپازیتوری را به شکل زیر کلون کنیم:
git clone --depth [depth] [remote-url]
آرگومان depth تعداد کامیت و remote-url آدرس ریپازیتوری موردنظر ماست.
جایگزین git shallow-clone: فقط یک شاخه را کلون کنیم
از نسخهی ۱.۷.۱۰ گیت به بعد، میتوانیم یک شاخه را بهطور جداگانه کلون کنیم. این ترفند زمانی به کار میرود که با شاخههای طولانی و متفاوت سروکار داریم یا تعداد زیادی شاخه وجود دارد که فقط به تعداد کمی از آنها نیاز داریم.
git clone [remote url] --branch [branch_name] --single-branch [folder]
اگر تعداد انگشتشماری شاخه با تفاوتهای اندک داریم استفاده از این دستور به صرفه نیست.
راهحل موشکافانه: git filter branch
این روش یک راهحل قدرتمند برای ریپازیتوریهای بزرگی است که تعداد زیادی دادههای باینری یا فایلهای قدیمی بدون استفاده دارند. این دستور به ما این امکان را میدهد که تاریخچهی پروژه را بررسی و فایلهای موردنیازمان را طبق الگوهای ازپیشتعیینشده برای پروژه فیلتر کنیم. لازم به ذکر است برای شناسایی فایلهای ذکرشده اسکریپتهای کمکی بسیاری وجود دارد.
به شکل زیر میتوانیم از این دستور استفاده کنیم:
git filter-branch --tree-filter <filters> branch_name
برای مثال ما میخواهیم در ریپازیتوری جدید خود یک فایل را حذف کنیم. دستور ما به شکل زیر خواهد بود:
git filter-branch --tree-filter ‘rm filename’ HEAD
ضعف جزئی git filter-branch
هنگامی که ما از این دستور استفاده میکنیم، در واقع تمام تاریخچهی پروژه خود را بازنویسی خواهیم کرد. به عبارتی ID تمامی کامیتهای ما بازنویسی میشوند و لازم است هر توسعهدهنده ریپازیتوری بهروزشده را دوباره کلون کند. بنابراین وقتی قصد داریم از دستور git filter-branch استفاده کنیم حتماً به تمامی اعضای تیم خود اطلاع میدهیم تا پس از بهروزرسانی، مجدداً ریپازیتوری را کلون کنند.
راهحلی برای ریپازیتوریهای همراه با دادههای باینری عظیم
بهطور کلی گیت دادههای باینری موجود در پروژه را فشرده و ذخیرهسازی میکند، اما مسلم است که اگر تعداد زیادی از این نوع دادهها داشته باشیم، کارایی بهینهای نخواهد داشت. در این قسمت به معرفی راهکاری میپردازیم که نهتنها برای ذخیرهسازی دادههای باینری عظیم بلکه برای ذخیرهکردن سایر فایلهای بزرگ مانند موسیقی، عکس و… نیز به کار میرود.
استفاده از Git LFS
گیت LFS کوتاهشدهی Large Files Support، یک افزونهی گیت است که برای رفع مشکل محدودیت اندازهی فایل در گیت ساخته شده است. در این افزونه فایلهای بزرگ در یک سرور راه دور و مجزا از ریپازیتوری، ذخیرهسازی شده و اشارهگرهای این فایلها در ریپازیتوری قرار میگیرند.
نحوه استفاده از افزونه LFS
۱. با استفاده از دستور زیر میتوانیم این افزونه را برای هر کاربر سیستم خود دانلود و نصب کنیم.
git lfs install
۲. به پوشهی کلونشدهی ریپازیتوری رفته و نوع فایل یا هرکدام از فایلهایی را که میخواهیم LFS مدیریت کند، با استفاده از دستور زیر مشخص میکنیم.
git lfs track <file_name>
برای مثال اگر بخواهیم تمامی فایلهای فتوشاپ توسط git LFS مدیریت و ردیابی شوند، دستور زیر را وارد میکنیم.
git lfs track “*.psd”
در این مرحله، git LFS تغییراتی در فایل gitattributes. ایجاد میکند یا اگر این فایل وجود نداشته باشد آن را میسازد. پس باید مطمئن شویم که توسط گیت ردیابی میشود.
git add .gitattributes
توجه داشته باشید git LFS هیچ فایلی که در کامیتهای قبل یا در شاخههای دیگر موجود است را بهخودیخود ردیابی و تبدیل نمیکند. برای این منظور باید از دستور migrate به شکل زیر استفاده کنیم:
git lfs migrate import — include <file_name>
همچنین برای دیدن انواع فایلهایی که در کامیتها هستند و میتوانند توسط LFS ردیابی شوند، از دستور زیر استفاده میکنیم. پس از آن میتوانیم در صورت نیاز این فایلها را توسط LFS ردیابی و مدیریت کنیم.
git lfs migrate info
و اکنون تغییرات انجامشده را با استفاده از git push به گیتهاب پوش میکنیم.
برای اطلاعات بیشتر میتوانید به سایت git LFS مراجعه کنید.
شاید علاقهمند باشید: وب اسکرپینگ چیست و چطور انجام میشود؟ – راهنمای کامل Web Scraping
نتیجهگیری
در نهایت فقط به این دلیل که یک ریپازیتوری با تاریخچه یا فایلهای بزرگ دارید، از قابلیتهای فوقالعادهی Git دست نکشید. همان طور که در این مقاله خواندید برای هر مشکلی حداقل یک راهحل وجود دارد.
اگر علاقهمند هستید بیشتر درباره گیت این ابزار کنترل نسخه قدرتمند بدانید، میتوانید سری به دورهی آموزش گیت در کوئرا کالج بزنید.