2012-06-20 16 views
9

Trong một thời gian, tôi đã sử dụng chức năng __git_ps1 trong dấu nhắc PS1 bash của tôi (với PS1='\w$(__git_ps1)'). Bây giờ tôi muốn tô màu tùy thuộc vào trạng thái chi nhánh .Cách nhanh nhất để có được trạng thái git trong bash

Tôi đã viết một hàm bash để kiểm tra xem nhánh hiện tại có bị sửa đổi hay không, và màu đỏ hoặc trắng tùy thuộc vào trạng thái. Vấn đề là nó sử dụng git status để kiểm tra trạng thái (đó là cách duy nhất tôi biết), và đó là một số lần chậm hơn __git_ps1, đủ để gây ra sự chậm trễ gây phiền nhiễu khi Tôi đang sử dụng lời nhắc (tôi trên một chiếc netbook rất yếu).

Vì vậy, tôi hỏi: có cách nào nhanh hơn để kiểm tra trạng thái của thư mục git hiện tại không? __git_ps1 nhanh hơn rất nhiều so với phân tích cú pháp theo cách thủ công git branch, vì vậy, tôi đang suy nghĩ có thể có một số chức năng git ẩn khác.

+0

Để tự mình làm rõ: Bạn có muốn biết chi nhánh có các tệp không được theo dõi không? –

+0

@PetervanderCó. Bất cứ điều gì sẽ được báo cáo bởi 'trạng thái git'. – Malabarba

+0

Lưu ý: Git 2.6+ (Q3 2015) sẽ cải thiện điều này. Xem [câu trả lời của tôi dưới đây] (http://stackoverflow.com/a/32039972/6309) – VonC

Trả lời

6

Không hoàn toàn là câu trả lời của bạn, nhưng hoàn thành bash đã được tích hợp sẵn.

Nếu bạn đặt bash ENV GIT_PS1_SHOWDIRTYSTATE thành giá trị không có giá trị, thay đổi chưa được tổ chức (*) và thay đổi theo giai đoạn (+) sẽ được hiển thị bên cạnh tên chi nhánh. Bạn có thể định cấu hình cho mỗi kho lưu trữ ith biến bash.showDirtyState, mặc định là true khi GIT_PS1_SHOWDIRTYSTATE được kích hoạt.

Bạn cũng có thể xem liệu hiện tại có điều gì đó được lưu trữ hay không bằng cách đặt GIT_PS1_SHOWSTASHSTATE thành giá trị không trống. Nếu một cái gì đó được cất giấu, thì '$' sẽ được hiển thị bên cạnh tên chi nhánh.

Nếu bạn muốn xem liệu có tệp không được theo dõi hay không, thì bạn có thể đặt GIT_PS1_SHOWUNTRACKEDFILES thành giá trị không trống. Nếu có các tệp không được theo dõi, thì '%' sẽ được hiển thị bên cạnh tên chi nhánh.

Không chắc chắn về tốc độ suy giảm khi bạn bật tính năng này. Nếu bạn muốn làm màu:

phân theo giai đoạn tập tin:

if git rev-parse --quiet --verify HEAD >/dev/null; then 
git diff-index --cached --quiet HEAD -- || color for staged changes 
else 
    color unstaged changes 
fi 

file giấu

git rev-parse --verify refs/stash >/dev/null 2>&1 && color for stashed files 

file không được theo dõi

if [ -n "$(git ls-files --others --exclude-standard)" ]; then 
    Color untrack files 
fi 

Các đoạn trên đến từ bash-hoàn kịch bản.

+1

Câu trả lời hay, nhưng tập lệnh đầu tiên không hoạt động đối với tôi. Có vẻ như 'git rev-parse --quiet --verify HEAD>/dev/null' luôn trả về '0' bất kể trạng thái được phân đoạn/không được tổ chức là . – Malabarba

+0

Cách duy nhất nó không hoạt động đối với tôi là khi tôi chưa có chi nhánh. Đầu ra của 'git rev-parse --verify HEAD' là gì –

+0

Một số thập lục phân lớn. Tôi đã cố gắng chơi xung quanh với các chi nhánh một chút, nhưng nó chỉ luôn luôn trả về 0. Đó không phải là một vấn đề mặc dù, đó là những thứ khác mà tôi quyết định đi với các biến GIT_PS1. Bạn đã tìm hiểu về chúng ở đâu? – Malabarba

3

git diff --quiet trả về 1 nếu có thay đổi đối với thư mục đang hoạt động và git diff --quiet --cached thực hiện tương tự cho chỉ mục.

Bạn có thể sử dụng nó để làm:

git diff --quiet 
    || echo "There be changes!" 
0

Tôi đang sử dụng ksh và đang gặp vấn đề tương tự. Để đầu nó đi, repo Git của tôi là trên NFS gắn kết làm cho thời gian phản ứng thậm chí chậm hơn.

Để trực tiếp trả lời các câu hỏi về tốc độ, hãy thử sử dụng:

git ls-files -m 

dường như là nhanh hơn so với 'git status -s' đáng kể, sau khi lần đầu tiên bước vào một kho lưu trữ khác nhau.Khi ở trong một kho lưu trữ, hệ điều hành và bộ nhớ đệm NFS xuất hiện để tăng tốc độ đáng kể lệnh này. Lệnh này cũng xuất hiện rất nhanh khi sâu bên trong các lá dưới cùng của cây thư mục làm việc git.

Hy vọng điều này sẽ hữu ích.
- JJ -

3

Lưu ý: Git 2.6+ (Q3 2015) nên thực hiện sớm mà __git_ps1 status:

Xem commit dd160d7, commit 6bfab99 (19 tháng bảy năm 2015) bởi SZEDER Gábor (szeder).
(Merged bởi Junio C Hamano -- gitster -- trong commit 461c119, 03 Aug 2015)

bash dấu nhắc: chỉ báo tình trạng untracked nhanh hơn với danh bạ untracked

Nếu chỉ báo tình trạng untracked được kích hoạt, __git_ps1() tìm kiếm các files untracked bằng cách chạy 'git ls-files'.
Điều này có thể được nhận thấy chậm trong trường hợp thư mục không được chứa nhiều tệp, vì nó liệt kê tất cả các tệp được tìm thấy trong thư mục không được theo dõi chỉ để được chuyển hướng đến /dev/null ngay lập tức.
Đây là lệnh thực tế do __git_ps1():

$ ls untracked-dir/ |wc -l 
100000 
$ time git ls-files --others --exclude-standard --error-unmatch \ 
    -- ':/*' >/dev/null 2>/dev/null 

real 0m0.955s 
user 0m0.936s 
sys 0m0.016s 

Loại bỏ sự chậm trễ này bằng cách bổ sung các '--directory --no-empty-directory' tùy chọn để 'git ls-files' để chỉ hiển thị tên của danh bạ untracked không trống thay vì của tất cả các nội dung của họ:

$ time git ls-files --others --exclude-standard --directory \ 
    --no-empty-directory --error-unmatch -- ':/*' >/dev/null 2>/dev/null 

real 0m0.010s 
user 0m0.008s 
sys 0m0.000s 

Điều này phù hợp với ea95c7b (hoàn thành: cải thiện thư mục không được theo dõi lọc để hoàn thành tên tệp, 2013-09-18, git 1.8.5).

Các vấn đề liên quan