چند شب پیش فکر میکردم که اگه روی سرورم یه بات داشته داشتم که هر روز بصورت تصادفی commit بزنه و تمام اون مربعهای توی پروفایل گیتم رو سبز کنه، خیلی باحال میشه و از یه طرف هم سبز شدن اون مربعها حس خوبی به آدم میده.بعد کمی جستجو و گوگلینگ متوجه شدم نیازی به بات نیست و گیت تاریخ رو از متغییرهای داخل سیستم عامل یا همون environment variables میگیره و میتونیم تغییرشون بدیم که اینجا توضیح ساختار تاریخ گیت هست.
الآن یعنی یک اسکریپت داشته باشیم که این تاریخها رو درست ست کنه و بعد commit بزنه به چیزی که میخوایم رسیدیم و حس این رو میده که توی زمان سفر کرده باشیم و commit زده باشیم، ای کاش به همین سادگی زمان رو میشد تغییر داد.
این که هک نشد! خب، هک همیشه به معنی دسترسی غیر مجاز به چیزی نیست، به روشی که باعث بشه چیزی همونطور که میخوایم کار کنه هم هک او چیز گفته میشه.
حالا اگه شما هم دوست دارین گیتتون سبز بشه سورس پروژه رو توی گیتهاب ببینین، توضیحات پایین رو هم بخونین بد نیست.
سطر پایین فرمت کلی کاری هست که انجام داده میشه و میشه گفت کلید سیر در زمان توی سطر پایین هست.
GIT_AUTHOR_DATE=2015-01-01T00:00:00 GIT_COMMITTER_DATE=2015-01-01T00:00:00 git commit --allow-empty -m "pharzan"
با این سطر میتونیم تاریخ رو دستی به ۱/۱/۲۰۱۵ ببریم و بعدش میتونیم یک commit خالی بزنیم. منظور از commit خالی یعنی بدون اینکه فایلی تغییر کرده باشه و به فضای stage اضافه شده باشه، میشه commit زد! هنوز هم نفهمیدم به چه دردی میتونه بخوره ولی چنین امکانی وجود داره و ما ازش استفاده میکنیم.
خب الآن باید اون تاریخها رو یکی یکی به تعداد روزهایی که میخوایم کم کنیم ولی بنظرم اگه بخوایم از توی اسکریپت shell لینوکس این کار رو انجام بدیم داستان خیلی پیچیده میشه و بجاش میتونیم این shell اسکریپت رو از داخل اسکریپت یک زبان دیگه، مثلا پایتون، تولید کنیم و از اونجا اجراش کنیم.
در کل سیستم خیلی سادهست و اون سطر بالا رو داریم تولید میکنیم. حلقه اول به تعداد روزهایی که کاربر میخواد برگرده تکرار میشه و از امروز به تعداد روزها تاریخ تولید میشه.
برای هر تاریخ تولید شده یک حلقه دیگه هست که به تعداد تصادفی بین ۱ و ۲۰ اجرا میشه و در حقیقت تعداد commitهای اون تاریخ هست (چون نمیخوایم همه مربعها همرنگ باشن).
گیتهاب پر رنگی مربعها رو از روی نسبت تعداد commitها نشون میده، یعنی اگه هر روز حداکثر ۲۰ تا commit داشته باشین پر رنگترین مربعتون اون روزی میشه که ۲۰ تا commit زدین ولی یه روزی ۳۰۰ تا بزنین قطعا همه مربع ها به نسبت کمرنگتر میشه.
for i in range(days): rnd = random.randint(1, 20) commitdate = roundTime(datetime.today() - timedelta(days=i), roundTo=60*60) for j in range(rnd): template = '''GIT_AUTHOR_DATE={0} GIT_COMMITTER_DATE={1} git commit --allow- empty -m "pharzan" > /dev/null\n'''.format(commitdate.isoformat(), commitdate.isoformat()) lines.append(template)
نهایتا تمام سطرهای تولید شده رو که توی یک لیست (آرایه) داریم و از اونجا به یک فایل قابل اجرا در لینوکس یا همون shell script میریزیم و بقیه کد پایتون با استفاده از subprocess این shell اسکریپت رو اجرا میکنه.
قبل اجرا توی گیتهاب یک مخزن جدید و خالی بسازین. من اسم مخزنم رو fake_repo گذاشتم. بعد اسکریپتم رو اجرا میکنم و سه تا سوال میپرسه. اول نام کاربری گیتهابم رو، بعد اسم مخزن خالیایی که قبل اجرا ساختیم و نهایتا تعداد روزی که میخوایم عقب برگردیم.
نکته ۱: اگر مخزنتون قبلا وجود داشته یک پیغام merge میگیرین ولی توصیه میکنم یک مخزن جدید ایجاد کنین.
نکته ۲: عدد تصادفی تولید شده (تعداد کامیتهای روز) رو طوری تنظیم کنین که از به نسبت ماکزیمم کامیتهاتون باشه. یعنی اگر بین ۴۰ تا ۵۰ تا commit دارین او عدد ۱ و ۲۰ رو بهتره ۴۰ تا ۵۰ کنین تا رنگ خانهها متناسب در بیاد.
نکته ۳: commitها شاید کمی طول بکشه، منتظر بمونین.
نکته ۴: این روش احتمالا روی سرویسهای گیت مثل Gitlab هم باید کار کنه ولی امتحان نکردم.
نکته ۵: Starکردن مخرن و اگر تغییرات و ایدهایی دارین Forkکردن خیلی خوشحال کنندهست.