Trạng thái Git Mất một thời gian dài để hoàn thành


85

Tôi đang sử dụng gitđể quản lý tệp trong thư mục cục bộ trên máy Windows - không có mạng nào liên quan ở đây, tôi không đẩy hoặc kéo đến / từ máy khác. Thư mục của tôi có thể có 100 tệp trong đó, tất cả các tệp thử nghiệm, khá nhỏ. Khi tôi chạy git status, thường xuyên mất 20-30 giây để hoàn thành. Điều này có bình thường không? Tôi có thể làm gì để tăng tốc độ hoặc cách tốt hơn để xem trạng thái của kho lưu trữ của tôi là gì (tệp đã thay đổi, tệp chưa được kiểm tra, v.v.)? Các gitlệnh khác dường như hoàn thành nhanh hơn nhiều.


Bạn đang sử dụng phiên bản git nào? Vui lòng xem xét yêu cầu trợ giúp trên msysGit Google Group hoặc trên git mailing list (git [at] vger.kernel.org, bạn không cần đăng ký), có lẽ đây là một lỗi trong git.
Jakub Narębski

Câu trả lời:


127

Bạn đã thử git gc chưa? Thao tác này làm sạch các mảnh vụn ra khỏi git repo.


3
Điều này dường như đã thực hiện thủ thuật. Tôi rất ngạc nhiên mặc dù chỉ sau một vài cam kết rằng kho lưu trữ sẽ có rất nhiều thứ có thể được dọn dẹp - cảm ơn!
Matt McMinn

4
Hehe, tôi vừa chạy lệnh git statusbằng timelệnh và có thời gian "thực" là 30,464s. Sau đó, tôi chạy git gcsau đó time git statusmột lần nữa và có thời gian thực là 35,409 giây. Khá lạ.
RyanScottLewis

14
Điều này đã sửa tôi từ 33 giây xuống dưới 1 giây cho hầu hết các kho của tôi. Sẽ thật tuyệt nếu Git bảo bạn làm điều này khi bạn bắt đầu đi đến điểm đó. Tôi không bao giờ biết nó là cần thiết.
XP84

Khi chạy git statusnhiều lần liên tiếp, các lần chạy tiếp theo chỉ mất một phần nhỏ so với lần chạy đầu tiên. Vì vậy, nếu bạn đang chạy git status, sau đó git gcvà sau đó git statusmột lần nữa, nó được mong đợi là nó sẽ chạy siêu nhanh.
kiewic

7

Về một vấn đề tương tự, tôi nhận thấy rằng có một git repo trong thư mục bên dưới git repo hiện có của tôi đã gây ra hiện tượng chậm nhiều.

Tôi đã chuyển repo git thứ cấp đến một nơi khác và bây giờ tốc độ rất nhanh!


Tôi thêm vấn đề tương tự. Điều gì đã xảy ra với git init trong một thư mục con. Vấn đề của điều đó là sau đó, subir bị ẩn (bạn cần thực hiện trạng thái git bên trong để xem các thay đổi) nhưng tôi đoán git vẫn đang cố gắng tính toán chúng. Tôi phớt lờ tiểu thư và mọi thứ đều ổn.
mb14

6

Bạn đang sử dụng một số loại phần mềm bảo vệ chống vi-rút? Có lẽ điều đó đang can thiệp vào mọi thứ. gitđối với tôi rất nhanh trên windows với kho lưu trữ hàng 1000 tệp.


1
Có, nhà tuyển dụng đã ủy quyền cho TrendMicro OfficeScan. Tôi đã giết trình quét vi rút, kết quả tương tự với trạng thái git.
Matt McMinn

1
Một biến thể khác của chủ đề này là phần mềm mã hóa nhanh như Credant, có thể làm cho hộp của bạn chậm hơn đáng kể.
Don Branson

Đây là vấn đề đối với tôi. Đã giết chết phần mềm chống vi-rút Kaspersky và trạng thái trở lại <1 giây.
Robin Winslow

5

Bạn đã thử đóng gói lại chưa? git-repack .

Nếu không, hãy thử sao chép thư mục và xóa thư mục .git trong thư mục đã sao chép. Sau đó, tạo một thư mục git mới và xem nó có còn chậm không.

Nếu nó vẫn chậm, thì đó có vẻ như là sự cố hệ thống hoặc phần cứng. Git kết thúc trạng thái trên hàng trăm tệp cho tôi trong vòng chưa đầy 5 giây.


repack dường như hữu ích - sau khi chạy nó, tôi chạy trạng thái và nó trở lại ngay lập tức. Tuy nhiên, tôi đã đợi một vài giây và chạy lại trạng thái, và mất 30 giây. Tôi đã thử sao chép thư mục và gặp sự cố tương tự.
Matt McMinn,

Hmm, thú vị. Bạn có ổ đĩa ngoài không? Hoặc một thanh flash USB? Hãy thử sao chép repo ở đó và xem có sự khác biệt nào không. Có thể có sự cố với ổ đĩa hiện đang sử dụng.
thedz

Không có sự khác biệt trên ổ USB.
Matt McMinn,

Điều đó thực sự kỳ lạ. Tất cả những gì tôi thực sự có thể nói vào thời điểm này là tôi không biết. Bạn có thể thử sao chép repo của mình và thử nó trên máy tính của người khác - ít nhất điều đó sẽ cho bạn biết nếu đó là sự cố cục bộ đối với hệ thống của bạn.
thedz

4

Vì một số lý do git statusđặc biệt chậm sau khi di chuyển hoặc sao chép thư mục kho lưu trữ sang vị trí mới.

Trong trường hợp này, các lần chạy tiếp theo thường nhanh hơn.


1
Có cách nào để tránh sự chậm chạp này trong lần chạy đầu tiên không? Tôi đã thử git gc nhưng không được, không thành vấn đề vì nó chỉ xảy ra lần đầu tiên sau khi sao chép tệp.
franksands

Tôi không biết cách nào để tránh sự chậm chạp ban đầu, nhưng nếu có một số lệnh có thể thực hiện điều đó, nó có thể sẽ làm điều tương tự như git statuslệnh ban đầu , vì vậy có thể sẽ mất cùng một khoảng thời gian để hoàn thành.
DanJAB

4

Của tôi git statusrất chậm (lên đến một phút), vì .gitignoretệp chung nằm trong tệp người dùng windows của tôi, được lưu trữ trên một mạng chia sẻ không thể truy cập được.

git config --global core.excludesfile
cho thấy một cái gì đó như \\Nxxxx0\User\Username\Eigene Dateien\gitignore_global.txt

Vì một số lý do \\Nxxxx0không thể truy cập được và tệp người dùng của tôi đã được tải từ hệ thống sao lưu \\Nxxxxx1. Phải mất một thời gian để tìm ra điều đó, vì thường thì tệp người dùng của tôi được liên kết với ký tự ổ đĩa bởi một tập lệnh khởi động doanh nghiệp và việc truy cập ký tự ổ đĩa đó hoạt động như bình thường. Tôi không chắc tại sao git-config lại sử dụng mạng chia sẻ chứ không phải ký tự ổ đĩa (có thể là do tôi nhỏ tuổi hơn đáng trách)

Sau khi thiết lập
git config --global core.excludesfile $HOME/Eigene\ Dateien/gitignore_global.txt
git statusđã trở lại tốc độ bình thường.


3

Running git fsckđã giải quyết vấn đề này cho tôi trong quá khứ.


3

Đối với tôi, sự chậm chạp là do có nhiều tệp chưa được kiểm soát (tệp tạm thời và tệp xuất từ ​​tập lệnh.) Đang chạy git status -uno, loại trừ các tệp chưa được kiểm tra, chạy nhanh hơn nhiều và đáp ứng yêu cầu của tôi.


1

Vấn đề đối với tôi là tôi đã nhân bản rất nhiều kho lưu trữ khác nhau vào ổ cứng cục bộ của mình, bạn càng có nhiều kho lưu trữ thì càng mất nhiều thời gian để chạy các lệnh như trạng thái git.

Tôi chỉ đơn giản là đã xóa rất nhiều repo mà tôi không còn cần đến cục bộ và trạng thái git của tôi đã giảm từ 1 phút ~ 5 giây.

Tôi không thể thấy bất kỳ câu trả lời nào tương tự như thế này ở đây.


1
Tôi không nghĩ rằng điều này có thể ảnh hưởng đến tiêu chuẩn git statusbạn chạy trong một thư mục theo bất kỳ cách nào. Nếu kho lưu trữ của bạn được kiểm tra thành các thư mục khác nhau, bạn chỉ có thể chạy git statusmột trong số chúng tại một thời điểm. Có thể là một câu chuyện khác nếu các kho git của bạn bị trùng lặp, nhưng dù sao thì đó cũng là một ý tưởng tồi.
Hubert Grzeskowiak

@HubertGrzeskowiak chắc chắn có thể. Đối với tôi, chúng ở khắp các vị trí khác nhau trên ổ cứng nhưng nó ảnh hưởng rất nhiều đến thời gian tải của tôi khi gõ trạng thái git. Sau khi loại bỏ các kho lưu trữ trùng lặp, nó ngay lập tức trở nên nhanh hơn từ nhiều phút đến 5 giây.
Jack Perry

1

Một khía cạnh khác git statussẽ được cải thiện (trong Git 2.14.x / 2.15, Q4 2017) là khi nó cũng hiển thị các tệp bị bỏ qua ( git status --ignored)

" git status --ignored", khi nhận thấy rằng một thư mục không có bất kỳ đường dẫn theo dõi nào bị bỏ qua, vẫn liệt kê tất cả các đường dẫn bị bỏ qua trong thư mục, điều này là không cần thiết.
Đường codepath đã được tối ưu hóa để tránh chi phí này.

Xem cam kết 5aaa7fd (18 tháng 9 năm 2017) của Jameson Miller ( jamill) .
(Hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 075bc9c , ngày 29 tháng 9 năm 2017)

Cải thiện hiệu suất của git status --ignored

Cải thiện hiệu suất của logic liệt kê thư mục khi nó muốn liệt kê các thư mục bị bỏ qua không trống. Để hiển thị các thư mục bị bỏ qua không trống, logic hiện có sẽ lặp lại một cách đệ quy qua tất cả nội dung của một thư mục bị bỏ qua.
Thay đổi này giới thiệu việc tối ưu hóa để ngừng lặp lại các nội dung khi nó tìm thấy tệp đầu tiên. Điều này có thể cải thiện đáng kể hiệu suất 'trạng thái git --ignored' trong các kho lưu trữ có số lượng lớn tệp trong các thư mục bị bỏ qua.

Để có ví dụ về sự khác biệt hiệu suất trên kho lưu trữ mẫu với 196.000 tệp trong 400 thư mục bị bỏ qua:

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

Để có nhiều ứng biến hơn (đặt trong Git 2.17, quý 2 năm 2018), hãy xem câu trả lời này .


Ví dụ hoàn toàn ngẫu nhiên ở đây: node_modulescó thể bị ảnh hưởng bởi thay đổi hiệu suất này. Chỉ có thể thôi.
Seth Battin

1

Các phiên bản cũ hơn của git có vấn đề về hiệu suất với trạng thái git - xem Các cách cải thiện hiệu suất trạng thái git để biết thêm thông tin.

git 2.13 có 1 bản sửa lỗi và 2,17 khác. tôi đã chuyển từ 2,7 lên 2,23 và nó đã giải quyết tình trạng chậm. Có một cải tiến khác được lên kế hoạch cho 2.24 sắp tới.


0

Trong trường hợp của tôi, sự chậm chạp là do chạy git statusvới tư cách là người dùng khác với chủ sở hữu tệp trong dự án.

Mặc dù không thể áp dụng trong mọi trường hợp, nhưng chownngười dùng hiện tại của bạn có thể thực hiện một cách đơn giản .


-13

Hãy thử bắt đầu với một bản sao mới của thanh toán của bạn.

git clone myrepo mynewrepo

và sau đó thực hiện trạng thái git trong mynewrepo.

Ngoài ra, và nếu bạn dũng cảm, hãy dọn sạch rác khỏi thanh toán hiện có của bạn.

git clean -dfx

Điều này tránh việc git phải quét một số tập hợp (có thể lớn) các tệp bị bỏ qua hoặc không được đăng ký.


Tôi không nghĩ rằng việc xóa tất cả các tệp bị bỏ qua của bạn (những gì git clean làm được) sẽ giúp ích, nó đã bỏ qua chúng. Nhiều khả năng chạy git clean sẽ xóa tất cả các tệp cấu hình của bạn, v.v. Và lệnh này không thể hoàn tác. Nhân bản lại (trước tiên lưu kho lưu trữ cũ của bạn trong trường hợp bạn cần) tốt hơn nhiều so với việc chạy git clean và có tác dụng tương tự.
XP84

5
Tôi không đồng ý với câu trả lời này, chạy git clean -dfx có thể làm hỏng mọi thứ.
Marcel Valdez Orozco
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.