إنشاء slug للرابط من اسم فرع Git
حوّل اسم فرع Git مثل feature/add-user-login إلى slug موجز وصالح للرابط من دون تضمين بادئة سير العمل في النتيجة.
شغّل الأداة مجانًا
تتعرّف الإمكانية إلى المقطع الأول من المسار بوصفه نوع الفرع، وتعدّ كل ما يليه الجزء الوصفي، ثم تطبّعه إلى كلمات بأحرف صغيرة تفصل بينها شرطات. تعمل العملية بصورة حتمية ومن دون اتصال بالشبكة، وتعيد خطأ إدخال واضحاً عندما يحتوي الفرع على بادئة ولا يتضمن وصفاً صالحاً للاستخدام.
افصل بيانات سير العمل عن الوصف المفيد
تبدأ فرق Git أسماء الفروع عادةً بنوع لسير العمل مثل feature أو fix أو chore أو release أو docs. يساعد هذا المقطع الأول الأشخاص وعمليات الأتمتة على فهم سبب وجود الفرع، لكنه غالباً لا يفيد في رابط عام. تعدّ هذه الإمكانية النص السابق للشرطة المائلة الأولى بادئة النوع، وتشتق slug من كل ما يليها فقط. على سبيل المثال، يصبح feature/add-user-login هو add-user-login، بينما يصبح fix/checkout/payment-timeout هو checkout-payment-timeout. تحتفظ العملية بالمسارات الوصفية المتداخلة في صورة كلمات بدلاً من حذفها، وبذلك يستطيع فريقكم الإبقاء على نطاقات ذات معنى من دون إظهار الشرطات المائلة في الرابط النهائي. تُزال البادئة الاختيارية refs/heads/، التي تعيدها أدوات Git وأنظمة التكامل المستمر كثيراً، قبل تفسير الاسم. لا تعتمد العملية قائمة مغلقة لأنواع الفروع المقبولة. يمكن لأي مقطع أول غير فارغ أن يكون بادئة، ولذلك تعمل القاعدة نفسها مع اصطلاحاتكم المحلية مثل spike أو experiment أو maintenance، وكذلك مع سير التذاكر الذي تحدده مؤسستكم.
تعرّف بدقة إلى طريقة تطبيع slug
بعد تحديد الجزء الوصفي، تطبق الخوارزمية سلسلة ثابتة من التحويلات. تزيل المسافات المحيطة، وتطبّع الأحرف اللاتينية ذات العلامات، وتحول الأحرف إلى الحالة الصغيرة، وتستبدل كل سلسلة لا تتكون من أحرف ASCII أو أرقام بشرطة واحدة، ثم تحذف الشرطات من البداية والنهاية. لذلك تتقارب الشرطات المائلة والمسافات والشرطات السفلية وعلامات الترقيم والفواصل المتكررة إلى صيغة واحدة آمنة للرابط. يصبح فرع مثل feature/Account Settings_v2 هو account-settings-v2. صُممت النتيجة لتكون قابلة للتوقع: لا تستخدم نموذجاً لغوياً أو قاموساً أو اتصالاً بالشبكة أو قيمة عشوائية أو وقتاً أو حالة المستودع. لا تخترع الدالة كلمات ولا تحاول تفسير معرّفات التذاكر. تبقى الأرقام الموجودة في الوصف، وهذا مفيد لأسماء مثل fix/PROJ-482-login-loop. ولأن التطبيع قد يزيل الرموز وأنظمة الكتابة غير المدعومة، تتحقق الإمكانية أيضاً من بقاء حرف أو رقم واحد صالح على الأقل. إذا اقتصر الوصف على علامات ترقيم أو محارف لا يمكنها تكوين slug المدعوم بصيغة ASCII، فتعيد خطأ إدخال بدلاً من إنتاج قيمة فارغة بصمت.
استخدم النتيجة بأمان في النشر والأتمتة
يحتوي الكائن المعاد على حقل واحد هو slug، ولذلك يمكن تمريره مباشرةً إلى معاينة وثائق أو رابط بيئة مؤقتة أو مسار ملاحظات إصدار أو صفحة سجل تغييرات أو سير نشر pull request. تحقّق من النتيجة قبل حجز مسار إذا كانت الوجهة تفرض قواعد إضافية، مثل حد أقصى للطول أو مسارات محمية أو شرط التفرد. لا تستعلم هذه الإمكانية من الموجّه أو مزود الاستضافة أو خدمة Git أو قاعدة بيانات المحتوى، ولذلك لا يمكنها معرفة ما إذا كان slug مستخدماً من قبل. كما أنها لا تتحقق من وجود السلسلة المدخلة بوصفها فرعاً فعلياً في المستودع؛ بل تطبق اصطلاح التسمية الموثق فقط. تُرفض أسماء الفروع التي لا تحتوي على شرطة مائلة، والأسماء التي تنتهي بعد بادئة النوع مباشرةً، والأوصاف التي ينتج عنها slug فارغ بعد التطبيع. يفيد هذا الفشل الصارم في الأتمتة لأنه يمنع مصدراً غير صالح من النشر بالخطأ إلى مسار فارغ أو عام. عند الأتمتة عبر API، يستخدم كل طلب السعر الأساسي المنشور $0.002. ويمكن تنفيذ التحويل الحتمي نفسه في المتصفح للتحويلات الفردية السريعة.
حالات الاستخدام
سمِّ عملية نشر للمعاينة
حوّل فرع ميزة إلى مسار مقروء لبيئة مراجعة معزولة من دون تضمين بادئة سير العمل.
أنشئ مساراً لملاحظات الإصدار
اشتق مقطع رابط متسقاً من الجزء الوصفي لفرع release أو fix لاستخدامه في الملاحظات المولّدة.
وحّد روابط pull request
طبّع أوصاف الفروع المتداخلة إلى روابط ثابتة بأحرف صغيرة لاستخدامها في الوثائق والأتمتة.
الأسئلة الشائعة
ما الذي يُعد بادئة النوع؟
إنه أول مقطع غير فارغ قبل الشرطة المائلة الأولى. يمكن أن يكون feature أو fix أو chore أو أي نوع يعتمده فريقكم.
ماذا يحدث لمسارات الفروع المتداخلة؟
تدخل كل المقاطع التالية للشرطة المائلة الأولى في الوصف، وتتحول الفواصل بينها إلى شرطات في slug.
هل يمكن إدخال اسم refs/heads كاملاً؟
نعم. تُزال البداية refs/heads/ قبل تحديد بادئة النوع والجزء الوصفي.
لماذا يفشل اسم الفرع من دون شرطة مائلة؟
تتطلب الإمكانية بادئة نوع وجزءاً وصفياً منفصلين، ولذلك يكون الاسم الواحد غير المفصول ملتبساً.
هل تتحقق الأداة من وجود الفرع؟
لا. تنفذ معالجة حتمية للنص فقط، ولا تتصل بمستودع أو بخدمة استضافة Git.
ما تكلفة طلب API؟
يستخدم كل طلب API السعر الأساسي المنشور $0.002، ويمكن لنسخة المتصفح تنفيذ التحويل نفسه محلياً.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/dev/slug-from-git-branch \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"branch":"feature/add-user-login"}'const res = await fetch("https://api.kit.forhosting.com/dev/slug-from-git-branch", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"branch": "feature/add-user-login"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/slug-from-git-branch",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"branch": "feature/add-user-login"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/slug-from-git-branch", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"branch":"feature/add-user-login"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"branch":"feature/add-user-login"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/slug-from-git-branch", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"branch": "feature/add-user-login"
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.slug_from_git_branch",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |