הפניות לפקודות של 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: להמשיך בסנכרון של פרויקטים אחרים גם אם הסנכרון של פרויקט מסוים נכשל.
  • -j threadcount: פיצול הסנכרון בין השרשורים כדי להשלים אותו מהר יותר. חשוב לוודא שלא מעמיסים על המחשב יותר מדי – צריך להשאיר חלק מה-CPU שמור למשימות אחרות. כדי לראות את מספר המעבדים הזמינים, קודם מריצים את הפקודה nproc --all.
  • -q: הפעלה שקטה על ידי הסתרת הודעות סטטוס.
  • -s: מסנכרן עם build תקין מוכר, כפי שמצוין ברכיב manifest-server במניפסט הנוכחי.

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

העלה

repo upload [project-list]

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

כל הקומיטים בענפים שנבחרו מועברים ל-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

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

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

עכשיו אפשר:

  • -c: פקודה וארגומנטים להפעלה. הפקודה מוערכת באמצעות /bin/sh וכל הארגומנטים שאחריה מועברים כפרמטרים תלויי מיקום של מעטפת.
  • -p: הצגת כותרות הפרויקט לפני הפלט של הפקודה שצוינה. הפעולה הזו מתבצעת על ידי קישור צינורות לזרמי stdin,‏ stdout ו-sterr של הפקודה, והעברת כל הפלט לזרם רציף שמוצג בסשן יחיד של pager.
  • -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 .. פרטי הסטטוס מפורטים לפי פרויקט. לכל קובץ בפרויקט יש קוד בן שתי אותיות.

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

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

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

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