คำถามที่ดีและเรียบง่าย - ฟังก์ชั่นของ "git fetch" เป็นชุดย่อยที่เข้มงวดgit fetch --tagsหรือไม่?
คือถ้าฉันวิ่งgit fetch --tagsจะมีเหตุผลgit fetchอะไรไหมที่จะวิ่งตรงต่อไปทันที?
สิ่งที่เกี่ยวกับgit pullและgit pull --tags? สถานการณ์เดียวกัน
คำถามที่ดีและเรียบง่าย - ฟังก์ชั่นของ "git fetch" เป็นชุดย่อยที่เข้มงวดgit fetch --tagsหรือไม่?
คือถ้าฉันวิ่งgit fetch --tagsจะมีเหตุผลgit fetchอะไรไหมที่จะวิ่งตรงต่อไปทันที?
สิ่งที่เกี่ยวกับgit pullและgit pull --tags? สถานการณ์เดียวกัน
คำตอบ:
หมายเหตุ: การเริ่มต้นด้วยคอมไพล์ 1.9 / 2.0 (ไตรมาสที่ 1 ปี 2014) , git fetch --tagsเรียกแท็กนอกเหนือไปจากสิ่งที่เป็นความจริงโดยบรรทัดคำสั่งเดียวกันโดยไม่เลือกที่
ดูคอมมิชชัน c5a84e9โดยMichael Haggerty (mhagger) :
ก่อนหน้านี้
--tagsตัวเลือกของการดึงข้อมูลถือเป็นค่าเทียบเท่ากับการระบุตัวอ้างอิงrefs/tags/*:refs/tags/*บนบรรทัดคำสั่ง โดยเฉพาะอย่างยิ่งทำให้การ
remote.<name>.refspecกำหนดค่าจะถูกละเว้นแต่มันไม่ได้มีประโยชน์มากในการดึงข้อมูลแท็กโดยไม่ได้เรียกอ้างอิงอื่น ๆ ในขณะที่มันเป็นประโยชน์มากที่จะสามารถดึงข้อมูลแท็กที่นอกเหนือไปจากการอ้างอิงอื่น ๆ
ดังนั้นเปลี่ยนซีแมนทิกส์ของตัวเลือกนี้ให้ทำหลังหากผู้ใช้ต้องการที่จะดึงแท็กเท่านั้นก็ยังเป็นไปได้ที่จะระบุการอ้างอิงอย่างชัดเจน:
git fetch <remote> 'refs/tags/*:refs/tags/*'โปรดทราบว่าเอกสารก่อน 1.8.0.3 นั้นไม่ชัดเจนเกี่ยวกับ
fetch --tagsพฤติกรรมของ " "
กระทำ f0cb2f1 (2012-12-14)fetch --tagsทำให้เอกสารตรงกับพฤติกรรมเก่า
การกระทำนี้เปลี่ยนเอกสารเพื่อให้ตรงกับพฤติกรรมใหม่ (ดูDocumentation/fetch-options.txt)ขอให้ดึงแท็กทั้งหมดจากระยะไกลเพิ่มเติมจากสิ่งอื่นที่ถูกดึงออกมา
ตั้งแต่ Git 2.5 (Q2 2558) git pull --tagsแข็งแกร่งกว่า:
ดูคอมมิชชั่น 19d122bโดยPaul Tan ( pyokagan) , 13 พฤษภาคม 2558
(ผสานโดยJunio C Hamano - gitster-ในคอมมิชชัน cc77b99 , 22 พฤษภาคม 2558)
pull: ลบ--tagsข้อผิดพลาดในกรณีที่ไม่มีผู้สมัครผสานตั้งแต่441ed41 ("
git pull --tags": ข้อผิดพลาดออกมาพร้อมกับข้อความที่ดีกว่า, 2007-12-28, Git 1.5.4+)git pull --tagsจะพิมพ์ข้อความแสดงข้อผิดพลาดที่แตกต่างกันหากgit-fetchไม่ได้คืนผู้สมัครผสาน:It doesn't make sense to pull all tags; you probably meant: git fetch --tagsเนื่องจากในขณะนั้น
git-fetch --tagsจะแทนที่ refspecs ที่กำหนดค่าไว้และดังนั้นจึงไม่มีผู้สมัครผสาน ข้อความแสดงข้อผิดพลาดจึงถูกนำมาใช้เพื่อป้องกันความสับสนอย่างไรก็ตามตั้งแต่c5a84e9 (
fetch --tags: ดึงแท็กนอกเหนือจาก สิ่งอื่น ๆ 2013-10-30, Git 1.9.0+)git fetch --tagsจะดึงแท็กนอกเหนือจากผู้อ้างอิงที่กำหนดค่าไว้
ดังนั้นหากมีสถานการณ์ที่ไม่มีผู้สมัครผสานเกิดขึ้นนั่นไม่ใช่เพราะ--tagsถูกตั้งค่าไว้ ดังนั้นข้อความแสดงข้อผิดพลาดพิเศษนี้จึงไม่เกี่ยวข้องเพื่อป้องกันความสับสนให้ลบข้อความแสดงข้อผิดพลาดนี้
ด้วย Git 2.11+ (Q4 2016) git fetchนั้นเร็วกว่า
ดูกระทำ 5827a03 (13 ตุลาคม 2016) โดยเจฟฟ์คิง (peff )
ผสานโดยJunio C Hamano - gitster- in 9fcd144 , 26 Oct 2016)
fetch: ใช้ "ด่วน"has_sha1_fileสำหรับการติดตามแท็กเมื่อดึงข้อมูลจากระยะไกลที่มีแท็กจำนวนมากที่ไม่เกี่ยวข้องกับสาขาที่เราติดตามเราเคยเสียวงจรมากเกินไปเมื่อตรวจสอบว่าวัตถุที่ชี้ไปที่แท็ก (ว่าเราจะไม่เรียก!) มีอยู่ในพื้นที่เก็บข้อมูลของเรา อย่างระมัดระวังเกินไป
แพทช์นี้สอนการดึงข้อมูลเพื่อใช้ HAS_SHA1_QUICK เพื่อเสียสละความแม่นยำสำหรับความเร็วในกรณีที่เราอาจมีชีวิตชีวาด้วยการบรรจุใหม่พร้อมกัน
นี่คือผลลัพธ์จากสคริปต์ perf ที่รวมอยู่ซึ่งตั้งค่าสถานการณ์คล้ายกับที่อธิบายข้างต้น:
Test HEAD^ HEAD
----------------------------------------------------------
5550.4: fetch 11.21(10.42+0.78) 0.08(0.04+0.02) -99.3%
สิ่งนั้นใช้สำหรับสถานการณ์ที่:
- คุณมีชุดจำนวนมากที่ฝั่งไคลเอ็นต์เพื่อทำให้
reprepare_packed_git()มีราคาแพง (ส่วนที่แพงที่สุดคือการค้นหารายการที่ซ้ำกันในรายการที่ไม่เรียงลำดับซึ่งเป็นกำลังสองกำลังสอง)- คุณต้องมีการอ้างอิงแท็กจำนวนมากในฝั่งเซิร์ฟเวอร์ที่เป็นตัวเลือกสำหรับการติดตามอัตโนมัติ (เช่นที่ลูกค้าไม่มี) แต่ละอันจะทริกเกอร์การอ่านไดเรกทอรีแพ็คอีกครั้ง
- ภายใต้สถานการณ์ปกติลูกค้าจะติดตามแท็กเหล่านั้นโดยอัตโนมัติและหลังจากการดึงครั้งใหญ่ครั้งหนึ่ง (2) จะไม่เป็นจริงอีกต่อไป
แต่ถ้าแท็กเหล่านั้นชี้ไปที่ประวัติซึ่งถูกตัดการเชื่อมต่อจากสิ่งที่ลูกค้าเรียกมาแท็กเหล่านั้นจะไม่ติดตามอัตโนมัติและผู้สมัครเหล่านั้นจะส่งผลกระทบต่อทุกการเรียก
Git 2.21 (กุมภาพันธ์ 2019) ดูเหมือนว่าจะมีการแนะนำให้รู้จักการถดถอยเมื่อตั้งค่าremote.origin.fetchเป็นไม่ได้หนึ่งเริ่มต้น ( '+refs/heads/*:refs/remotes/origin/*')
fatal: multiple updates for ref 'refs/tags/v1.0.0' not allowed
Git 2.24 (Q4 2019) เพิ่มการเพิ่มประสิทธิภาพอื่น
ดูกระทำ b7e2d8b (15 กันยายน 2019) โดยมาซายะซูซูกิ (draftcode )
(รวมโดยJunio C Hamano - gitster-ในการกระทำ 1d8b0df , 7 ตุลาคม 2019)
fetch: ใช้oidsetเพื่อรักษา OID ที่ต้องการเพื่อการค้นหาที่รวดเร็วขึ้นระหว่าง
git fetchนั้นลูกค้าจะตรวจสอบว่า OID ของแท็กที่โฆษณานั้นมีอยู่แล้วในชุดการร้องขอการดึงข้อมูลของคำขอดึงข้อมูล
การตรวจสอบนี้ทำในการสแกนเชิงเส้น
สำหรับพื้นที่เก็บข้อมูลที่มีจำนวนมากอ้างอิงซ้ำการสแกนนี้ใช้เวลา 15+ นาทีเพื่อเร่งความเร็วให้สร้าง
oid_setสำหรับ OID ผู้อ้างอิงคนอื่น
git fetch <remote> <branch>แท็กที่ติดตามอัตโนมัติ (เนื่องจากมีการอัปเดตการติดตามระยะไกลแล้วจากความตั้งใจดั้งเดิม): public-inbox.org/git/…
หมายเหตุ: คำตอบนี้ใช้ได้สำหรับ git v1.8 และเก่ากว่าเท่านั้น
สิ่งเหล่านี้ส่วนใหญ่ได้รับการกล่าวถึงในคำตอบและความคิดเห็นอื่น ๆ แต่นี่เป็นคำอธิบายสั้น ๆ :
git fetchดึงส่วนหัวสาขาทั้งหมด (หรือทั้งหมดที่ระบุโดยตัวเลือกการกำหนดค่า remote.fetch) กระทำทั้งหมดที่จำเป็นสำหรับพวกเขาและแท็กทั้งหมดที่สามารถเข้าถึงได้จากสาขาเหล่านี้ ในกรณีส่วนใหญ่แท็กทั้งหมดสามารถเข้าถึงได้ด้วยวิธีนี้git fetch --tagsดึงแท็กทั้งหมดทั้งหมดที่จำเป็นสำหรับแท็กเหล่านั้น จะไม่อัปเดตหัวสาขาแม้ว่าจะสามารถเข้าถึงได้จากแท็กที่ดึงมาแล้วสรุป: หากคุณต้องการอัพเดททั้งหมดโดยใช้การดึงข้อมูลเท่านั้นคุณต้องทำทั้งสองอย่าง
นอกจากนี้ยังไม่ "ช้าเป็นสองเท่า" เว้นแต่คุณจะหมายถึงการพิมพ์บนบรรทัดคำสั่งซึ่งในกรณีนี้นามแฝงจะแก้ปัญหาของคุณ ไม่มีค่าใช้จ่ายในการทำคำขอทั้งสองเนื่องจากพวกเขาจะขอข้อมูลที่แตกต่างกัน
git remote updateไม่จริงทดแทนและ git fetch จะไม่อัปเดตแท็กที่มีอยู่ซึ่งมีการเปลี่ยนแปลงแม้ว่าจะนำแท็กใหม่มาด้วย เพียง แต่จะมีการปรับปรุงแท็กที่มีอยู่แล้ว git fetch --tagsgit remote updategit fetch --tags
ฉันจะตอบคำถามนี้ด้วยตัวเอง
ฉันตัดสินใจแล้วว่ามีความแตกต่าง "git fetch --tags" อาจนำแท็กทั้งหมดมาใช้ แต่จะไม่นำมาใช้ใหม่!
กลายเป็นสิ่งที่เราต้องทำเพื่อให้เป็น "ทันสมัย" โดยสิ้นเชิงคือการทำซ้ำ "git pull" โดยไม่ต้องรวม:
$ git fetch --tags
$ git fetch
นี่เป็นความอัปยศเพราะมันช้าเป็นสองเท่า หากมีเพียง "git fetch" เท่านั้นที่มีตัวเลือกให้ทำสิ่งที่มันทำตามปกติและนำแท็กทั้งหมดมาด้วย
git remote update myRemoteRepo': จะดึงเนื้อหาและแท็กระยะไกลหรือไม่
git fetchตลอดเวลาและจะดึงข้อผูกพันใหม่และแท็กใหม่ ๆ คุณใช้ Git เวอร์ชันใด
git fetchจะไม่จับแท็กที่ไม่ได้อยู่ในบันทึกการกระทำของสาขา jQuery UI ทำเช่นนี้บนแท็กเผยแพร่ เราทำgit checkout -b temp-branch, ทำรีลีสของเรา, เพิ่มไฟล์ที่จำเป็นสำหรับรีลีส, อัพเดตเวอร์ชั่น ฯลฯ จากgit commit -m "1.10.x" ; git tag 1.10.x; git push --tagsนั้นเราจะลบสาขาชั่วคราวของเรา ไม่มีสาขาระยะไกลที่มาถึงแท็กนั้นและgit fetchจะไม่ดาวน์โหลดเลย
ปัญหาทั่วไปที่นี่เป็นที่จะเรียกgit fetch +refs/heads/*:refs/remotes/$remote/*หากการกระทำเหล่านี้มีแท็กแท็กเหล่านั้นจะถูกดึงข้อมูล อย่างไรก็ตามหากมีแท็กที่ไม่สามารถเข้าถึงได้โดยสาขาใด ๆ บนรีโมทพวกเขาจะไม่สามารถดึงข้อมูลได้
--tagsตัวเลือกสวิทช์ refspec +refs/tags/*:refs/tags/*ไป คุณสามารถขอgit fetchให้จับทั้งสอง ฉันค่อนข้างมั่นใจว่าgit fetch && git fetch -tคุณจะใช้คำสั่งต่อไปนี้:
git fetch origin "+refs/heads/*:refs/remotes/origin/*" "+refs/tags/*:refs/tags/*"
และถ้าคุณต้องการให้ค่าเริ่มต้นสำหรับ repo นี้คุณสามารถเพิ่ม refspec ตัวที่สองในการดึงข้อมูลเริ่มต้น:
git config --local --add remote.origin.fetch "+refs/tags/*:refs/tags/*"
นี่จะเพิ่มfetch =บรรทัดที่สองใน.git/configสำหรับรีโมทนี้
ฉันใช้เวลาซักพักหนึ่งเพื่อหาวิธีจัดการกับโครงการนี้ นี่คือสิ่งที่ฉันมาด้วย
git fetch -fup origin "+refs/*:refs/*"
ในกรณีของฉันฉันต้องการคุณสมบัติเหล่านี้
refs/*:refs/*+ก่อนที่จะมีการอ้างอิง-u-p-f--tagsตัวเลือกจะเปลี่ยน refspec เป็น+refs/tags/*:refs/tags/*" แม้ว่า, man git-fetchดูเหมือนว่าจะระบุ refspec ที่ไม่มีส่วนนำหน้า+( refs/tags/*:refs/tags/*)
remote.origin.fetchค่าเริ่มต้น +refs/heads/*:refs/remotes/origin/*คือ+เวอร์ชันใช่ไหม (ซึ่งหมายความว่าที่มา / สาขาจะถูกเขียนทับไม่ว่าที่มา / สาขาอยู่ที่ใดในขณะนี้)
git --tagsมีการดึงแท็กนอกเหนือจากทุกอย่างแล้ว ดูคำตอบของ @VonC
ในสถานการณ์ส่วนใหญ่git fetchควรทำในสิ่งที่คุณต้องการซึ่งเป็น 'รับสิ่งใหม่ ๆ จากที่เก็บระยะไกลและวางไว้ในสำเนาในเครื่องของคุณโดยไม่ต้องรวมกับสาขาท้องถิ่นของคุณ' git fetch --tagsทำเช่นนั้นยกเว้นว่าจะไม่ได้รับอะไรนอกจากแท็กใหม่
ในความรู้สึกที่git fetch --tagsอยู่ในทางที่ superset git fetchของ มันเป็นความจริงตรงกันข้าม
git pullของหลักสูตรคืออะไร git fetch <thisrefspec>; git mergeแต่เสื้อคลุมสำหรับเป็น ขอแนะนำให้คุณทำความคุ้นเคยกับการทำgit fetchไอเอ็นgit mergeจีด้วยตัวเองก่อนที่จะข้ามไปgit pullเพียงเพราะช่วยให้คุณเข้าใจสิ่งที่git pullกำลังทำอยู่ในตอนแรก
git fetchที่ถูกกล่าวว่าความสัมพันธ์เป็นเหมือนกันเช่นเดียวกับ เป็นเซ็ตของgit pullgit pull --tags
git pullจะไม่ได้รับแท็กทั้งหมดแต่เฉพาะที่สามารถเข้าถึงได้จากหัวสาขาปัจจุบัน แต่เรียกแท็กทั้งหมดและเห็นได้ชัดคือเทียบเท่ากับgit pull --tags git fetch --tags
git fetch upstream --tags
ทำงานได้ดีมันจะได้รับแท็กใหม่เท่านั้นและจะไม่ได้รับรหัสฐานอื่น ๆ
upstreamoriginเรียกว่าตามปกติ ฉันคิดว่าupstreamเป็นชื่อที่ใช้โดย GitHub ในกรณีใด ๆ git remoteชื่อเพื่อใช้เป็นหนึ่งที่แสดงโดย