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 updategit 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 lostrepo start branch-name # Start the branchgit reset --hard HEAD@{1} # Reset the branch so that it matches the commit before repo startrepo upload .
השגיאה repo: error: no branches ready for upload מופיעה כשהפקודה repo start לא הופעלה בתחילת הסשן. כדי לשחזר, בודקים את מזהה הקומיט, מתחילים ענף חדש ואז ממזגים אותו.
מבנה מאגר Git
ב-Android, מאגרי Git (פרויקטים) לא מוטמעים אחד בתוך השני. כל פרויקט משויך לספרייה ספציפית בעץ המקור, וכל תיקיות המשנה והקבצים שמתחת לספרייה הזו הם חלק מאותו פרויקט.
אל תשתמשו בתכונה git submodule של Repo לפיתוח ל-Android.