כללי המאגר (.gitcito.json)
לכל פרויקט יש כללים שאי אפשר להסיק מהקוד. לעולם לא לדחוף ישירות ל-release/*.
תחומי הקומיט הם api, web ו-infra, ותו לא. צריך Node 20, תת-מודולים
מסונכרנים, וקובץ .env שהועתק מ-.env.example לפני שמשהו בכלל רץ. כללים כאלה
חיים ב-README שאיש לא קורא שוב, בכישלון CI, או אצל מי שנמצא כאן הכי הרבה זמן.
.gitcito.json הוא המקום שבו המאגר כותב אותם כדי שהכלי יוכל לפעול לפיהם. הוא
יושב בשורש המאגר, מקבל קומיט כמו כל קובץ אחר, ולכן נוסע עם ההעתק: כל מי שפותח את
הפרויקט מקבל את אותם כללים, ומי שהצטרף עכשיו מקבל אותם ביום הראשון ולא בדחיפה
הראשונה שנדחתה.
הקובץ אופציונלי לחלוטין. מאגר בלעדיו מתנהג בדיוק כמו קודם.
אין צורך לכתוב אותו ביד: צ׳אט המאגר מקבל את הסכימה של הקובץ הזה, ולכן הוסף קישורי כרטיסים ל-JIRA-1234 או הגן על ענפי ה-release חוזר כפעולת קובץ שאפשר לבדוק.

איפה עורכים אותו
גלגל השיניים ליד הכלים בסרגל ← Config. העורך הזה כותב את הקובץ לעץ העבודה שלך; הוא לא נשמר בשום מקום אחר, אז עשה לו קומיט כדי לחלוק את הכללים עם הצוות.
אם למאגר עוד אין קובץ, קרא את המאגר יציע אחד לפי מה שכבר קיים: .nvmrc או
engines.node, .gitmodules, filter=lfs ב-.gitattributes, .env.example
בלי .env לצידו, הענפים שאתה כבר מגן עליהם מקומית, והתחומים ש-500 כותרות הקומיט
האחרונות השתמשו בהם. שום דבר לא נכתב עד שתשמור. מהטרמינל, gitcito config init
עושה את אותו הדבר (ראו שורת הפקודה).
מה הקובץ יכול לומר
{
"version": 1,
"protect": ["main", "release/*"],
"links": {
"tickets": [
{ "match": "\\b[A-Z][A-Z0-9]+-\\d+\\b", "url": "https://tracker.example.com/browse/$0", "label": "Jira" }
]
},
"commit": {
"scopes": ["api", "web", "infra"],
"ticketFromBranch": true,
"trailers": ["Refs: {ticket}"]
},
"requires": {
"node": ">=20",
"hooksPath": ".husky",
"submodules": true,
"lfs": true,
"files": [{ "path": ".env", "from": ".env.example", "why": "כתובת הבסיס של ה-API וטוקן פיתוח" }]
},
"checklist": {
"push": ["להריץ את חבילת האינטגרציה מול סביבת ה-staging"]
}
}
| שדה | מה הוא עושה |
|---|---|
version |
חייב להיות 1. קובץ מסכימה חדשה יותר מתעלמים ממנו כולו במקום לנחש. |
protect |
שמות ענפים, כאשר * תואם כל רצף תווים. מתווספים לענפים שאתה מגן עליהם מקומית — ראו ענפים מוגנים. |
links.tickets |
ביטוי רגולרי ותבנית כתובת. $0 הוא כל ההתאמה, $1…$9 הקבוצות שלה. התאמות בכותרות ובגוף הקומיט הופכות לקישורים. |
commit.scopes |
התחומים שהמחבר מציע, במקום שדה חופשי. הצהרה עליהם גם הופכת תחום לא מוכר ב-gitcito commit-check מעצת סגנון לשגיאה. |
commit.ticketFromBranch |
ממלא את מפתח הכרטיס משם הענף (feature/ABC-123-thing ← ABC-123) — אבל רק במחבר ריק, ולעולם לא מעל מה שאתה מקליד. |
commit.trailers |
שורות שנוספות לגוף הקומיט. {ticket} ו-{branch} מתמלאים; שורה שהמציין שלה לא מוצא מה למלא נזרקת במקום להיכתב חצי. |
requires.* |
מה שהעתק עובד זקוק לו. כל רשומה הופכת לשורת דוקטור, למטה. |
checklist.push |
טקסט חופשי שמוצג פעם אחת בכל הפעלה, לפני הדחיפה הראשונה. |
הדוקטור
requires הוא החלק שעונה על "שכפלתי וזה לא רץ". Gitcito בודק אותו כשאתה פותח
את המאגר ומציג תג סטטוסקופ בשורת המצב כשמשהו לא במקום. לחיצה פותחת את לשונית
Config בשורות הדוקטור; בדוק שוב מריץ אותן מחדש.
| בדיקה | עוברת כאשר | תיקון באמצעות |
|---|---|---|
node |
ה-node שב-PATH מקיים את הדרישה |
— |
submodules |
אף תת-מודול אינו חסר checkout | git submodule update --init --recursive |
lfs |
git-lfs מותקן והקבצים במעקב הם תוכן אמיתי, לא טקסט מצביע | git lfs pull |
hooksPath |
core.hooksPath תואם לנתיב המוצהר |
הגדרת core.hooksPath |
files |
הקובץ קיים | העתקה מ-from, אם הוא קיים |
שני גבולות מכוונים. אזהרה לעולם לא אומרת "שבור" — היא אומרת שהדוקטור לא הצליח
לקבוע משהו (מפרט Node שאי אפשר לפענח עובר, במקום להמציא כישלון שאין לך מה לעשות
איתו), ואזהרות לא מפילות את gitcito doctor ב-CI. ותיקון לעולם אינו דבר שהקובץ
סיפק: הקבוצה שלמעלה היא כל הקבוצה, סגורה בזמן הידור. התצורה מוסרת לו ערך — נתיב
להעתקה, ערך ל-core.hooksPath — ולעולם לא פקודה.
העתקת קובץ לעולם לא דורסת: היעדר הקובץ הוא בדיוק הסיבה שהשורה הזו קיימת.
קומיטים
כאשר commit.scopes מוצהרים, כפתור התחום במחבר מציע את הרשימה הזו במקום שדה
חופשי — ההבדל בין feat(renderer) ל-feat(rendererr). ticketFromBranch
ו-trailers ממלאים את החלקים המכניים של ההודעה, ו-links.tickets מחזיר את
המפתחות לקישורים בכל מקום שבו קומיט מוצג.
אותם כללים חלים גם מחוץ לחלון: gitcito commit-check קורא את הקובץ הזה, כך
שהוק commit-msg וה-CI אוכפים בדיוק את מה שהמחבר מציע. ראו
שורת הפקודה וקומיטים.
רשימת הבדיקה לפני דחיפה
checklist.push מוצג כאישור לפני הדחיפה הראשונה בהפעלה, שורה לכל פריט. זה המקום
לדבר שהוא באמת שיקול דעת — מישהו עדכן את התמיכה? — כי Gitcito לעולם לא בודק
אותם עבורך. אלה תזכורות, לא שערים: קוראים ודוחפים, או מבטלים. מוצג פעם אחת לכל
מאגר בכל הפעלה, כי חלון שקופץ בכל דחיפה הוא חלון שאיש לא קורא.
למה הוא לא יכול להזיק לך
הקובץ מגיע עם המאגר, כלומר ממי שכתב את המאגר. הוא מטופל כתוכן לא אמין, בדיוק כמו הודעת קומיט:
- שום דבר בו לא רץ. אין שדה שמחזיק פקודה, ותיקוני הדוקטור הם רשימה קבועה.
- הוא יכול רק להוסיף הגבלות.
protectהוא איחוד עם הרשימה המקומית שלך — מאגר יכול להגן על יותר ממה שבחרת, לעולם לא לשכנע אותך לוותר על הגנה. אף שדה לא מכבה שומר. - נתיבים לא יכולים לצאת מהמאגר. נתיבים מוחלטים,
..,~, אותיות כונן וכל דבר שנוגע ב-.gitנדחים, ונבדקים שוב בנקודה שבה מחרוזת הופכת לנתיב אמיתי. - קישורים חייבים להיות
http(s). שום דבר אחר לא נמסר לפותח הכתובות של המערכת. - לכל דבר יש תקרה — אורכי רשימות, מחרוזות ותבניות — כך שמאגר עוין לא יוכל להדביק קיר טקסט לחלון ולא אלף תגים ללוח.
שדה פגום נזרק, ואינו קטלני. שאר הקובץ ממשיך לחול, ומה שנזרק מופיע תחת התעלמנו
מזה בלשונית Config יחד עם הסיבה. היוצא מן הכלל היחיד הוא JSON לא תקין או
version לא מוכרת, שם אין מה להציל.
מה הוא במכוון לא עושה
- בלי פקודות, בלי סקריפטים, בלי הוקים. בשביל זה יש הוקים, והם החלטה שאתה מקבל לכל העתק.
- בלי כללים לפי ענף או לפי אדם. קובץ אחד, מערכת כללים אחת.
- הוא לא מחליף CI. הרשימה היא טקסט; הדוקטור בודק את הסביבה, לא את העבודה שלך.
- הוא לא יכול להחליש דבר. כל שומר של Gitcito נשאר שלך.
ראו גם: הגדרות לכל מאגר · שורת הפקודה · קומיטים · הוקים ו-.gitignore