מסמך עזר של פקודת Repo

Repo משלים את Git על ידי הפשטת העבודה במספר מאגרים. הסבר על הקשר בין Repo ל-Git זמין במאמר כלים לבקרת גרסאות. למידע נוסף על Repo, אפשר לעיין בקובץ README של Repo.

השימוש ב-Repo מתבצע באופן הבא:

repo command options

רכיבים אופציונליים מוצגים בסוגריים []. לדוגמה, פקודות רבות מקבלות את הערך project-list כארגומנטים. אפשר לציין את project-list בתור רשימה של שמות או רשימה של נתיבים לספריות המקור המקומיות של הפרויקטים:

repo sync [project0 project1 ... projectn]
repo sync [/path/to/project0 ... /path/to/projectn]

עזרה

repo help

הצגת עזרה לגבי הפקודה repo. אפשר לראות מידע מפורט על פקודה ספציפית ב-Repo, על ידי ציון הפקודה כאפשרות:

repo help command

לדוגמה, הפקודה הבאה מחזירה תיאור ורשימת אפשרויות לפקודה init:

repo help init

לחלופין, כדי להציג רק את רשימת האפשרויות הזמינות לפקודה, מריצים את הפקודה:

repo command --help

לדוגמה:

repo init --help

init

repo init -u url [options]

התקנת Repo בספרייה הנוכחית. הפקודה הזו יוצרת את הספרייה .repo/ עם מאגרי Git לקוד המקור של ה-Repo ולקובצי המניפסט הרגילים של Android.

עכשיו אפשר:

  • -u: ציון כתובת URL שממנה מאחזרים מאגר מניפסט. המניפסט המשותף נמצא בכתובת https://android.googlesource.com/platform/manifest.

  • -m: בוחרים קובץ מניפסט בתוך המאגר. אם לא בוחרים שם למניפסט, ברירת המחדל היא default.xml.

  • -b: ציון גרסה, כלומר manifest-branch מסוים.

סנכרון

repo sync [project-list]

מורידים שינויים חדשים ומעדכנים את קובצי העבודה בסביבה המקומית, ובעצם מבצעים את הפקודה git fetch בכל מאגרי Git. אם מריצים את repo sync בלי ארגומנטים, המערכת מסנכרנת את הקבצים של כל הפרויקטים.

כשמריצים את הפקודה repo sync, זה מה שקורה:

  • אם הפרויקט אף פעם לא עבר סנכרון, הערך של repo sync זהה לערך של git clone. כל ההסתעפויות במאגר המרוחק מועתקות לספריית הפרויקט המקומית.

  • אם הפרויקט כבר סונכרן בעבר, הערך של repo sync יהיה שווה ל:

    git remote update
    git rebase origin/branch
    

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

אחרי הרצת repo sync, הקוד בפרויקטים שצוינו מעודכן ומסונכרן עם הקוד במאגר המרוחק.

אפשרויות מפתח:

  • -c: אחזור מהשרת רק את ההסתעפות הנוכחית של המניפסט.
  • -d: מחזירים פרויקטים ספציפיים לגרסה הקודמת של המניפסט. האפשרות הזו שימושית אם הפרויקט נמצא בהסתעפות של נושא, אבל צריך את הגרסה המתוקנת של המניפסט באופן זמני.
  • -f: ממשיכים בסנכרון של פרויקטים אחרים גם אם פרויקט מסוים לא מסתנכרן.
  • threadcount: חלוקת הסנכרון בין כמה שרשורים כדי לסיים אותו מהר יותר. חשוב לוודא שלא מעמיסים יותר מדי על המכונה – כדאי להשאיר חלק מהמעבד פנוי למשימות אחרות. כדי לראות את מספר מעבדי ה-CPU הזמינים, מריצים קודם את הפקודה nproc --all.
  • -q: הפעלה שקטה על ידי ביטול ההודעות על הסטטוס.
  • -s: סנכרון עם build תקין ידוע, כפי שמצוין ברכיב manifest-server במניפסט הנוכחי.

כדי להציג אפשרויות נוספות, מריצים את repo help sync.

העלה

repo upload [project-list]

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

לאחר מכן, כל השמירות (commits) בהסתעפויות שנבחרו מועברות ל-Gerrit דרך חיבור HTTPS. כדי להפעיל הרשאה להעלאה, צריך להגדיר סיסמה ל-HTTPS. כדי ליצור שם משתמש/סיסמה חדשים לשימוש ב-HTTPS, אפשר להיכנס אל הכלי ליצירת סיסמאות.

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

אם מריצים את repo upload בלי ארגומנטים, מתבצע חיפוש בכל הפרויקטים כדי למצוא שינויים להעלאה.

כדי לערוך שינויים אחרי שהם הועלו, משתמשים בכלי כמו git rebase -i או git commit --amend כדי לעדכן את ההתחייבויות המקומיות. כשמסיימים לערוך:

  • מוודאים שההסתעפות המעודכנת היא ההסתעפות הנוכחית שנשלחה.
  • מקישים על repo upload --replace PROJECT כדי לפתוח את עורך ההתאמה לשינויים.
  • לכל השמירה בסדרה, מזינים את מזהה השינוי ב-Gerrit בתוך הסוגריים:

    # Replacing from branch foo
    [ 3021 ] 35f2596c Refactor part of GetUploadableBranches to lookup one specific...
    [ 2829 ] ec18b4ba Update proto client to support patch set replacements
    # Insert change numbers in the brackets to add a new patch set.
    # To create a new change record, leave the brackets empty.
    

לאחר השלמת ההעלאה, השינויים מקבלים ערכת תיקון נוספת.

אם רוצים להעלות רק את ההסתעפות הנוכחית ב-Git, משתמשים בדגל --current-branch (או ב---cbr בקיצור).

אם מדובר בשינויים קשורים, מומלץ לשמור את כל בקשות העריכה באותו נושא. אפשר להוסיף שם לנושא בזמן ההעלאה באמצעות --topic=TOPIC. לחלופין, אפשר להעביר את הערך -t כדי שהשם של הנושא יהיה זהה לשם הסניף המקומי.

diff

repo diff [project-list]

הצגת השינויים הנותרים בין השמירה לבין עץ העבודה באמצעות git diff.

הורדה

repo download target change

הורדת השינוי שצוין ממערכת הבדיקה והפיכתו לזמין בספריית העבודה המקומית של הפרויקט.

לדוגמה, כדי להוריד את הקובץ change 23823 לספרייה platform/build:

repo download platform/build 23823

הפעלת repo sync מסירה את כל ההצהרות שהתקבלו באמצעות repo download. לחלופין, אפשר להשתמש בפקודה git checkout m/main כדי לבדוק את ההסתעפות מרחוק.

forall

repo forall [project-list] -c command

הפקודה הזו מפעילה את פקודת המעטפת שצוינה בכל פרויקט. משתני הסביבה הנוספים הבאים זמינים ב-repo forall:

  • השדה REPO_PROJECT מוגדר לשם הייחודי של הפרויקט.
  • REPO_PATH הוא הנתיב ביחס לשורש של הלקוח.
  • REPO_REMOTE הוא השם של המערכת המרוחקת מהמניפסט.
  • REPO_LREV הוא השם של הגרסה מהמניפסט, שמתורגם להסתעפות מעקב מקומית. משתמשים במשתנה הזה אם צריך להעביר את הגרסה של המניפסט לפקודת Git שפועלת באופן מקומי.
  • REPO_RREV הוא השם של הגרסה מהמניפסט, בדיוק כפי שהוא מופיע במניפסט.

עכשיו אפשר:

  • -c: הפקודה והארגומנטים לביצוע. הפקודה מוערכת דרך /bin/sh וכל הארגומנטים אחריה מועברים כפרמטרים תלויי מיקום של המעטפת.
  • -p: הצגת כותרות הפרויקט לפני הפלט של הפקודה שצוינה. כדי לעשות זאת, מקשרים צינורות לזרמים stdin, ‏ stdout ו-sterr של הפקודה, ומעבירים את כל הפלט לצינור רצוף שמוצג בסשן אחד של חלון קריאה.
  • -v: הצגת ההודעות שהפקודה כותבת ל-stderr.

שזיף

repo prune [project-list]

מחיקת נושאים שכבר מוזגו.

התחל

repo start branch-name [project-list]

התחלת הסתעפות חדשה לפיתוח, החל מהגרסה שצוינה במניפסט.

הארגומנט BRANCH_NAME מספק תיאור קצר של השינוי שאתם מנסים לבצע בפרויקטים. אם אתם לא יודעים, כדאי להשתמש בשם default.

הארגומנט project-list מציין אילו פרויקטים משתתפים בהסתעפות הזו של הנושא.

status

repo status [project-list]

השוואה בין עץ העבודה לאזור ההכנה (האינדקס) ולשינויים האחרונים שהועברו להסתעפות הזו (HEAD) בכל פרויקט שצוין. הצגת שורת סיכום לכל קובץ שבו יש הבדל בין שלושת המצבים האלה.

כדי לראות את הסטטוס של ההסתעפות הנוכחית בלבד, מריצים את הפקודה repo status .. סטטוס הבקשות מופיע לפי פרויקט. לכל קובץ בפרויקט משויך קוד בן שתי אותיות.

בעמודה הראשונה, אות גדולה מציינת את ההבדל בין אזור העברה לבין המצב האחרון שהתחייבו אליו.

Letter משמעות תיאור
- ללא שינוי זהים ב-HEAD ובאינדקס
A כבר הוספת לא נמצא ב-HEAD, נמצא באינדקס
M תאריך השינוי ב-HEAD, שונו באינדקס
D פריטים שנמחקו ב-HEAD, לא נוסף לאינדקס
R שם חדש לא נמצא ב-HEAD, הנתיב השתנה באינדקס
C הטקסט הועתק לא נמצא ב-HEAD, הועתק מקוד אחר באינדקס
T המצב השתנה אותו תוכן ב-HEAD ובאינדקס, המצב השתנה
U ללא מיזוג יש התנגשות בין HEAD לבין האינדקס. צריך לפתור את הבעיה

בעמודה השנייה, אות קטנה מציינת את ההבדל בין ספריית העבודה לבין המדד.

Letter משמעות תיאור
- חדש/לא ידוע לא נכללים באינדקס, נמצאים בעץ העבודה
m תאריך השינוי באינדקס, בעץ העבודה, שונה
d פריטים שנמחקו נמצאים באינדקס, ולא בעץ העבודה

טיפול בשגיאות במאגר

git commit -a # Commit local changes first so they aren't lost.
repo start branch-name # Start the branch
git reset --hard HEAD@{1} # And reset the branch so that it matches the commit before repo start
repo upload .

השגיאה repo: error: no branches ready for upload מופיעה כשהפקודה repo start לא הופעל בתחילת הסשן. כדי לשחזר את השינויים, אפשר לבדוק את מזהה השמירה, ליצור הסתעפות חדשה ולאחר מכן למזג אותה.