2013-04-26 26 views
103

.gitignore có thể bỏ qua toàn bộ tệp, nhưng có cách nào bỏ qua các dòng mã cụ thể trong khi mã hóa không?Cách yêu cầu git bỏ qua các dòng riêng lẻ, tức là gitignore đối với các dòng mã cụ thể

Tôi thường xuyên và nhiều lần thêm cùng một dòng gỡ lỗi trong một dự án, chỉ cần nhớ phải xóa chúng trước khi cam kết. Tôi chỉ muốn giữ các dòng trong mã và có git bỏ qua chúng.

+37

Tôi không thể biết đây là một ý tưởng khủng khiếp hay một . –

+0

@KyleStrand ít nhất, tôi có thể thêm nó vào các dòng gỡ lỗi mà tôi nhập và cảm thấy an toàn khi biết rằng họ sẽ không vô tình cam kết – Kache

+4

Phải, đó là phần "rực rỡ". –

Trả lời

91

Đây là cách bạn loại có thể làm điều đó với git filters:

  1. Tạo/Open gitattributes file:.
    • < dự án root>/gitattributes (sẽ được cam kết vào repo)
      HOẶC
    • < gốc dự án> /. Git/info/attributes (sẽ không được cam kết thành repo)
  2. Thêm một dòng xác định các tập tin được lọc:
    • *.rb filter=gitignore, tức là bộ lọc chạy tên gitignore trên tất cả các *.rb file
  3. Xác định các bộ lọc gitignore trong gitconfig của bạn:
    • $ git config --global filter.gitignore.clean "sed '/#gitignore$/'d", tức là xóa những dòng này
    • $ git config --global filter.gitignore.smudge cat, tức là không làm gì khi kéo tệp từ repo

Ghi chú:
Tất nhiên, đây là cho các tập tin ruby, áp dụng khi một dòng kết thúc với #gitignore, áp dụng trên toàn cầu trong ~/.gitconfig. Sửa đổi điều này tuy nhiên bạn cần cho các mục đích của bạn.

Cảnh báo !!
Điều này khiến tệp của bạn khác với repo (tất nhiên). Bất kỳ kiểm tra hoặc rebasing sẽ có nghĩa là những dòng này sẽ bị mất! Thủ thuật này có vẻ vô dụng vì những dòng này liên tục bị mất khi kiểm tra, rebase hoặc pull, nhưng tôi đã sử dụng một trường hợp cụ thể để sử dụng nó.

Chỉ git stash save "proj1-debug"trong khi bộ lọc không hoạt động (chỉ cần tạm thời tắt bộ lọc trong gitconfig hoặc thứ gì đó). Bằng cách này, mã gỡ lỗi của tôi luôn có thể là git stash apply 'd vào mã của tôi bất kỳ lúc nào mà không sợ những dòng này từng bị vô tình cam kết.

Tôi có một ý tưởng có thể để giải quyết những vấn đề này, nhưng tôi sẽ thử triển khai nó một thời gian khác.

Nhờ Rudi và jw013 đề cập đến bộ lọc git và gitattributes.

+2

Chà. Thật là tuyệt vời. – rjmunro

+2

Không nên là: 'git config --global filter.gitignore.clean sed '/ # gitignore $/d'' vì bạn đã đặt tên cho bộ lọc là' gitignore' –

+0

Ah, đúng vậy. Trong thực tế, cũng có một vấn đề thoát khỏi báo giá. – Kache

12

Tôi gặp sự cố tương tự khi viết mã java. Giải pháp của tôi là để đánh dấu mã mà tôi không muốn cam kết và sau đó thêm một móc trước cam kết sẽ tìm kiếm đánh dấu của tôi:

#!/bin/bash 
# 
# This hook will look for code comments marked '//no-commit' 
# - case-insensitive 
# - dash is optional 
# - there may be a space after the // 
# 
noCommitCount=$(git diff --no-ext-diff --cached | egrep -i --count "(@No|\/\/\s?no[ -]?)commit") 
if [ "$noCommitCount" -ne "0" ]; then 
    echo "WARNING: You are attempting to commit changes which include a 'no-commit'." 
    echo "Please check the following files:" 
    git diff --no-ext-diff --cached --name-only -i -G"(@no|\/\/s?no-?)commit" | sed 's/^/ - /' 
    echo 
    echo "You can ignore this warning by running the commit command with '--no-verify'" 
    exit 1 
fi 
+0

Đánh dấu chắc chắn cảm thấy ít giải pháp đáng sợ và khai báo hơn là lọc dựa trên 'sed' hay như vậy. Đẹp nhất. – akshay

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