คุณควรใช้ git-gc บ่อยแค่ไหน?


233

คุณควรใช้ git-gc บ่อยแค่ไหน?

หน้าคู่มือเพียงแค่พูดว่า:

ผู้ใช้ควรได้รับการสนับสนุนให้ทำงานนี้เป็นประจำในแต่ละพื้นที่เก็บข้อมูลเพื่อรักษาการใช้พื้นที่ดิสก์ที่ดีและประสิทธิภาพการทำงานที่ดี

มีคำสั่งให้วัตถุบางอย่างนับเพื่อตรวจสอบว่าถึงเวลาที่ต้องใช้ gc หรือไม่?


งานเช่นนี้เป็นตัวเลือกสำคัญสำหรับ cron (ถ้าคุณใช้ linux) minhajuddin.com/2011/12/09/ …
Khaja Minhajuddin

1
หมายเหตุ: การตั้งค่าgc.autodetach(Git 2.0 Q2 2014) สามารถช่วยให้ทำงานได้git gc --autoโดยไม่ต้องมีการบล็อกผู้ใช้ ดูคำตอบของฉันด้านล่าง
VonC

คำตอบ:


204

ขึ้นอยู่กับปริมาณพื้นที่เก็บข้อมูลที่ใช้ ด้วยผู้ใช้หนึ่งคนทำการเช็คอินวันละครั้งและการทำงานของสาขา / การผสาน / ฯลฯ สัปดาห์ละครั้งคุณอาจไม่จำเป็นต้องเรียกใช้มันมากกว่าปีละครั้ง

ด้วยนักพัฒนาหลายโหลที่ทำงานกับโครงการหลายโหลแต่ละการตรวจสอบใน 2-3 ครั้งต่อวันคุณอาจต้องการเรียกใช้มันทุกคืน

มันจะไม่เจ็บที่จะเรียกใช้บ่อยกว่าที่จำเป็น

สิ่งที่ฉันทำคือเรียกใช้ตอนนี้สัปดาห์จากนี้ทำการวัดการใช้ประโยชน์ดิสก์เรียกใช้อีกครั้งและวัดการใช้ประโยชน์ดิสก์อีกครั้ง หากขนาดลดลง 5% ให้รันสัปดาห์ละครั้ง ถ้ามันลดลงมากแล้วเรียกใช้บ่อยขึ้น ถ้ามันลดลงน้อยกว่านั้นให้เรียกใช้มันน้อยลง


17
Manual กล่าวว่า "คำสั่ง git บางคำสั่งรัน git gc - อัตโนมัติหลังจากทำการดำเนินการที่สามารถสร้างวัตถุหลวมจำนวนมาก" ใครรู้ว่าคำสั่งใดทำงานจริงหรือไม่
Joshua Dance

2
การรีคอมไพล์ git ขนาดใหญ่เป็นตัวอย่างที่ชัดเจนเนื่องจากคอมมิชชันจำนวนมากถูกเขียนใหม่ในประวัติใหม่ทำให้มีคอมมิชชันเก่า ๆ มากมายใน repo ของคุณซึ่งเป็นส่วนหนึ่งของสาขาปัจจุบันอีกต่อไป
mafrosis

20
"จะไม่เจ็บที่จะเรียกใช้บ่อยกว่าที่ต้องการ" ... ฉันไม่เห็นด้วยทั้งหมด อริสโตเติลชี้ให้เห็นว่าการมุ่งมั่นห้อยสามารถสร้างกลไกการสำรองข้อมูลที่ดีได้
Jason Baker

105

โปรดทราบว่าข้อเสียของการรวบรวมที่เก็บขยะคือที่เก็บขยะ ดังที่เราทุกคนรู้จักในฐานะผู้ใช้คอมพิวเตอร์ไฟล์ที่เราพิจารณาขยะตอนนี้อาจกลายเป็นสิ่งที่มีค่ามากในอนาคตในอีกสามวัน ความจริงที่ว่าคอมไพล์เก็บเศษซากส่วนใหญ่ไว้รอบ ๆ ได้ช่วยเบคอนของฉันหลายครั้ง - โดยการค้นหาทั้งหมดที่ห้อยต่องแต่งฉันได้กู้คืนงานจำนวนมากที่ฉันกระป๋องโดยไม่ตั้งใจ

ดังนั้นอย่าเป็นคนที่คลั่งไคล้ในโคลนส่วนตัวมากเกินไป ไม่จำเป็นต้องใช้มัน

OTOH ค่าของการกู้คืนข้อมูลเป็นที่น่าสงสัยสำหรับ repos ที่ใช้เป็นรีโมทเช่น สถานที่ devs ทั้งหมดผลักดันและ / หรือดึงออกมาจาก อาจมีเหตุผลที่จะเริ่มการแข่งขัน GC และการบรรจุใหม่บ่อยครั้ง


38
FWIW ไม่ใช่วัตถุที่หลวมทั้งหมดเป็นขยะที่เก็บรวบรวมเฉพาะค่าที่เก่ากว่า 2 สัปดาห์โดยค่าเริ่มต้น (cf. git gc --helpโดยเฉพาะตัว--pruneเลือก) นอกจากนี้ยังมีการกล่าวถึงgc.reflogExpireซึ่งทำให้ฉันเชื่อว่าคำสัญญาใด ๆ ที่คุณเยี่ยมชมใน 90 วันที่ผ่านมาจะไม่ถูกรวบรวม (รุ่นคอมไพล์ของฉัน: v1.7.6)
RobM

30

git รุ่นล่าสุดรัน gc โดยอัตโนมัติเมื่อจำเป็นดังนั้นคุณไม่ควรทำอะไรเลย ดูที่ส่วนตัวเลือกของman git-gc (1) : "คำสั่ง git บางคำสั่งรัน git gc - อัตโนมัติหลังจากทำการดำเนินการที่สามารถสร้างวัตถุที่หลวมได้"


13
ฉันเพิ่งวิ่งเป็นครั้งแรกในพื้นที่เก็บข้อมูลหลายปีและ. git ของฉันเปลี่ยนจาก 16M เป็น 2.9M ลดลง 82% ดังนั้นจึงยังคงมีประโยชน์ในการเรียกใช้คำสั่งด้วยตนเอง
Darshan Rivka Whittle

@DarshanRivkaWhittle คุณเคยปรับปรุงคอมไพล์มาหลายปีแล้วหรือยัง?
std''OrgnlDave

1
@ std''OrgnlDave ใช่ฉันมักจะเรียกใช้สิ่งที่เป็นรุ่นปัจจุบันบน Arch ฉันเพิ่งวิ่งอีกครั้งอาจเป็นครั้งแรกนับตั้งแต่ความคิดเห็นล่าสุดของฉัน (ขอบคุณความคิดเห็นของคุณเตือนฉัน) และ. git ของฉันไปจาก 81M ถึง 13M ฉันต้องไม่เรียกใช้คำสั่งใด ๆ ที่รันgc --autoฉันเดา
Darshan Rivka Whittle

18

หากคุณใช้Git-Gui ระบบจะแจ้งให้คุณทราบเมื่อคุณควรกังวล:

This repository currently has approximately 1500 loose objects.

คำสั่งต่อไปนี้จะนำหมายเลขที่คล้ายกัน:

$ git count-objects

ยกเว้นจากแหล่งที่มาของมัน git-gui จะทำคณิตศาสตร์ด้วยตัวเองจริง ๆ แล้วนับบางสิ่งบางอย่างที่.git/objectsโฟลเดอร์และอาจนำมาซึ่งการประมาณ (ฉันไม่รู้tclจะอ่านอย่างถูกต้อง!)

ไม่ว่าในกรณีใดดูเหมือนว่าจะมีการแจ้งเตือนตามหมายเลขที่สุ่มประมาณ 300 วัตถุที่หลวม


แน่นอนมันเตือน แต่เมื่อให้มันทำงาน gc ส่วนใหญ่เวลา gc จะไม่ทำอะไรเลย ดังนั้นการพึ่งพา git gui ในการทำมันคือการรอให้วัตถุที่หลวมกว่า 6,000 ชิ้นมีอยู่เสมอโดยต้องคลิกที่ run gc และรอสักครู่หรือยกเลิก: / อาจมีคนควรแก้ไข git gui ในแบบที่มันจะตรวจสอบ max หลวม การนับวัตถุและไม่รบกวนการแสดงข้อความโต้ตอบจนกว่าการนับจะถึงขีด จำกัด
mlatu

ใช่ @mlatu ฉันเห็นด้วย เมื่อฉันเขียนสิ่งนี้ฉันเพียงต้องการที่จะให้ความสนใจกับมัน ทั้งคู่Git-Guiและcount-objectsไม่ใช่คำตอบที่ดีสำหรับคำถามที่นี่ ... แต่ควรเป็น!
cregox

ฉันไม่ได้หมายความว่านี่เป็นคำตอบที่ไม่ดีอยากจะชี้ให้เห็นว่าส่วนใหญ่ git gui ไม่ทำอะไรเลย แม้ว่าฉันคิดว่า git gc ก็ไม่ได้ทำอะไรมากนักยกเว้นเมื่อมีมากพอที่จะทำหรือคุณใช้สวิตช์เชิงรุก
mlatu


7

ฉันใช้ git gc หลังจากฉันเช็คเอาต์ใหญ่และมีของใหม่มากมาย มันสามารถประหยัดพื้นที่ เช่นถ้าคุณเช็คเอาต์โครงการ SVN ขนาดใหญ่โดยใช้ git-svn และทำ git gc คุณมักจะประหยัดพื้นที่ได้มาก


สิ่งนี้ยังคงเป็นจริงหรือไม่? แม้ในพื้นที่ '08 HDD ราคาถูกใช้เป็นเหตุผลในการเรียกใช้ดูเหมือนว่าไม่มีจุดหมาย
Thymine

7

คุณสามารถทำมันได้โดยไม่หยุดชะงักใด ๆ กับใหม่ (2.0 ไตรมาสที่ 2 ปี 2014 Git) gc.autodetachการตั้งค่า

ดูคอมมิท 4c4ac4dและคอมมิชชัน 9f673f9 ( NguyễnTháiNgọc Duy, aka pclouds ):

gc --autoใช้เวลาและสามารถปิดกั้นผู้ใช้ชั่วคราว (แต่ไม่รบกวนน้อยลง)
ทำให้มันทำงานในพื้นหลังบนระบบที่รองรับ
สิ่งเดียวที่หายไปเมื่อทำงานในพื้นหลังคืองานพิมพ์ แต่gc outputไม่น่าสนใจจริงๆ คุณสามารถเก็บไว้ในเบื้องหน้าโดยการเปลี่ยน
gc.autodetach


นับได้ว่าปล่อย 2.0 มีข้อผิดพลาดแม้ว่า: คอมไพล์ 2.7 (ไตรมาสที่ 4 ปี 2015) จะให้แน่ใจว่าจะไม่สูญเสียเกิดข้อผิดพลาด
ดูกระทำ 329e6e8 (19 กันยายน 2015) โดยNguyễnTháiNgọc Duy (pclouds )
(ผสานโดยJunio ​​C Hamano - gitster-ในการกระทำ 076c827 , 15 ตุลาคม 2558)

gc: บันทึกบันทึกจาก daemonized gc --autoและพิมพ์ครั้งต่อไป

ในขณะที่คอมมิต 9f673f9 ( gc: ตัวเลือกการกำหนดค่าสำหรับการทำงาน--autoในพื้นหลัง - 2014-02-08) ช่วยลดการร้องเรียนบางอย่างเกี่ยวกับ ' gc --auto' การเทอร์มินัลเทอร์มินัลมันสร้างปัญหาอีกชุดหนึ่ง

ล่าสุดในชุดนี้คือเนื่องจากผลลัพธ์ของ daemonizing stderrถูกปิดและคำเตือนทั้งหมดจะหายไป การเตือนเมื่อสิ้นสุดcmd_gc()มีความสำคัญอย่างยิ่งเพราะจะเป็นการบอกผู้ใช้ถึงวิธีหลีกเลี่ยงการgc --autoทำงานซ้ำ ๆ" "
เนื่องจาก stderr ถูกปิดผู้ใช้ไม่ทราบตามธรรมชาติพวกเขาบ่นเกี่ยวกับการgc --autoสูญเสียซีพียู

Daemonized gcในขณะนี้จะช่วยประหยัดการstderr ต่อไปนี้จะไม่ทำงานและ$GIT_DIR/gc.log
gc --autogc.loggc.log
พิมพ์ออกมาจนกว่าจะมีการลบผู้ใช้


6

คำพูดนี้นำมาจาก; การควบคุมเวอร์ชันด้วย Git

Git เรียกใช้การรวบรวมขยะโดยอัตโนมัติ :

•หากมีวัตถุหลวมมากเกินไปในพื้นที่เก็บข้อมูล

•เมื่อมีการผลักดันไปยังพื้นที่เก็บข้อมูลระยะไกลเกิดขึ้น

•หลังจากคำสั่งบางอย่างที่อาจแนะนำวัตถุที่หลวมหลาย ๆ

•เมื่อบางคำสั่งเช่น git reflog หมดอายุขออย่างชัดเจน

และสุดท้ายการรวบรวมขยะเกิดขึ้นเมื่อคุณร้องขออย่างชัดเจนโดยใช้คำสั่ง git gc แต่เมื่อไร ไม่มีคำตอบที่ชัดเจนสำหรับคำถามนี้ แต่มีคำแนะนำและแนวทางปฏิบัติที่ดี

คุณควรพิจารณาใช้ git gc ด้วยตนเองในบางสถานการณ์:

•หากคุณเพิ่งกรอก git filter-branch จำได้ว่าสาขาตัวกรองเขียนหลายคอมมิตแนะนำใหม่และทิ้งอันเก่าไว้ในการอ้างอิงที่ควรลบออกเมื่อคุณพอใจกับผลลัพธ์ วัตถุที่ตายแล้วทั้งหมด (ที่ไม่ได้ถูกอ้างอิงอีกต่อไปเนื่องจากคุณเพิ่งลบผู้อ้างอิงที่ชี้ไปที่พวกเขาออก) ควรถูกลบออกโดยการรวบรวมขยะ

•หลังจากคำสั่งบางอย่างที่อาจแนะนำวัตถุที่หลวมหลาย ๆ นี่อาจเป็นความพยายามในการรีบูตครั้งใหญ่

และในทางกลับกันคุณควรระวังการเก็บขยะหรือไม่

•หากมีผู้อ้างอิงเด็กกำพร้าที่คุณอาจต้องการกู้คืน

•ในบริบทของ git rerere และคุณไม่จำเป็นต้องบันทึกความละเอียดตลอดไป

•ในบริบทของแท็กและกิ่งไม้เท่านั้นที่เพียงพอที่จะทำให้ Git รักษาความมุ่งมั่นอย่างถาวร

•ในบริบทของการดึงข้อมูล FETCH_HEAD (การดึง URL โดยตรงผ่านการเรียก git) เนื่องจากอยู่ภายใต้การรวบรวมขยะทันที


2
ฉันมีความมุ่งมั่นที่ไม่สามารถเข้าถึงได้ในต้นไม้ของฉัน (เป็นผลมาจากgit commit --amend) git log --reflogนี้สามารถตรวจสอบได้ด้วย ฉันผลักสาขาไปยังที่เก็บระยะไกลและตรวจสอบต้นไม้ของฉันอีกครั้ง ความมุ่งมั่นที่ไม่สามารถเข้าถึงได้ยังคงอยู่ที่นั่น เห็นได้ชัดgit gcว่าไม่ได้ทำงานเมื่อเกิดการผลักดันนี้ …?
chharvey

4

ฉันใช้เมื่อฉันกระทำที่ยิ่งใหญ่เหนือสิ่งอื่นใดเมื่อฉันลบไฟล์เพิ่มเติมจากที่เก็บ .. หลังจากนั้นคอมมิทจะเร็วขึ้น


1

คุณไม่จำเป็นต้องใช้git gcบ่อยนักเพราะgit gc(การรวบรวมขยะ) จะทำงานโดยอัตโนมัติในหลาย ๆ คำสั่งที่ใช้บ่อย:

git pull
git merge
git rebase
git commit

ที่มา: git gc แนวทางปฏิบัติที่ดีที่สุดและคำถามที่พบบ่อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.