คือgit remote updateเทียบเท่าgit fetch?
คือgit remote updateเทียบเท่าgit fetch?
คำตอบ:
อัพเดท: ข้อมูลเพิ่มเติม!
ฉันควรทำสิ่งนี้ตั้งแต่เริ่มต้น: ฉันทำบันทึกประจำรุ่นของ Git ใน Git's repo Git (ดังนั้น meta!)
grep --color=always -R -C30 fetch Documentation/RelNotes/* | less
จากนั้นฉันก็lessทำการค้นหา--allและนี่คือสิ่งที่ฉันพบภายใต้บันทึกย่อประจำรุ่นสำหรับ Git เวอร์ชัน 1.6.6 :
git fetchเรียนรู้--allและ--multipleตัวเลือกต่าง ๆ เพื่อทำการดึงข้อมูลจากที่เก็บข้อมูลจำนวนมากและ--pruneตัวเลือกในการลบสาขาการติดตามระยะไกลที่ค้างอยู่ สิ่งเหล่านี้สร้างgit remote updateและgit remote pruneจำเป็นน้อยกว่า (ไม่มีแผนจะลบremote updateหรือremote pruneแม้กระทั่ง)
เวอร์ชั่น 1.6.6 ยังไม่ออกจนถึงวันที่ 23 ธันวาคม 2552และโปสเตอร์ต้นฉบับถามคำถามของเขาเมื่อวันที่ 6 ธันวาคม 2009
ดังนั้นอย่างที่คุณเห็นจากบันทึกประจำรุ่นผู้แต่งของ Git ทราบถึงความจริงที่ว่าgit remote updateฟังก์ชั่นคำสั่งนั้นทำซ้ำบ้างgit fetchแต่พวกเขาตัดสินใจที่จะไม่ลบมันอาจจะเป็นเพราะความเข้ากันได้ย้อนหลังกับสคริปต์และโปรแกรมที่มีอยู่หรืออาจเป็นเพราะ มันทำงานมากเกินไปและมีรายการที่มีลำดับความสำคัญสูงกว่า
คำตอบเดิมพร้อมรายละเอียดเพิ่มเติม
คำตอบของ xenoterracideอายุ 3.5 ปีในขณะนี้และ Git ได้ผ่านหลายรุ่นตั้งแต่นั้นมา (มันได้จากv1.6.5.5ถึง v1.8.3.2 ตามที่เขียนนี้) และดูที่เอกสารปัจจุบันของgit remote updateและgit fetchดูเหมือนว่า เหมือนกับที่พวกเขาทั้งสองสามารถปฏิบัติหน้าที่ได้เหมือนกันกับการดึงข้อมูลคอมมิทใหม่จากรีโมตหลาย ๆตัวเลือกทางเลือกและอาร์กิวเมนต์ที่ถูกต้อง
วิธีหนึ่งในการดึงข้อมูลรีโมตหลายตัวใช้--allธง:
git fetch --all
สิ่งนี้จะดึงข้อมูลจากรีโมทที่ตั้งค่าไว้ทั้งหมดของคุณโดยสมมติว่าคุณไม่ได้remote.<name>.skipFetchAllตั้งค่าไว้:
ถ้าเป็นจริงห่างไกลนี้จะถูกข้ามไปโดยปริยายเมื่อปรับปรุงโดยใช้คอมไพล์ดึงข้อมูล (1)หรือ subcommand ปรับปรุงของคอมไพล์ระยะไกล (1) - เอกสาร git-config
นี่จะเทียบเท่ากับการใช้
git remote update
โดยไม่ระบุกลุ่มรีโมตใด ๆ เพื่อดึงข้อมูลและยังไม่ได้remotes.defaultตั้งค่าในการกำหนดค่า repo ของคุณและยังไม่มีการremote.<name>.skipDefaultUpdateตั้งค่ารีโมตของคุณเป็นจริง
ปัจจุบัน 1.8.3.2 เอกสารสำหรับการกำหนดค่าของ Gitไม่ได้พูดถึงremotes.defaultการตั้งค่า แต่ผมปรึกษาผู้ทรงอำนาจของ Google เกี่ยวกับมันและพบคำอธิบายที่เป็นประโยชน์จากMislav Marohnić :
$ git config remotes.default 'origin mislav staging'
$ git remote update
# fetches remotes "origin", "mislav", and "staging"
คุณสามารถกำหนดรายการรีโมตเริ่มต้นที่จะถูกดึงโดย
remote updateคำสั่ง เหล่านี้สามารถรีโมทจากเพื่อนร่วมทีมสมาชิกชุมชนที่เชื่อถือได้ของโครงการโอเพนซอร์สหรือคล้ายกัน
ดังนั้นถ้าคุณremotes.defaultตั้งค่าไว้และไม่ใช่รีโมททั้งหมดที่มีอยู่ในรายการคุณgit remote updateจะไม่สามารถดึงข้อมูลรีโมททั้งหมดที่ repo ของคุณ "รู้"
สำหรับการremote.<name>.skipDefaultUpdateตั้งค่าเอกสาร Gitอธิบายได้ดังนี้:
ถ้าเป็นจริงห่างไกลนี้จะถูกข้ามไปโดยปริยายเมื่อปรับปรุงโดยใช้คอมไพล์ดึงข้อมูล (1)หรือ subcommand ปรับปรุงของคอมไพล์ระยะไกล (1)
แทนที่จะดึงข้อมูลรีโมตทั้งหมดทั้งสองfetchและremote updateอนุญาตให้คุณระบุรีโมตจำนวนมากและกลุ่มของรีโมตเพื่อดึง:
git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]
git fetch [<options>] <group>ช่วยให้คุณสามารถดึงรีโมตหลายตัวที่เป็นส่วนหนึ่งของกลุ่ม (ยืมตัวอย่างอื่นจากMislav ):
$ git config remotes.mygroup 'remote1 remote2 ...'
$ git fetch mygroup
git fetch --multipleช่วยให้คุณสามารถระบุที่เก็บและกลุ่มที่เก็บหลายแห่งเพื่อดึงในครั้งเดียว (จากเอกสาร ):
อนุญาตให้ระบุ
<repository>และ<group>ขัดแย้งกันหลายรายการ ไม่<refspec>sอาจระบุได้
ความคลุมเครือในgit remote updateเอกสาร
บทสรุปสำหรับgit remote updateระบุว่าไวยากรณ์คำสั่งดังต่อไปนี้:
git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…]
ขอให้สังเกตส่วนที่ผ่านมา[(<group> | <remote>)…]? จุดต่อท้าย...บ่งบอกว่าคุณสามารถระบุหลายกลุ่มและรีโมทด้วยคำสั่งซึ่งหมายความว่ามันทำงานในลักษณะเดียวกับgit fetch --multiple... ดูว่าไวยากรณ์ระหว่างทั้งสองมีความคล้ายคลึงกันอย่างไร
อย่างไรก็ตามในเอกสารเดียวกันคำอธิบายสำหรับupdateคำสั่งไม่ได้เกี่ยวกับการระบุหลายกลุ่มและการขัดแย้งระยะไกลเพียงอย่างเดียว
Fetch [e]
remotes.<group>การอัปเดตสำหรับชุดที่มีชื่อของรีโมทในพื้นที่เก็บข้อมูลตามที่กำหนดโดย
ดังนั้นจึงไม่มีความชัดเจนหากใช้git remote updateงานได้เหมือนกันgit fetch --multipleกับการระบุรีโมตเดี่ยวและกลุ่มรีโมตหลายกลุ่ม
ในที่สุดทุกคนรู้กรณีง่าย ๆ ของการดึงรีโมตเดียว:
git fetch <remote>
อาจเป็นกรณีที่คุณสามารถใช้
git remote update <remote>
เพื่อทำสิ่งเดียวกัน แต่อย่างที่ฉันได้กล่าวไว้ในหัวข้อก่อนหน้าเอกสารประกอบสำหรับgit remote updateยังไม่ชัดเจนเกี่ยวกับว่าเป็นไปได้ที่จะดึงข้อมูลอื่นนอกเหนือจากรีโมทกลุ่มเดียวที่มีคำสั่งหรือไม่
อย่างที่ฉันได้อธิบายไปแล้วgit fetchและมีgit remote updateพฤติกรรมคล้ายกันในการดึงข้อมูลจากรีโมทหลาย ๆ พวกเขาแบ่งปันไวยากรณ์และข้อโต้แย้งที่คล้ายคลึงกันแม้ว่าgit fetchจะสั้นกว่าดังนั้นผู้คนอาจพบว่าพิมพ์และใช้งานได้ง่ายขึ้น
อาจเป็นกรณีที่git remote updateไม่สามารถใช้ดึงรีโมทระยะไกลแบบเดียวได้git fetchแต่อย่างที่ฉันได้ชี้ให้เห็นแล้วเอกสารไม่ได้ทำให้ชัดเจน
นอกเหนือ
ความซ้ำซ้อนในการทำงานระหว่างคำสั่ง Git Porcelain ซึ่งเป็นตัวอย่างที่ดีที่สุดgit fetchและgit remote updateเหนือกว่านั้นไม่ซ้ำกัน ฉันสังเกตเห็นสถานการณ์ที่คล้ายกันกับgit rebase --ontoและgit cherry-pickในการที่ทั้งสองสามารถใช้ช่วงของความมุ่งมั่นที่จะแก้ไขบนฐานกระทำใหม่
ฉันเดาว่าเป็น Git ได้พัฒนากว่าปีที่ผ่านมาการทำงานบางอย่าง (หลีกเลี่ยงไม่ได้?) ซ้ำบางทีบางครั้งก็เป็นความสะดวกสบายสำหรับผู้ใช้ขั้นปลาย (ตัวอย่างเช่นมันง่ายที่จะผ่านช่วงไปcherry-pickกว่าที่จะผ่านเดียวกระทำซ้ำแล้วซ้ำอีก เพื่อเลือกช่วง) เห็นได้ชัดcherry-pickว่าไม่ได้ยอมรับช่วงของการกระทำตามที่อธิบายไว้ในบันทึกประจำรุ่น v1.7.2 :
git cherry-pickเรียนรู้ที่จะเลือกช่วงของการกระทำ (เช่นcherry-pick A..Bและcherry-pick --stdin) ทำเช่นนั้นgit revert;rebase [-i]แม้ว่าสิ่งเหล่านี้จะไม่สนับสนุนการควบคุมการเรียงลำดับที่ดีกว่า
ใช่และไม่. git remote updateดึงข้อมูลจากรีโมททั้งหมดไม่ใช่เพียงหนึ่งไฟล์
โดยไม่ต้องดูรหัสเพื่อดูว่าremote updateเป็นเพียงเชลล์สคริปต์ (เป็นไปได้) โดยทั่วไปแล้วจะทำการดึงข้อมูลสำหรับแต่ละรีโมท git fetchสามารถละเอียดมากขึ้น
git remote updateดู git-remote manpage
git remoteไม่เชลล์สคริปต์ แต่มัน spawns ในระหว่างการgit fetch remote update
git fetchตัวเลือกคำสั่งที่เทียบเท่าgit remote updateหรือไม่?
git fetch --all
git rebaseเป็นเหมือนmvและgit cherry-pickเป็นเช่นcpนั้น--ontoสวิทช์ไม่ได้เปลี่ยนที่ คุณสามารถรับผลกระทบการคัดลอกได้git rebaseเฉพาะเมื่อคุณระบุค่า SHA1 ไม่เช่นนั้นสาขาของคุณจะถูกย้าย!