Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

<GIT> #49

Open
mohammadzahoor opened this issue Dec 1, 2022 · 0 comments
Open

<GIT> #49

mohammadzahoor opened this issue Dec 1, 2022 · 0 comments

Comments

@mohammadzahoor
Copy link

تاریخچه گیت بسیار خطی

یکی از کارهایی که دوست دارم در پروژه هایم انجام دهم این است که تاریخچه git را تا حد امکان خطی کنم.

معمولاً به این معنی است که تعهدات را به شاخه اصلی تغییر دهید، اما همچنین می تواند به معنای اجازه دادن به ادغام در یک جهت باشد، از شاخه های ویژگی به اصلی، نه برعکس. بستگی به پروژه داره

امروز من این را یک قدم جلوتر می‌برم و یک مفهوم جدید را معرفی می‌کنم: تاریخچه git بسیار خطی .

با تاریخچه بسیار خطی ما، اولین commit در یک هش repo یک هش است که با شروع می شود 0000000، commit دوم است 0000001، سومی است 0000002، و غیره!

اعداد نسخه افزایشی صحبت در مورد ویرایش ها را آسان می کند. بلافاصله می‌دانید که نسخه 230 بعد از 200 می‌آید، و اگر روزانه 10 نسخه جدید ایجاد کنید، به راحتی می‌توانید شهودی داشته باشید که یک commit بر اساس آخرین نسخه فعلی شما چقدر قدیمی است.

تاریخچه گیت بسیار خطی ( در GitHub )

پس زمینه

در git، commit ها با SHA‑1مجموع خود شی commit ارجاع داده می شوند. ما می‌توانیم یک شی کامیت خام را با استفاده git cat-fileاز هش بودن آن با خواندن آن از دیسک (فشرده شده با zlib) و آزمایش چک‌سام بررسی کنیم. جمع کنترلی حاصل باید همیشه با نام فایل یکسان باشد.

$ git cat-commit d9ef231178b5004c17fe4e4e1807728567a69b84 درخت 2ccda48edc8ed3a96ac7576c57a5d645de2396f6 والد ad877a8e0240bdec6757781fdc3f2b45b8ced7a2 نویسنده گوستاو وستلینگ gustav@westling.dev 1669040942 +0100 committer گوستاو وستلینگ gustav@westling.dev 1669040995 +0100 وبلاگ: شروع به کار بر روی یک پست وبلاگ برای تاریخچه git بسیار خطی کنید $ pigz -d < .git/objects/d9/ef231178b5004c17fe4e4e1807728567a69b84 | sha1sum d9ef231178b5004c17fe4e4e1807728567a69b84 -

پیام commit آخرین بار در شی است و به راحتی قابل تغییر است. برای تغییر چک جمع شی، می توانیم داده های ناخواسته را به پیام commit اضافه کنیم. ما فقط نمی دانیم محموله ناخواسته چیست.

خرد کردن اعداد

هیچ راهی برای ایجاد آسان محتوا با پیشوند مورد نظر وجود ندارد (که از کل چک‌سام‌ها جلوگیری می‌کند). بنابراین ما فقط یک گزینه داریم: آزمایش بسیاری از ترکیبات داده های ناخواسته تا زمانی که بتوانیم یکی را پیدا کنیم که معیارهای ما را برآورده کند. این اساساً همان مکانیزمی است که بیت کوین و سایر سیستم های اثبات کار را تقویت می کند. در این مورد حدس می‌زنم می‌توان آن را "اثبات کار، برای کار شما" نامید. یا «اثبات اثبات کار»؟ هه

من کرانچ کردن پیام commit را با استفاده از githashcrash توسط Mattias Appelgren انجام داده ام.

در مک بوکم می توانم 15 میلیون هش در ثانیه تولید و آزمایش کنم. از آنجایی که ما به دنبال ورودی هستیم که یک پیشوند 8 کاراکتری از پیش تعریف شده ایجاد کند، باید در هر 16^8 => 4 294 967 296تکرار، تقریباً هر 5 دقیقه یک بار، یک ضربه دریافت کنم! می‌توانید با استفاده از پیشوندهای کوتاه‌تر، این فرآیند را سریع‌تر انجام دهید، یک پیشوند 6 کاراکتری فقط 1 ثانیه طول می‌کشد تا تولید شود (اما در برخی از رابط‌های کاربری Git به خوبی به نظر نمی‌رسد، و از آنجایی که این پروژه‌ای است که فرم را بر عملکرد اولویت می‌دهد، من مایل به هدر دادن چرخه های CPU بیشتری هستند).

برای مثال commit بالا، می‌توانیم از githashcrash برای یافتن داده‌های ناخواسته استفاده کنیم که پیشوند commit را به هر چیزی که می‌خواهیم تغییر می‌دهد، مانند 00000000. پس از کمی کرانچ، githashcrash متوجه می‌شود که می‌توانیم magic: MTQIpN2AmwQAبه پیام commit خود اضافه کنیم تا هش مورد نظر خود را ایجاد کنیم! آآآآآآآآآآآآآآآآآآآآآآآآآآآآآآآآآآآآآآآآآگاه

2022/11/21 15:56:04 زمان: 12m19.962437166s 2022/11/21 15:56:04 تست شده: 1.0845869819e+10 2022/11/21 15:56:04 14.66 MH/s 2022/11/21 15:56:04 یافت شد: 00000000 508749e5231fa5b43efcf7ac31385058 $ git cat-commit 00000000 508749e5231fa5b43efcf7ac31385058 درخت 2ccda48edc8ed3a96ac7576c57a5d645de2396f6 والد ad877a8e0240bdec6757781fdc3f2b45b8ced7a2 نویسنده گوستاو وستلینگ gustav@westling.dev 1669040942 +0100 committer گوستاو وستلینگ gustav@westling.dev 1669041794 +0100 وبلاگ: شروع به کار بر روی یک پست وبلاگ برای تاریخچه git بسیار خطی کنید جادو: MTQIpN2AmwQA

اتوماسیون

با مقداری bash-glue می‌توانیم این فرآیند را خودکار کنیم و شاخه‌های شما را در یک دستور به‌شدت خطی کنیم. برای آزمایش آن (لطفاً این کار را نکنید)، با نصب brew install zegl/tap/git-linearizeو در هر مخزن آن را اجرا کنید git linearizeتا آن را "رفع" کنید!

من یک پروژه اسباب‌بازی اخیرم را برای استفاده از این فرمت پیشوندها تبدیل کرده‌ام، و صادقانه بگویم، واقعاً تمیز به نظر می‌رسد!

ضمیمه: پیشوندهای leet haxor

• پیشوند همه تعهدات با "C0DE" -git linearize --format "c0de"

• برخورد کامل (کل هش صفر است، سپس 000...1، و غیره) - ( هر commit git linearize --format "%040d"10 33 سال طول می کشد)

به روز رسانی: هش نامرئی مبتنی بر GPU خراب می شود

git-linearize اکنون از lucky-commit به عنوان باطن تولید هش استفاده می کند. از GPU شما برای تولید هش استفاده می کند و حدود 20 برابر سریعتر از پیاده سازی مبتنی بر CPU است. وای! lucky-commitهمچنین به طور هوشمندانه ای فقط از کاراکترهای فضای سفید نامرئی برای قرار دادن پیام های commit استفاده می کند.

با تشکر از kinduff on Hacker News که به من در مورد لاکی کامیت گفت.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant