כלי סביבת העבודה

כללי המאגר (.gitcito.json)

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

.gitcito.json הוא המקום שבו המאגר כותב אותם כדי שהכלי יוכל לפעול לפיהם. הוא יושב בשורש המאגר, מקבל קומיט כמו כל קובץ אחר, ולכן נוסע עם ההעתק: כל מי שפותח את הפרויקט מקבל את אותם כללים, ומי שהצטרף עכשיו מקבל אותם ביום הראשון ולא בדחיפה הראשונה שנדחתה.

הקובץ אופציונלי לחלוטין. מאגר בלעדיו מתנהג בדיוק כמו קודם.

אין צורך לכתוב אותו ביד: צ׳אט המאגר מקבל את הסכימה של הקובץ הזה, ולכן הוסף קישורי כרטיסים ל-JIRA-1234 או הגן על ענפי ה-release חוזר כפעולת קובץ שאפשר לבדוק.

לשונית Config של המאגר, עם שורות הדוקטור וקטעי הכללים

איפה עורכים אותו

גלגל השיניים ליד הכלים בסרגל ← 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

שיפור התרגום הזה ב־GitHub