วิธีข้ามป๊อปอัป“ Loose Object” เมื่อเรียกใช้ 'git gui'


123

เมื่อฉันเรียกใช้ 'git gui' ฉันจะได้รับป๊อปอัปที่ระบุว่า

ปัจจุบันที่เก็บนี้มีวัตถุหลวม ๆ ประมาณ 1,500 ชิ้น

จากนั้นแนะนำให้บีบอัดฐานข้อมูล ฉันเคยทำสิ่งนี้มาก่อนและมันจะลดวัตถุที่หลวมเหลือประมาณ 250 แต่นั่นไม่ได้ระงับป๊อปอัป การบีบอัดอีกครั้งไม่ได้เปลี่ยนจำนวนของวัตถุที่หลวม

เวิร์กโฟลว์ปัจจุบันของเราต้องการการใช้ 'rebase' อย่างมากในขณะที่เรากำลังเปลี่ยนจาก Perforce และ Perforce ยังคงเป็น SCM ที่ยอมรับได้ เมื่อ Git เป็น SCM ที่ยอมรับได้แล้วเราจะทำการผสานอย่างสม่ำเสมอและปัญหาของวัตถุที่หลวมควรได้รับการบรรเทาลงอย่างมาก

ในเวลานั้นฉันอยากจะให้ป๊อปอัป 'ประโยชน์' นี้หายไป


1
กล่องโต้ตอบดังกล่าวเป็นตัวอย่างที่ดีของ "คุณลักษณะ" ที่หลายคนคิดว่ามันไม่มีอยู่จริง ไม่เพียง แต่น่ารำคาญเท่านั้น แต่ยังสามารถลบการกระทำสำคัญที่หลุดออกไปหลังจากฮาร์ดรีเซ็ต
adelriosantiago

คำตอบ:


169

เนื่องจากยังไม่มีคำตอบฉันจึงตรวจสอบโค้ดเพื่อดูวิธีลบโค้ดที่แสดงกล่องโต้ตอบนั้น ฉันพบhint_gcขั้นตอนที่ทำและสถานที่ที่เรียก ในเวลาเดียวกันผมสังเกตเห็นว่าช่วงปลายปี 2011 มีการเพิ่มตัวเลือกการกำหนดค่าสำหรับการปิดการใช้งานโต้ตอบ การเปลี่ยนแปลงนี้ (ส่วนหนึ่งของคอมไพล์-GUI 0.16.0) รวมไปฉีด Git บน2011/12/14

ดังนั้นหากคุณใช้ Git v1.7.9 หรือใหม่กว่าคุณสามารถปิดใช้งานกล่องโต้ตอบคำเตือนด้วยคำสั่งต่อไปนี้:

git config --global gui.gcwarning false

หากคุณกำลังใช้เวอร์ชันเก่าคุณสามารถแก้ไข/lib/git-core/git-guiและลบafter 1000 hint_gcบรรทัดหรือแก้ไข/usr/share/git-gui/lib/database.tclและลบเนื้อหาของhint_gcขั้นตอน (เส้นทางไฟล์เหล่านี้อยู่บน Cygwin - ในสภาพแวดล้อมอื่นไฟล์อาจอยู่ในตำแหน่งอื่นสำหรับ Windows c:\Program Files\Git\mingw64\libexec\git-core\git-gui.tcl)


3
เราสามารถเพิ่มafter 1000 hint_gcเพื่อให้คำเตือนเกิดขึ้นหลังจาก10000วัตถุหลวมได้หรือไม่?
sashoalm

@sashoalm ฉันเห็นด้วย มันมีเหตุผล
HankCa

สงสัยว่าเหตุผลที่ดีคืออะไรบทสนทนานั้นเป็นความเจ็บปวดโดยไม่มีเหตุผลที่ดีอธิบายอย่างชัดเจนฉันรู้สึกอยากจะตีตามคำสั่งด้านบน
Josh Mc

2
@sashoalm: นี่อาจเป็นสิ่งที่คุณหมายถึง แต่ "1000" ของafter 1000หมายถึงจำนวนมิลลิวินาทีที่ต้องรอจนกว่ากล่องโต้ตอบจะปรากฏขึ้น เมื่อเพิ่มเป็น "10,000" กล่องโต้ตอบจะยังคงปรากฏขึ้น แต่จะใช้เวลา 10 วินาทีในการดำเนินการดังกล่าวแทน
fuglede

1
อย่างไรก็ตามตามที่กล่าวไว้ในคำตอบของ @NickDandoulakis database.tclมีคำจำกัดความของขีด จำกัด และสามารถเพิ่มได้เพื่อให้การโต้ตอบน้อยลง
fuglede

50

อัปเดต: git pruneจะ "แก้ไข" ปัญหาโดยจะลบวัตถุที่หลวมเหล่านั้นออก
(git gcเรียกgit pruneแต่เฉพาะสำหรับวัตถุหลวมที่มีอายุมากกว่าสองสัปดาห์โดยค่าเริ่มต้น)
อย่างไรก็ตามตามที่OP Michael Donohueกล่าวไว้ในความคิดเห็น:

ฉันชอบด้านความปลอดภัยในการเก็บสิ่งของที่หลวมไว้เป็นเวลาสองสัปดาห์ฉันควรย้อนกลับไปดูการแก้ไขเก่า ๆ บ้างดังนั้นฉันจึงไม่ชอบโซลูชันนี้มากนัก
ฉันไม่มีปัญหากับขนาดหรือประสิทธิภาพของคอมไพล์ แต่เป็นเพียง 'git gui' ที่ยืนยันว่าจะขอให้ฉันบีบอัดฐานข้อมูลแม้ว่าการบีบอัดฐานข้อมูลจะไม่มีผลใด ๆ


คำตอบเดิม:

มีรายงานปัญหา " git gc" การไม่นำวัตถุที่หลวมทั้งหมดออกก่อนหน้านี้ (ปลายปี 2008 " " git gc"ดูเหมือนจะไม่นำวัตถุที่หลวมอีกต่อไป "

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

" git gc" จะแกะวัตถุที่ไม่สามารถเข้าถึงได้และอยู่ในแพ็ค
เป็นผลให้จำนวนเนื้อที่ดิสก์ที่ใช้โดยที่เก็บ git สามารถเพิ่มขึ้นอย่างมากหลังจาก a "git gcดำเนินการ "" ซึ่งอาจเป็นเรื่องที่น่าแปลกใจสำหรับคนที่ทำงานใกล้จนเต็มในระบบไฟล์ของพวกเขาลบสาขาจำนวนหนึ่งออกจากที่เก็บการติดตาม แล้วทำ " git gc" อาจได้รับความประหลาดใจอย่างมาก

[ตัวอย่าง: ]สาขาเก่าจองผ่านแท็กเช่นnext-20081204.
หากคุณอัปเดตสำเนาภายในของที่linux-nextเก็บทุกวันคุณจะสะสมแท็กสาขาเก่าเหล่านี้เป็นจำนวนมาก
หากคุณลบทั้งชุดและเรียกใช้git-gcการดำเนินการจะใช้เวลาสักครู่และจำนวนบล็อกและ inodes ที่ใช้จะเพิ่มขึ้นอย่างมาก

สิ่งเหล่านี้จะหายไปหลังจาก " git prune" แต่เมื่อฉันดำเนินการทำความสะอาดนี้ฉันมักต้องการ--yes-I-know-what-I-am-doing-and-it's-unsafe-but-just-drop-the-unreachable-objects-cause-this-is-just-a-tracking-repositoryตัวเลือกในการ "คอมไพล์ gc"

แล้วในกรณีของคุณ " git prune" จะเป็นประโยชน์ไหม

(อาจใช้ "now" ในgc.pruneexpireตัวแปร config ซึ่งจำเป็นเพื่อให้พฤติกรรมข้างต้นเกิดขึ้น)


คุณยังมี (จากหัวข้อเดียวกัน):

repack -a -d -l

สังเกตตัวพิมพ์เล็ก "a"

git-gcเรียกการบรรจุใหม่ด้วยตัวพิมพ์ใหญ่ 'A' ซึ่งเป็นสาเหตุที่ทำให้วัตถุที่ไม่สามารถเข้าถึงได้ถูกคลายออก 'a' เล็กน้อยมีไว้สำหรับคนที่รู้ว่ากำลังทำอะไรอยู่และต้องการให้คอมไพล์เพียงวางวัตถุที่ไม่สามารถเข้าถึงได้


1
'git prune' น่าจะแก้ปัญหาเฉพาะหน้าของฉันได้ - ฉันจะลองภายหลังวันนี้ อย่างไรก็ตามฉันชอบความปลอดภัยในการเก็บสิ่งของที่หลวมไว้เป็นเวลาสองสัปดาห์ฉันควรย้อนกลับไปดูการแก้ไขเก่า ๆ บ้างดังนั้นฉันจึงไม่ชอบวิธีแก้ปัญหานี้ ฉันไม่มีปัญหากับขนาดหรือประสิทธิภาพของคอมไพล์ แต่เป็นเพียง 'git gui' ที่ยืนยันว่าจะขอให้ฉันบีบอัดฐานข้อมูลแม้ว่าการบีบอัดฐานข้อมูลจะไม่มีผลใด ๆ
Michael Donohue

ความคิดเห็นที่เป็นประโยชน์มาก ข้อความ "วัตถุหลวม" ที่น่ารำคาญนั้นเริ่มน่ารำคาญจริงๆ การนับนั้นมาจากไหนต่อไป? ผลลัพธ์ของ git-fsck บางที?
David Dombrowsky

ขอบคุณ - ฉันยังมีวัตถุหลวม ๆ ที่ git gc ไม่ได้ลบ - git prune คือคำตอบ
ฉาย

ฉันทำการตัด git นอกพื้นที่เก็บข้อมูลใด ๆ และล้างบางส่วนของวัตถุ จากนั้นฉันก็เข้าไปในที่เก็บปัญหาและทำการตัด git และปัญหาทั้งหมดก็หายไป
Nicholas Orlowski

"git prune" ช่วยแก้ปัญหาที่ OP (และฉัน) มี: "ฉันเคยทำสิ่งนี้มาก่อนและลดวัตถุที่หลวมลงเหลือประมาณ 250 แต่ไม่ได้ระงับป๊อปอัป"
Eike

32

เมื่อป๊อปอัป "Loose Object" ฉันรู้ว่าถึงเวลาเรียกใช้ตัวรวบรวมขยะของ git:

git gc

หลังจากนั้นป๊อปอัปก็หายไป

อัปเดต: (เนื่องจากคำแนะนำของ TED)

ฉันดึงรูทีนด้านล่างจากgit/share/git-gui/lib/database.tcl
คุณสามารถปรับเปลี่ยนให้ตรงกับความต้องการของคุณได้

proc hint_gc {} {
    set object_limit 8
    if {[is_Windows]} {
        set object_limit 1
    }

    set objects_current [llength [glob \
        -directory [gitdir objects 42] \
        -nocomplain \
        -tails \
        -- \
        *]]

    if {$objects_current >= $object_limit} {
        set objects_current [expr {$objects_current * 256}]
        set object_limit    [expr {$object_limit    * 256}]
        if {[ask_popup \
            [mc "This repository currently has approximately %i loose objects.

To maintain optimal performance it is strongly recommended that you compress the database when more than %i loose objects exist.

Compress the database now?" $objects_current $object_limit]] eq yes} {
            do_gc
        }
    }
}

1
ไม่คลิกตกลงในกล่องโต้ตอบเพื่อทำเช่นนั้น? หาก gc ไม่ได้กำจัดวัตถุที่หลวมทั้งหมดเขาก็ยังคงได้รับกล่องโต้ตอบ
TED

ฉันคลิก 'ตกลง' และฉันเรียกใช้ 'git gc' จากบรรทัดคำสั่ง - ทั้งคู่ทำให้ฉันเหลือ 250 แต่การทำอีกครั้งจะไม่มีความคืบหน้าเพิ่มเติม
Michael Donohue

3
ฉันรู้ว่ามันแปลก แต่บางครั้งการทำความสะอาดฐานจากกุ่ยก็ทำให้สิ่งของหลวม ๆ ฉันปิด gui เรียกใช้ git-gc แล้วขยะทั้งหมดก็หายไป
Nick Dandoulakis

3
การเปลี่ยน tcl ช่วยแก้ไข - ฉันเพิ่งเพิ่มขีด จำกัด windows เป็น 10 * 250 ขอบคุณ!
Michael Donohue

สำหรับฉันที่เรียกใช้git gcจากบรรทัดคำสั่งสามารถแก้ไขปัญหาได้ ... เพียงแค่คลิกokใน git gui ก็ไม่ได้ทำเคล็ดลับ ...
raphael

3

Hmmmm .... ฉันไม่เห็นอาร์กิวเมนต์บรรทัดคำสั่งสำหรับที่อยู่ในเอกสาร

ฉันคิดว่าคุณสามารถดึงซอร์สลงมาได้เสมอนำโค้ดออกจากกล่องโต้ตอบและสร้างใหม่

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