2010-11-04 32 views
11

Vì vậy, trước khi chạy git commit Tôi thường sẽ chạy như sau:Cách grep thông qua các tệp được dàn dựng của bạn trước khi cam kết?

git grep --cached -l -I "debugger" 

Tôi nghĩ đó là tương tự như:

git diff --cached 

(mà sẽ cho bạn thấy tất cả các thay đổi mà bạn muốn cam kết, tức là sẽ cho bạn thấy sự khác biệt trong các tệp được dàn dựng của bạn).

Thật không may, tôi chỉ thấy rằng tùy chọn --cached cho git grep chỉ đơn giản là yêu cầu git "chỉ" xem mọi thứ trong chỉ mục của nó.

Vậy làm cách nào để chạy git grep và chỉ có grep thông qua các tệp được dàn dựng của tôi?

(Vâng, tôi biết tôi chỉ có thể làm git diff --cached và tìm kiếm trong đó, nhưng tôi thà có khả năng chương trình để grep qua file dàn dựng của tôi.)

+0

Vì vậy, bạn đã quản lý để giải quyết vấn đề này? Tôi muốn được quan tâm đến câu trả lời. – ZeroOne

Trả lời

10

Rất nhiều tiền cam kết móc sử dụng git diff-index --cached -S<pat> REV để tìm thay đổi thêm hoặc xóa một mẫu cụ thể. Vì vậy, trong trường hợp của bạn, git diff-index --cached -Sdebugger HEAD. Bạn có thể muốn thêm -u để nhận được một diff là tốt, nếu không nó chỉ xác định các tập tin vi phạm.

+4

Tùy chọn '-S' lấy một chuỗi cố định chứ không phải một regex. (Tuy nhiên, git diffcore gần đây đã có được tùy chọn '-G ', điều này nên cho phép bạn làm bất cứ điều gì bạn đang cố gắng làm với 'git grep'. Nó chưa có trong phiên bản phát hành, nhưng nằm trên nhánh chủ của 'git.git'. – Cascabel

+2

OK điều này giúp tôi gần với những gì tôi cần, nhưng không phải là 100% ở đó. Điều này sẽ cung cấp cho bạn một kết quả tích cực cho -S của bạn nếu nó đã được thêm hoặc xóa. Tôi chỉ muốn một trận đấu trở lại nếu nó được * thêm *. Có cách nào để làm điều đó? – steve

0

Trước tiên, bạn cần có danh sách tệp từ chỉ mục (không bao gồm tệp đã xóa). Điều này có thể được thực hiện như sau:

git diff --cached --name-only --diff-filter=d HEAD 

Thứ hai, bạn cần phải sử dụng: tiền tố để truy cập nội dung của một tập tin trong chỉ số hiện tại (dàn dựng nhưng chưa cam kết) thấy gitrevisions manual để biết thêm thông tin.

git show :<file> 

Cuối cùng đây là một ví dụ về đặt nó tất cả cùng nhau để grep danh sách các file

# Get a list of files in the index excluding deleted files 
file_list=$(git diff --cached --name-only --diff-filter=d HEAD) 

# for each file we found grep it's contents for 'some pattern' 
for file in ${file_list}; do 
    git show :"${file}" | grep 'some pattern' 
done 

Cũng here's an example của một git pre-cam kết nối có sử dụng phương pháp này để kiểm tra xem những năm bản quyền đang lên cho đến nay trong các tập tin được cam kết.

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