คำถามที่ดีและเรียบง่าย - ฟังก์ชั่นของ "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 --tags
git remote update
git 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 pull
git pull --tags
git pull
จะไม่ได้รับแท็กทั้งหมดแต่เฉพาะที่สามารถเข้าถึงได้จากหัวสาขาปัจจุบัน แต่เรียกแท็กทั้งหมดและเห็นได้ชัดคือเทียบเท่ากับgit pull --tags
git fetch --tags
git fetch upstream --tags
ทำงานได้ดีมันจะได้รับแท็กใหม่เท่านั้นและจะไม่ได้รับรหัสฐานอื่น ๆ
upstream
origin
เรียกว่าตามปกติ ฉันคิดว่าupstream
เป็นชื่อที่ใช้โดย GitHub ในกรณีใด ๆ git remote
ชื่อเพื่อใช้เป็นหนึ่งที่แสดงโดย