2011-10-26 23 views
7

Rất nhiều mã gỡ lỗi của tôi được bao bọc trong đầu trang/chân trang. Thông thường tôi chạy một kịch bản mà chỉ cần loại bỏ tất cả nó từ nguồn trước khi tôi giai đoạn và cam kết những thay đổi. Nếu mã gỡ lỗi cần duy trì một cam kết, tôi sẽ chạy git add -p và điều chỉnh các đoạn riêng lẻ.thay đổi giai đoạn trong git dựa trên regex

Câu hỏi của tôi là liệu có thể thay đổi giai đoạn dựa trên regex không? Ví dụ, với đoạn này của javascript:

function littleNinja(sword) { 
    /* debug:start */ 
    console.log(sword); 
    /* debug:stop */ 
    // do stuff 
} 

Tôi không muốn git đến giai đoạn ranh giới giữa và bao gồm debug:startdebug:stop, và tôi hy vọng quá trình này có thể được tự động.

+0

Điều đó là không thể. Ngay cả khi nó được, đôi khi các đoạn gỡ lỗi sẽ là không thể tách rời từ đoạn khác mà bạn muốn dàn dựng. Bạn cần một tập lệnh tùy chỉnh có thể xử lý tình huống này cho bạn hoặc ủy quyền lựa chọn cho bạn tương tác. Sau đó, có thể bí danh kịch bản lệnh dưới dạng lệnh git. – wilhelmtell

+0

Xác định được trường hợp đó, nhưng muốn kiểm tra lại. Cảm ơn. –

Trả lời

8

Cách tốt nhất để làm điều này là sử dụng clean and smudge filters để lọc ra các dòng được đánh dấu khi chúng được tổ chức. (Mô tả bên dưới về cơ bản giống như thủ tục được mô tả trong phần "Pro Git" và tương tự như trong tài liệu git attributes.) Trước hết, chúng ta cần lệnh loại bỏ các dòng giữa (và bao gồm) mỗi debug:startdebug:end - may mắn thay, đây là một công việc đơn giản với sed:

sed '/debug:start/,/debug:stop/d' < foo.js 

Bây giờ tạo một file .gitattributes ở cấp cao nhất của kho git của bạn, trong đó có dòng sau:

*.js filter=strip-debug 

và bây giờ xác định những gì strip-debug lọc hiện cả hai khi 'làm sạch' (trên dàn) hoặc 'nhòe' (trên thanh toán):

git config filter.strip-debug.clean "sed '/debug:start/,/debug:stop/d'" 
git config filter.strip-debug.smudge cat 

tôi (rất ngắn gọn) thử nghiệm này và có vẻ như để làm những gì bạn muốn.

+0

Tuyệt vời! +1 Trev: Bạn nên chấp nhận câu trả lời của Mark, nó tốt hơn nhiều so với của tôi (và ngoài ra, tôi không thể xóa nó vì nó được chấp nhận). – greg0ire

+0

Tuyệt vời. Cảm ơn bạn rất nhiều vì đã giải thích cách thực hiện điều này một cách chi tiết. –

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