ענפים וניתוחים

תת־עצים

תת־עץ מעתיק מאגר אחר לתוך תיקייה שלכם. אחרי זה הקבצים באמת נמצאים שם: git clone רגיל מקבל אותם, git checkout מזיז אותם כמו כל קובץ אחר, ואף אחד לא חייב לדעת שהתיקייה הגיעה ממקום אחר.

זה כל ההבדל מתת־מודול, ששומר רק מצביע ודורש --recurse-submodules, צ׳קאאוט משלו, ו־HEAD מנותק משלו כדי להישאר מסודר.

⌘K ← תת־עצים.

תיקייה מוטמעת שנמצאה בהיסטוריה, עם המקור ש־Gitcito זוכר עבורה

המלכוד שאף אחד לא מזכיר

git אינו מתעד שום מניפסט לתת־עצים. לתת־מודול יש .gitmodules, שמונה כל כתובת וכל נתיב. לתת־עץ אין כלום — רק שורת git-subtree-dir: בקומיט שביצע את הייבוא.

כך שמאגר יכול להכיל תת־עץ ולא לתת לכם שום דרך לגלות מאיפה הוא הגיע. Gitcito עושה מה שהוא יכול:

  • הרשימה מתגלה מההיסטוריה, על ידי קריאת אותן שורות. כל תת־עץ שנוסף על ידי כל אחד, בכל כלי, מופיע.
  • מאגר המקור וה־ref נזכרים על ידי Gitcito, בתצורת ה־git של המאגר הזה. תת־עץ שהתגלה מההיסטוריה מתחיל עם השדות האלה ריקים — מלאו אותם פעם אחת, ומשיכה ודחיפה יעבדו מכאן והלאה.

הערכים הזכורים חיים תחת gitcito.subtree.* ב־.git/config, ולכן הם נשארים עם המאגר אבל אינם נוסעים לשכפול. שכחה מנקה אותם ולא נוגעת בשום דבר אחר.

הוספת תת־עץ

שדה משמעות
תיקייה היכן הוא ינחת, למשל vendor/parser. אסור שתהיה קיימת
מאגר המקור כתובת URL או נתיב בדיסק
ענף או תגית מה לייבא
מעיכה להכניס אותו כקומיט אחד במקום את כל ההיסטוריה שלו

השאירו מעיכה מופעלת אלא אם יש לכם סיבה. בלעדיה, כל קומיט של הספרייה משתרג לתוך ה־log שלכם לנצח, ו־git log מפסיק לעסוק בפרויקט שלכם.

לחיות עם זה

פעולה מה היא מריצה
משיכה git subtree pull — שינויי המקור נוחתים כמיזוג לתוך התיקייה שלכם
דחיפה git subtree push — השינויים המקומיים שלכם תחת התיקייה הזו חוזרים למקור
פיצול git subtree split -b <branch> — מחלץ את ההיסטוריה של התיקייה עצמה לענף, כשהקבצים בשורש שלו

פיצול הוא זה ששווה להכיר: הוא הופך תיקייה מוטמעת בחזרה להיסטוריה של מאגר עצמאי, וכך תת־עץ מפסיק להיות תת־עץ.

מגבלות ששווה להכיר

  • דחיפה איטית. היא מחשבת מחדש את ההיסטוריה של התיקייה מאפס בכל פעם. במאגר גדול זה שניות עד דקות, לא מיידי, ו־Gitcito יכול רק לחכות לזה.
  • משיכה היא מיזוג, ולכן היא יכולה להתנגש כמו כל מיזוג — תנחתו בפותר.
  • git subtree הוא סקריפט contrib, לא פקודה מובנית של git. התקנת git מקוצצת יכולה לא לכלול אותו; Gitcito אומר זאת בפשטות במקום להעביר הלאה ״'subtree' is not a git command״.
  • היסטוריה שנמעכה אינה ניתנת לפריסה מחדש אחר כך. הקומיטים מעולם לא יובאו.
  • Gitcito אינו ממיר תת־מודול לתת־עץ, ולא להפך.

ראו גם: מיזוג וריבייס · אינסטלציה עם ממשק

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