ข้อมูลอ้างอิงเกี่ยวกับคำสั่ง Repo

Repo ช่วยเสริมการทำงานของ Git ด้วยการทำให้การทำงานในที่เก็บหลายรายการง่ายขึ้น ดูคำอธิบายความสัมพันธ์ระหว่าง Repo กับ Git ได้ที่ เครื่องมือควบคุมซอร์สโค้ด ดูรายละเอียดเพิ่มเติมเกี่ยวกับ Repo ได้ที่ Repo README

การใช้ Repo จะมีรูปแบบดังนี้

repo command options

องค์ประกอบที่ไม่บังคับจะแสดงในวงเล็บเหลี่ยม [] เช่น คำสั่งจำนวนมากใช้อาร์กิวเมนต์ project-list คุณระบุ project-list เป็นรายการชื่อหรือรายการเส้นทางไปยังซอร์สในเครื่อง ไดเรกทอรีสำหรับโปรเจ็กต์ได้ดังนี้

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

help

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 และไฟล์ Manifest มาตรฐานของ Android

ตัวเลือก

  • -u: ระบุ URL ที่จะดึงข้อมูลที่เก็บ Manifest Manifest ทั่วไปจะอยู่ที่ https://android.googlesource.com/platform/manifest

  • -m: เลือกไฟล์ Manifest ภายในที่เก็บ หากไม่ได้เลือกชื่อ Manifest ระบบจะใช้ default.xml เป็นค่าเริ่มต้น

  • -b: ระบุการแก้ไข ซึ่งก็คือ manifest-branch ที่เฉพาะเจาะจง

สำหรับคำสั่ง Repo ที่เหลือทั้งหมด ไดเรกทอรีการทำงานปัจจุบันต้องเป็นไดเรกทอรีระดับบนของ .repo/ หรือไดเรกทอรีย่อยของไดเรกทอรีระดับบน

sync

repo sync [project-list]

ดาวน์โหลดการเปลี่ยนแปลงใหม่และอัปเดตไฟล์การทำงานในสภาพแวดล้อมในเครื่อง ซึ่งโดยพื้นฐานแล้วจะทำหน้าที่เหมือน git fetch ในที่เก็บ Git ทั้งหมด หากเรียกใช้ repo sync โดยไม่มีอาร์กิวเมนต์ ระบบจะซิงค์ไฟล์สำหรับโปรเจ็กต์ทั้งหมด

เมื่อเรียกใช้ repo sync สิ่งต่อไปนี้จะเกิดขึ้น

  • หากไม่เคยซิงค์โปรเจ็กต์มาก่อน repo sync จะเทียบเท่ากับ git clone โดยระบบจะคัดลอก Branch ทั้งหมดในที่เก็บระยะไกลไปยังไดเรกทอรีโปรเจ็กต์ที่อยู่ในเครื่อง

  • หากเคยซิงค์โปรเจ็กต์มาก่อน repo sync จะเทียบเท่ากับคำสั่งต่อไปนี้

    git remote update
    git rebase origin/branch
    

    โดยที่ branch คือ Branch ที่เช็คเอาต์อยู่ในปัจจุบันในไดเรกทอรีโปรเจ็กต์ในเครื่อง หาก Branch ในเครื่องไม่ได้ติดตาม Branch ในที่เก็บระยะไกล ระบบจะไม่ซิงค์โปรเจ็กต์

หลังจากเรียกใช้ repo sync สำเร็จแล้ว โค้ดในโปรเจ็กต์ที่ระบุจะเป็นเวอร์ชันล่าสุดและซิงค์กับโค้ดในที่เก็บระยะไกล

ตัวเลือกคีย์

  • -c: ดึงข้อมูลเฉพาะ Manifest Branch ปัจจุบันจากเซิร์ฟเวอร์
  • -d: เปลี่ยนโปรเจ็กต์ที่ระบุกลับไปเป็นการแก้ไข Manifest ตัวเลือกนี้มีประโยชน์หากโปรเจ็กต์อยู่ใน Topic Branch แต่จำเป็นต้องใช้การแก้ไข Manifest ชั่วคราว
  • -f: ดำเนินการซิงค์โปรเจ็กต์อื่นๆ ต่อไปแม้ว่าโปรเจ็กต์หนึ่งจะซิงค์ไม่สำเร็จ
  • -j threadcount: แยกการซิงค์ออกเป็นหลายเธรดเพื่อให้ เสร็จเร็วขึ้น ตรวจสอบว่าคุณไม่ได้ใช้ทรัพยากรของเครื่องมากเกินไป โดยให้ CPU บางส่วนสงวนไว้สำหรับงานอื่นๆ หากต้องการดูจำนวน CPU ที่พร้อมใช้งาน ให้เรียกใช้ nproc --all ก่อน
  • -q: เรียกใช้อย่างเงียบๆ โดยไม่แสดงข้อความสถานะ
  • -s: ซิงค์กับบิลด์ที่ทราบว่าดีตามที่ระบุโดยองค์ประกอบ manifest-server ใน Manifest ปัจจุบัน

หากต้องการดูตัวเลือกเพิ่มเติม ให้เรียกใช้ repo help sync

upload

repo upload [project-list]

อัปโหลดการเปลี่ยนแปลงไปยังเซิร์ฟเวอร์การตรวจสอบ สำหรับโปรเจ็กต์ที่ระบุ Repo จะเปรียบเทียบ Branch ในเครื่องกับ Branch ระยะไกลที่อัปเดตระหว่างการซิงค์ Repo ครั้งล่าสุด Repo จะแจ้งให้คุณเลือก Branch อย่างน้อย 1 รายการที่ยังไม่ได้อัปโหลดเพื่อตรวจสอบ

จากนั้นระบบจะส่ง Commit ทั้งหมดใน Branch ที่เลือกไปยัง Gerrit ผ่านการเชื่อมต่อ HTTPS คุณต้องกำหนดค่ารหัสผ่าน HTTPS เพื่อเปิดใช้การให้สิทธิ์อัปโหลด หากต้องการสร้างชื่อผู้ใช้และรหัสผ่านคู่ใหม่เพื่อใช้ผ่าน HTTPS, ไปที่ เครื่องมือสร้างรหัสผ่าน

เมื่อ Gerrit ได้รับข้อมูลออบเจ็กต์ผ่านเซิร์ฟเวอร์ ระบบจะเปลี่ยน Commit แต่ละรายการให้เป็นการเปลี่ยนแปลงเพื่อให้ผู้ตรวจสอบแสดงความคิดเห็นเกี่ยวกับ Commit ที่เฉพาะเจาะจงได้ หากต้องการรวม Commit จุดตรวจสอบหลายรายการเป็น Commit เดียว ให้ใช้ git rebase -i ก่อนเรียกใช้การอัปโหลด

หากเรียกใช้ repo upload โดยไม่มีอาร์กิวเมนต์ ระบบจะค้นหาการเปลี่ยนแปลงทั้งหมดที่จะอัปโหลดในโปรเจ็กต์ทั้งหมด

หากต้องการแก้ไขการเปลี่ยนแปลงหลังจากอัปโหลดแล้ว ให้ใช้ git rebase -i หรือ git commit --amend เพื่ออัปเดต Commit ในเครื่อง หลังจากแก้ไขเสร็จแล้ว ให้ทำดังนี้

  • ตรวจสอบว่า Branch ที่อัปเดตเป็น Branch ที่เช็คเอาต์อยู่ในปัจจุบัน
  • ใช้ repo upload --replace PROJECT เพื่อเปิดเครื่องมือแก้ไขการจับคู่การเปลี่ยนแปลง
  • สำหรับ Commit แต่ละรายการในซีรีส์ ให้ป้อนรหัสการเปลี่ยนแปลง 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 Branch ที่เช็คเอาต์อยู่ในปัจจุบัน ให้ใช้แฟล็ก --current-branch (หรือ --cbr)

สำหรับ CL ที่เกี่ยวข้อง ให้เก็บ CL ทั้งหมดไว้ในหัวข้อเดียวกัน เพิ่มชื่อหัวข้อขณะ อัปโหลดด้วย --topic=TOPIC หรือส่ง -t เพื่อตั้งชื่อหัวข้อเป็นชื่อ Branch ในเครื่อง

diff

repo diff [project-list]

แสดงการเปลี่ยนแปลงที่โดดเด่นระหว่าง Commit กับ Work Tree โดยใช้ git diff

download

repo download target change

ดาวน์โหลดการเปลี่ยนแปลงที่ระบุจากระบบการตรวจสอบและทำให้พร้อมใช้งานในไดเรกทอรีการทำงานในเครื่องของโปรเจ็กต์

ตัวอย่างเช่น หากต้องการดาวน์โหลด การเปลี่ยนแปลง 23823 ลงใน platform/build ไดเรกทอรี ให้ทำดังนี้

repo download platform/build 23823

การเรียกใช้ repo sync จะนำ Commit ที่ดึงข้อมูลด้วย repo download ออก หรือคุณจะเช็คเอาต์ Branch ระยะไกลโดยใช้ git checkout m/main ก็ได้

forall

repo forall [project-list] -c command

เรียกใช้คำสั่ง Shell ที่ระบุในแต่ละโปรเจ็กต์ repo forall จะทำให้ตัวแปรสภาพแวดล้อมเพิ่มเติมต่อไปนี้พร้อมใช้งาน

  • REPO_PROJECT จะตั้งค่าเป็นชื่อที่ไม่ซ้ำกันของโปรเจ็กต์
  • REPO_PATH คือเส้นทางที่สัมพันธ์กับรูทของไคลเอ็นต์
  • REPO_REMOTE คือชื่อของระบบระยะไกลจาก Manifest
  • REPO_LREV คือชื่อของการแก้ไขจาก Manifest ซึ่งแปลเป็น Branch การติดตามในเครื่อง ใช้ตัวแปรนี้หากต้องการส่งการแก้ไข Manifest ไปยังคำสั่ง Git ที่เรียกใช้ในเครื่อง
  • REPO_RREV คือชื่อของการแก้ไขจาก Manifest ตามที่เขียนไว้ใน Manifest ทุกประการ

ตัวเลือก

  • -c: คำสั่งและอาร์กิวเมนต์ที่จะเรียกใช้ ระบบจะประเมินคำสั่งผ่าน /bin/sh และส่งอาร์กิวเมนต์ใดก็ตามที่อยู่หลังคำสั่งเป็นพารามิเตอร์ตำแหน่ง Shell
  • -p: แสดงส่วนหัวของโปรเจ็กต์ก่อนเอาต์พุตของคำสั่งที่ระบุ การดำเนินการนี้ทำได้โดยการผูกไปป์กับสตรีม stdin, stdout และ stderr ของคำสั่ง และส่งเอาต์พุตทั้งหมดไปยังสตรีมต่อเนื่องที่แสดงในเซสชันเพจเจอร์เดียว
  • -v: แสดงข้อความที่คำสั่งเขียนไปยัง stderr

prune

repo prune [project-list]

ตัด (ลบ) หัวข้อที่ผสานแล้ว

start

repo start branch-name [project-list]

เริ่ม Branch ใหม่สำหรับการพัฒนาโดยเริ่มจากการแก้ไขที่ระบุใน Manifest

อาร์กิวเมนต์ BRANCH_NAME จะให้คำอธิบายสั้นๆ เกี่ยวกับการเปลี่ยนแปลงที่คุณพยายามทำกับโปรเจ็กต์ หากไม่ทราบ ให้ลองใช้ชื่อ default

อาร์กิวเมนต์ project-list จะระบุโปรเจ็กต์ที่จะเข้าร่วมใน Topic Branch นี้

status

repo status [project-list]

เปรียบเทียบ Work Tree กับพื้นที่พัก (ดัชนี) และ Commit ล่าสุดใน Branch นี้ (HEAD) ในแต่ละโปรเจ็กต์ที่ระบุ แสดงบรรทัดสรุปสำหรับแต่ละไฟล์ที่มีความแตกต่างระหว่าง 3 สถานะนี้

หากต้องการดูสถานะของ Branch ปัจจุบันเท่านั้น ให้เรียกใช้ repo status . ข้อมูลสถานะจะแสดงตามโปรเจ็กต์ ระบบจะใช้รหัส 2 ตัวอักษรสำหรับแต่ละไฟล์ในโปรเจ็กต์

ในคอลัมน์แรก ตัวอักษรตัวพิมพ์ใหญ่จะระบุความแตกต่างระหว่างพื้นที่พักกับสถานะที่ Commit ล่าสุด

ตัวอักษร ความหมาย คำอธิบาย
- ไม่มีการเปลี่ยนแปลง เหมือนกันใน HEAD และดัชนี
A เพิ่มแล้ว ไม่อยู่ใน HEAD แต่อยู่ในดัชนี
M แก้ไขแล้ว อยู่ใน HEAD แต่แก้ไขในดัชนี
D ลบแล้ว อยู่ใน HEAD แต่ไม่อยู่ในดัชนี
R เปลี่ยนชื่อแล้ว ไม่อยู่ใน HEAD แต่เส้นทางเปลี่ยนไปในดัชนี
C คัดลอกแล้ว ไม่อยู่ใน HEAD แต่คัดลอกมาจากรายการอื่นในดัชนี
T เปลี่ยนโหมดแล้ว เนื้อหาเดียวกันใน HEAD และดัชนี แต่โหมดเปลี่ยนไป
U ไม่ได้ผสาน เกิดความขัดแย้งระหว่าง HEAD กับดัชนี ต้องมีการแก้ไข

ในคอลัมน์ที่ 2 ตัวอักษรตัวพิมพ์เล็กจะระบุความแตกต่างระหว่างไดเรกทอรีการทำงาน กับดัชนี

ตัวอักษร ความหมาย คำอธิบาย
- ใหม่/ไม่รู้จัก ไม่อยู่ในดัชนี แต่อยู่ใน Work Tree
m แก้ไขแล้ว อยู่ในดัชนีและ Work Tree แต่แก้ไขแล้ว
d ลบแล้ว อยู่ในดัชนี แต่ไม่อยู่ใน Work Tree

จัดการข้อผิดพลาดของ Repo

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 เมื่อเริ่มต้นเซสชัน หากต้องการกู้คืน ให้ตรวจสอบรหัส Commit เริ่ม Branch ใหม่ แล้วผสาน Branch นั้น

โครงสร้างที่เก็บ Git

สำหรับ Android ที่เก็บ Git (โปรเจ็กต์) จะไม่ซ้อนกัน แต่ละโปรเจ็กต์จะเชื่อมโยงกับไดเรกทอรีที่เฉพาะเจาะจงใน Source Tree และไดเรกทอรีย่อยและไฟล์ทั้งหมดในไดเรกทอรีนั้นจะเป็นส่วนหนึ่งของโปรเจ็กต์เดียวกัน หลีกเลี่ยงการใช้ฟีเจอร์ git submodule ของ Repo สำหรับการพัฒนา Android