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 updategit 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คือชื่อของระบบระยะไกลจาก ManifestREPO_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 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 เมื่อเริ่มต้นเซสชัน หากต้องการกู้คืน ให้ตรวจสอบรหัส Commit เริ่ม Branch ใหม่ แล้วผสาน Branch นั้น
โครงสร้างที่เก็บ Git
สำหรับ Android ที่เก็บ Git (โปรเจ็กต์) จะไม่ซ้อนกัน แต่ละโปรเจ็กต์จะเชื่อมโยงกับไดเรกทอรีที่เฉพาะเจาะจงใน Source Tree และไดเรกทอรีย่อยและไฟล์ทั้งหมดในไดเรกทอรีนั้นจะเป็นส่วนหนึ่งของโปรเจ็กต์เดียวกัน
หลีกเลี่ยงการใช้ฟีเจอร์ git submodule ของ Repo สำหรับการพัฒนา Android