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

סנכרון

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.

upload

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 look up 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 כדי להגדיר את שם הנושא לשם הסניף המקומי.

השוואה

repo diff [project-list]

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

download

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 ו-stderr של הפקודה, והעברת כל הפלט לזרם רציף שמוצג בסשן יחיד של pager.
  • -v: הצגת ההודעות שהפקודה כותבת ל-stderr.

prune

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 לבין index; נדרש פתרון

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

Letter משמעות תיאור
- חדש/לא ידוע לא באינדקס, בעץ העבודה
m עבר שינוי באינדקס, בעץ העבודה, שונה
י' נמחק באינדקס, לא בעץ העבודה

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

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

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

מבנה מאגר Git

ב-Android, מאגרי Git (פרויקטים) לא מוטמעים אחד בתוך השני. כל פרויקט משויך לספרייה ספציפית בעץ המקור, וכל תיקיות המשנה והקבצים שמתחת לספרייה הזו הם חלק מאותו פרויקט. אל תשתמשו בתכונה git submodule של Repo לפיתוח ל-Android.