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

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

השימוש ב-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 בקיצור).

הבדל

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 לא הופעל בתחילת הסשן. כדי לשחזר את השינויים, אפשר לבדוק את מזהה השמירה, ליצור הסתעפות חדשה ולאחר מכן למזג אותה.