สถานะ Git ใช้เวลานานในการทำให้เสร็จสมบูรณ์


85

ฉันกำลังใช้gitเพื่อจัดการไฟล์ในไดเร็กทอรีโลคัลบนเครื่อง Windows - ที่นี่ไม่มีเครือข่ายเกี่ยวข้องฉันไม่ได้ผลักหรือดึงเข้า / จากเครื่องอื่น ไดเร็กทอรีของฉันอาจมี 100 ไฟล์ในนั้นไฟล์ทดสอบทั้งหมดค่อนข้างเล็ก เมื่อฉันวิ่งgit statusเป็นประจำจะใช้เวลาประมาณ 20-30 วินาที เป็นเรื่องปกติหรือไม่? มีอะไรที่ฉันสามารถทำได้เพื่อเร่งความเร็วหรือวิธีที่ดีกว่าในการดูสถานะของที่เก็บของฉัน (ไฟล์ที่เปลี่ยนแปลงไฟล์ที่ไม่ได้ติดตาม ฯลฯ ) gitคำสั่งอื่น ๆดูเหมือนจะเสร็จเร็วกว่ามาก


คุณใช้คอมไพล์เวอร์ชันใด โปรดพิจารณาขอความช่วยเหลือทั้งใน msysGit Google Group หรือในรายชื่ออีเมล git (git [at] vger.kernel.org คุณไม่จำเป็นต้องสมัครสมาชิก) อาจเป็นข้อบกพร่องในคอมไพล์
Jakub Narębski

คำตอบ:


129

คุณลองgit gc แล้วหรือยัง? สิ่งนี้จะทำความสะอาดส่วนที่ขาดออกจาก git repo


3
ดูเหมือนจะทำเคล็ดลับแล้ว ฉันแปลกใจมากแม้ว่าหลังจากยอมรับเพียงไม่กี่ครั้งที่เก็บจะมีของมากมายที่สามารถทำความสะอาดได้ - ขอบคุณ!
Matt McMinn

4
ฮิฮิฉันเพิ่งรันgit statusโดยใช้timeคำสั่งและได้เวลา "จริง" ที่ 30.464 วินาที จากนั้นผมก็วิ่งไปgit gcแล้วtime git statusอีกครั้งและมีเวลาจริงของ 35.409s ค่อนข้างแปลก
RyanScottLewis

14
สิ่งนี้แก้ไขฉันจาก 33 วินาทีเหลือน้อยกว่า 1 วินาทีสำหรับที่เก็บส่วนใหญ่ของฉัน คงจะดีไม่น้อยถ้า Git จะบอกให้คุณทำเมื่อคุณเริ่มไปถึงจุดนั้น ฉันไม่เคยรู้ว่ามันจำเป็น
XP84

เมื่อเรียกใช้git statusหลายครั้งติดต่อกันการรันครั้งต่อ ๆ ไปจะใช้เวลาเพียงเศษเสี้ยวของการวิ่งครั้งแรก ดังนั้นหากคุณกำลังทำงานgit statusจากgit gcนั้นgit statusอีกครั้งคาดว่ามันจะทำงานได้เร็วมาก
kiewic

7

ในปัญหาที่คล้ายกันฉันพบว่าการมี git repo ในไดเร็กทอรีด้านล่าง git repo ที่มีอยู่ทำให้การทำงานช้าลงอย่างมาก

ฉันย้าย git repo สำรองไปที่อื่นและตอนนี้ความเร็วก็เร็ว!


ฉันเพิ่มปัญหาที่คล้ายกัน สิ่งที่ทำให้เกิด git เริ่มต้นในไดเร็กทอรีย่อย ปัญหาที่เกิดขึ้นคือ subdir ถูกซ่อนไว้ (คุณต้องทำสถานะ git ภายในเพื่อดูการเปลี่ยนแปลง) แต่ฉันเดาว่า git ยังคงพยายามคำนวณอยู่ ฉันไม่สนใจ subdir และตอนนี้ทุกอย่างเรียบร้อยดี
mb14

6

คุณใช้ซอฟต์แวร์ป้องกันไวรัสบางชนิดหรือไม่? บางทีนั่นอาจเป็นการรบกวนสิ่งต่างๆ gitเร็วมากสำหรับฉันบน windows ที่มีที่เก็บไฟล์มากกว่า 1,000 ไฟล์


1
ใช่นายจ้างได้รับคำสั่งให้ TrendMicro OfficeScan ฉันฆ่าโปรแกรมสแกนไวรัสผลลัพธ์เดียวกันกับสถานะคอมไพล์
Matt McMinn

1
อีกรูปแบบหนึ่งของชุดรูปแบบนี้คือซอฟต์แวร์เข้ารหัสที่ใช้งานได้ทันทีเช่น Credant ซึ่งสามารถทำให้กล่องของคุณช้าลงอย่างมาก
Don Branson

นี่คือปัญหาสำหรับฉัน โปรแกรมป้องกันไวรัส Kaspersky ที่ถูกฆ่าและสถานะกลับมาเป็น <1 วินาที
Robin Winslow

5

คุณลองบรรจุใหม่หรือยัง? git-repackGit-หีบห่อ

มิฉะนั้นให้ลองทำซ้ำไดเร็กทอรีและลบโฟลเดอร์. git ในไดเร็กทอรีที่ซ้ำกัน จากนั้นสร้างไดเรกทอรี git ใหม่และดูว่ายังช้าอยู่หรือไม่

หากยังช้าอยู่แสดงว่าระบบหรือฮาร์ดแวร์มีปัญหา Git เสร็จสิ้นสถานะของไฟล์หลายร้อยไฟล์ให้ฉันในเวลาไม่ถึง 5 วินาที


ดูเหมือนว่า repack จะช่วยได้ - หลังจากเรียกใช้แล้วฉันก็วิ่งสถานะและมันกลับมาทันที อย่างไรก็ตามฉันรอสองสามวินาทีและเรียกใช้สถานะอีกครั้งและใช้เวลา 30 วินาที ฉันลองทำซ้ำไดเร็กทอรีและพบปัญหาเดียวกัน
Matt McMinn

อืมน่าสนใจ คุณมีไดรฟ์ภายนอกหรือไม่? หรือแท่งแฟลช USB? ลองคัดลอก repo ตรงนั้นและดูว่ามีความแตกต่างหรือไม่ เป็นไปได้ว่ามีปัญหากับไดรฟ์ที่เปิดอยู่
thedz

ไม่แตกต่างกับไดรฟ์ USB
Matt McMinn

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

4

ด้วยเหตุผลบางประการทำให้git statusช้าโดยเฉพาะหลังจากย้ายหรือคัดลอกโฟลเดอร์ที่เก็บไปยังตำแหน่งใหม่

การเรียกใช้ครั้งต่อ ๆ ไปมักจะเร็วกว่าในกรณีนี้


1
มีวิธีหลีกเลี่ยงความช้านี้ในการวิ่งครั้งแรกหรือไม่? ฉันลอง git gc แล้ว แต่ก็ไม่ได้ผลไม่ใช่ปัญหาเพราะมันเกิดขึ้นในครั้งแรกหลังจากคัดลอกไฟล์เท่านั้น
franksands

ฉันไม่ทราบวิธีหลีกเลี่ยงความช้าในตอนแรก แต่ถ้ามีคำสั่งบางอย่างที่สามารถทำได้ก็อาจจะทำเช่นเดียวกับgit statusคำสั่งเริ่มต้นดังนั้นอาจต้องใช้เวลาเท่ากันในการดำเนินการ
DanJAB

4

ของฉันgit statusช้ามาก (ไม่เกินหนึ่งนาที) เนื่องจาก.gitignoreไฟล์ส่วนกลางอยู่ในโปรไฟล์ผู้ใช้ windows ของฉันซึ่งถูกเก็บไว้ในการแชร์เครือข่ายที่ไม่สามารถเข้าถึงได้

git config --global core.excludesfile
แสดงสิ่งที่ชอบ \\Nxxxx0\User\Username\Eigene Dateien\gitignore_global.txt

ด้วยเหตุผลบางประการ\\Nxxxx0ไม่สามารถเข้าถึงได้และโปรไฟล์ผู้ใช้ของฉันถูกโหลดจากระบบสำรองข้อมูล\\Nxxxxx1ก็ไม่สามารถเข้าถึงและโปรไฟล์ของฉันถูกโหลดจากระบบสำรองข้อมูลต้องใช้เวลาพอสมควรในการคิดออกเพราะโดยปกติโปรไฟล์ผู้ใช้ของฉันจะถูกผูกไว้กับอักษรระบุไดรฟ์โดยสคริปต์เริ่มต้นขององค์กรและการเข้าถึงอักษรระบุไดรฟ์นั้นทำงานได้ตามปกติ ฉันไม่แน่ใจว่าทำไม git-config จึงใช้การแชร์เครือข่ายไม่ใช่อักษรระบุไดรฟ์ (อาจเป็นคนที่อายุน้อยกว่าฉันต้องตำหนิ)

หลังจากการตั้งค่า
git config --global core.excludesfile $HOME/Eigene\ Dateien/gitignore_global.txt
git statusกลับสู่ความเร็วปกติ



3

สำหรับฉันความช้าเกิดจากการมีไฟล์ที่ไม่ได้ติดตามจำนวนมาก (ไฟล์ชั่วคราวและไฟล์ที่ส่งออกจากสคริปต์) git status -unoซึ่งไม่รวมไฟล์ที่ไม่ได้ติดตามทำงานได้เร็วขึ้นมากและตรงตามความต้องการของฉัน


1

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

ฉันเพิ่งลบ repos จำนวนมากซึ่งฉันไม่ต้องการในเครื่องอีกต่อไปและสถานะ git ของฉันก็เปลี่ยนจาก 1 นาที ~ เป็น 5 วินาที

ฉันไม่เห็นคำตอบที่คล้ายกับที่นี่


1
ฉันไม่คิดว่าสิ่งนี้จะส่งผลต่อมาตรฐานที่git statusคุณเรียกใช้ในไดเรกทอรีเดียว แต่อย่างใด หากที่เก็บของคุณถูกเช็คเอาต์เป็นไดเร็กทอรีที่แตกต่างกันคุณสามารถเรียกใช้git statusทีละรายการเท่านั้น อาจเป็นเรื่องที่แตกต่างออกไปหาก git repos ของคุณทับซ้อนกัน แต่นั่นก็เป็นความคิดที่ไม่ดี
Hubert Grzeskowiak

@HubertGrzeskowiak ทำได้แน่นอน พวกเขาอยู่ในที่ต่างๆบนฮาร์ดไดรฟ์สำหรับฉัน แต่มันส่งผลต่อเวลาในการโหลดของฉันอย่างมากเมื่อพิมพ์สถานะคอมไพล์ หลังจากลบที่เก็บที่ซ้ำกันแล้วมันก็เร็วขึ้นทันทีจากหลายนาทีเป็น 5 วินาที
Jack Perry

1

ด้านหนึ่งของการgit statusที่จะได้รับการปรับปรุงให้ดีขึ้น (ใน Git 2.14.x / 2.15, Q4 2017) คือเมื่อมันแสดงให้เห็นว่าไม่สนใจไฟล์เช่นกัน ( git status --ignored)

" git status --ignored" เมื่อสังเกตเห็นว่าไดเร็กทอรีที่ไม่มีเส้นทางที่ติดตามถูกละเว้นจะยังคงระบุพา ธ ที่ถูกละเว้นทั้งหมดในไดเร็กทอรีซึ่งไม่จำเป็น
codepath ได้รับการปรับให้เหมาะสมเพื่อหลีกเลี่ยงค่าใช้จ่ายนี้

ดูกระทำ 5aaa7fd (18 กันยายน 2017) โดยเจมสันมิลเลอร์ (jamill )
(รวมโดยJunio C Hamano - gitster-ในการกระทำ 075bc9c , 29 กันยายน 2017)

ปรับปรุงประสิทธิภาพของ git status --ignored

ปรับปรุงประสิทธิภาพของตรรกะการแสดงรายการไดเร็กทอรีเมื่อต้องการแสดงรายการไดเร็กทอรีที่ละเว้นที่ไม่ว่างเปล่า เพื่อแสดงไดเร็กทอรีที่ละเว้นที่ไม่ว่างเปล่าตรรกะที่มีอยู่จะวนซ้ำผ่านเนื้อหาทั้งหมดของไดเร็กทอรีที่ละเว้น
การเปลี่ยนแปลงนี้แนะนำการปรับให้เหมาะสมเพื่อหยุดการทำซ้ำผ่านเนื้อหาเมื่อพบไฟล์แรก สิ่งนี้สามารถมีการปรับปรุงประสิทธิภาพ 'git status --ignored' อย่างมีนัยสำคัญในที่เก็บที่มีไฟล์จำนวนมากในไดเรกทอรีที่ละเว้น

สำหรับตัวอย่างความแตกต่างของประสิทธิภาพบนที่เก็บตัวอย่างที่มีไฟล์ 196,000 ไฟล์ใน 400 ไดเร็กทอรีที่ละเว้น:

| Command                    |  Time (s) |
| -------------------------- | --------- |
| git status                 |   1.2     |
| git status --ignored (old) |   3.9     |
| git status --ignored (new) |   1.4     |

สำหรับการปรับปรุงเพิ่มเติม (ตั้งค่าใน Git 2.17, Q2 2018) ดูคำตอบนี้


ตัวอย่างแบบสุ่มทั้งหมดที่นี่: node_modulesอาจได้รับผลกระทบจากการเปลี่ยนแปลงที่สมบูรณ์แบบนี้ บางที
Seth Battin

1

git เวอร์ชันเก่ามีปัญหาด้านประสิทธิภาพเกี่ยวกับสถานะคอมไพล์ - ดูวิธีปรับปรุงประสิทธิภาพสถานะคอมไพล์สำหรับข้อมูลเพิ่มเติม

git 2.13 มีการแก้ไข 1 รายการและอีก 2.17 รายการ ฉันย้ายจาก 2.7 เป็น 2.23 และแก้ไขสถานะช้า มีแผนปรับปรุงอีกครั้งสำหรับ 2.24 เร็ว ๆ นี้


0

ในกรณีของฉันความช้าเกิดจากการเรียกใช้git statusในฐานะผู้ใช้ที่แตกต่างจากเจ้าของไฟล์ในโครงการ

แม้ว่าจะใช้ไม่ได้ในทุกกรณี แต่chownผู้ใช้ปัจจุบันของคุณอาจใช้เคล็ดลับง่ายๆ


-13

ลองเริ่มต้นด้วยโคลนใหม่ของการชำระเงินของคุณ

git clone myrepo mynewrepo

จากนั้นทำสถานะคอมไพล์ใน mynewrepo

หรือหากคุณกล้าหาญให้ทำความสะอาดขยะจากการชำระเงินที่คุณมีอยู่

git clean -dfx

วิธีนี้หลีกเลี่ยงไม่ให้คอมไพล์ต้องสแกนชุดไฟล์ที่ละเว้นหรือไม่ได้เช็คอินบางส่วน (อาจมีขนาดใหญ่)


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

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