Giải thích quy tắc gitignore nào đang bỏ qua tệp của tôi


310

Có cách nào để xem tại sao một số tệp bị bỏ qua bởi git (tức là quy tắc nào trong .gitignoretệp đang khiến tệp bị bỏ qua) không?

Hãy tưởng tượng tôi có điều này (hoặc một kịch bản phức tạp hơn nhiều, với hàng trăm thư mục và hàng chục .gitignoretệp:

/
-.gitignore
-folder/
    -.gitignore
    -subfolder/
              -.gitignore
              -file.txt

Nếu tôi chạy git add folder/subfolder/file.txtgit có thể phàn nàn về việc nó bị bỏ qua:

The following paths are ignored by one of your .gitignore files:
folder/subfolder/file.txt
Use -f if you really want to add them.

Có cách nào để biết .gitignorequy tắc nào trong số tất cả có thể có để bỏ qua tệp này và cũng hiển thị quy tắc không? Giống:

The following paths are ignored by your folder/.gitignore file (line 12: *.txt)
folder/subfolder/file.txt
Use -f if you really want to add them.

Hoặc chỉ:

$ git why-is-ignored folder/subfolder/file.txt
folder/.gitignore:12:*.txt

4
Lưu ý: git check-ignoresẽ sớm (git1.8.5 / 1.9) có --no-indextùy chọn. Xem câu trả lời của tôi dưới đây
VonC

Lưu ý: GIT_TRACE_EXCLUDE=1 git statussẽ sớm là một cách bổ sung để gỡ lỗi .gitignorecác quy tắc. Xem câu trả lời được chỉnh sửa của tôi dưới đây
VonC

Bài đăng trên blog có liên quan: danielcompton.net/2016/04/21/ .
krlmlr

Câu trả lời:


643
git check-ignore -v filename

Xem trang người đàn ông để biết thêm chi tiết.

Câu trả lời gốc sau:

git hiện không cung cấp bất cứ điều gì như thế này. Nhưng sau khi thấy câu hỏi của bạn, tôi đã làm một số việc và thấy rằng vào năm 2009 , tính năng này đã được yêu cầu và thực hiện một phần . Sau khi đọc bài viết, tôi nhận ra rằng sẽ không có quá nhiều việc phải làm đúng, vì vậy tôi đã bắt đầu làm việc trên một bản vá và hy vọng sẽ hoàn thành nó trong một hoặc hai ngày tiếp theo. Tôi sẽ cập nhật câu trả lời này khi nó đã sẵn sàng.

CẬP NHẬT: Wow, đó là khó khăn hơn nhiều so với tôi mong đợi. Các bộ phận gitxử lý loại trừ của bộ phận khá khó hiểu. Dù sao, đây là một loạt các cam kết gần như hoàn thành áp dụng cho masterchi nhánh thượng nguồn ngày nay . Bộ kiểm tra đã hoàn thành 99% nhưng tôi chưa xử lý xong --stdintùy chọn này. Hy vọng rằng tôi sẽ quản lý nó vào cuối tuần này, và sau đó gửi các bản vá của tôi vào danh sách gửi thư git.

Trong khi đó, tôi chắc chắn hoan nghênh thử nghiệm từ bất kỳ ai có thể làm như vậy - chỉ cần sao chép từ ngã ba của tôigit , kiểm tra check-ignorechi nhánh và biên dịch nó như bình thường.

CẬP NHẬT 2: Xong rồi! Phiên bản mới nhất có trên github như trên và tôi đã gửi loạt bản vá vào danh sách gửi thư git để đánh giá ngang hàng. Hãy xem họ nghĩ gì ...

CẬP NHẬT 3: Sau vài tháng hack / đánh giá bản vá / thảo luận / chờ đợi, tôi rất vui khi có thể nói rằng tính năng này hiện đã đến masterchi nhánh của git và sẽ có trong phiên bản tiếp theo (1.8.2, dự kiến ​​ngày 8 Tháng 3 năm 2013). Đây là check-ignoretrang hướng dẫn . Phew, đó là cách làm việc nhiều hơn tôi mong đợi!

CẬP NHẬT 4: Nếu bạn quan tâm đến câu chuyện đầy đủ về cách câu trả lời này phát triển và tính năng được triển khai, hãy xem tập 32 của podcast GitMinutes .


2
Tôi đang sử dụng 1.8.2 và git check-ignorekhông làm gì cả.
zakdances

3
@yourfriendzak Không có bóng dáng của một nghi ngờ, git check-ignorecó mặt và làm việc trong 1.8.2. Nếu hành vi không như bạn mong đợi, tôi khuyên bạn nên đọc lại trang hướng dẫn và nếu vẫn không được, vui lòng gửi báo cáo lỗi thích hợp trong danh sách gửi thư git. Chỉ cần nói rằng nó không làm gì là không hữu ích. Tôi hy vọng bạn có thể chạy nó trên một tập tin không bị bỏ qua và được sai mong đợi một số đầu ra (mặc dù tôi có thể sẽ hỗ trợ thêm cho --show-unmatchedđến --verbosechế độ đầu ra trong tương lai).
Adam Spiers

1
@AdamSpiers bạn nói đúng. Tôi nên đã chỉ định rằng khi tôi thực hiện lệnh, không có gì được in. Không có thông báo lỗi, không có thông báo thành công, không có thông tin. Chỉ tiếp theo, dấu nhắc trống hiện lên. Vì vậy, tôi có đúng không khi cho rằng "không có đầu ra" là hành vi dự kiến ​​trong một số trường hợp nhất định?
zakdances

1
@AdamSpiers cảm ơn bạn rất nhiều vì điều này! Sau 3 ngày điều tra, bạn vừa giúp tôi tìm ra nguyên nhân của việc xây dựng bị phá vỡ do một tệp bị bỏ qua trên toàn cầu trong .gitignore_global! Tôi thậm chí không biết đó là một điều!
BenBtg

3
Không phải hàng ngày người ta thấy một nhà phát triển Stack Overflow thực hiện rất nhiều thay đổi để thực hiện một tính năng dành cho nhà phát triển. Wow và tôn trọng.
dùng3613932

18

Cập nhật git 2.8 (tháng 3 năm 2016):

GIT_TRACE_EXCLUDE=1 git status

Xem " Cách xác thực .gitignoretệp "

Đó là bổ sung cho git check-ignore -vmô tả dưới đây.


Câu trả lời gốc: Tháng 9 năm 2013 (git 1.8.2, rồi 1.8.5+):

git check-ignorecải thiện một lần nữa trong git 1.8.5 / 1.9 (Q4 2013) :

" git check-ignore" tuân theo quy tắc tương tự như " git add" và " git status" trong đó cơ chế bỏ qua / loại trừ không có hiệu lực đối với các đường dẫn đã được theo dõi.
Với --no-indextùy chọn "", nó có thể được sử dụng để chẩn đoán những đường dẫn nào nên bị bỏ qua đã bị thêm nhầm vào chỉ mục .

Xem cam kết 8231fa6 từ https://github.com/flashydave :

check-ignorehiện cho thấy .gitignorecác quy tắc sẽ xử lý các đường dẫn không bị theo dõi như thế nào . Đường dẫn theo dõi không tạo ra đầu ra hữu ích.
Điều này ngăn chặn việc gỡ lỗi tại sao một đường dẫn bị theo dõi bất ngờ trừ khi đường dẫn đó bị xóa đầu tiên khỏi chỉ mục git rm --cached <path>.

Tùy chọn này --no-indexcho biết lệnh bỏ qua việc kiểm tra đường dẫn nằm trong chỉ mục và do đó cũng cho phép kiểm tra các đường dẫn được theo dõi.

Trong khi hành vi này đi lệch khỏi các đặc điểm git addgit statustrường hợp sử dụng của nó không có khả năng gây ra bất kỳ sự nhầm lẫn nào của người dùng.

Các kịch bản thử nghiệm được tăng cường để kiểm tra tùy chọn này dựa trên các bỏ qua tiêu chuẩn để đảm bảo hành vi chính xác.


--no-index::

Đừng nhìn vào chỉ mục khi thực hiện kiểm tra.
Điều này có thể được sử dụng:

  • để gỡ lỗi tại sao một đường dẫn bị theo dõi bởi vd git add .và không bị bỏ qua bởi các quy tắc như người dùng mong đợi hoặc
  • khi phát triển các mẫu bao gồm phủ định để khớp với một đường dẫn được thêm trước đó git add -f.

4

Tôi không thể tìm thấy bất cứ điều gì trong trang man nhưng đây là một tập lệnh nhanh và bẩn sẽ kiểm tra tệp của bạn trong mỗi thư mục cha để xem liệu nó có thể được git-add'ed không. Chạy nó trong thư mục chứa tệp vấn đề như:

test-add.sh STOP_DIR FILENAME

trong đó STOP_DIRlà thư mục cấp cao nhất của dự án Git và FILENAMElà tên tệp vấn đề (không có đường dẫn). Nó tạo ra một tệp trống cùng tên ở mỗi cấp của cấu trúc phân cấp (nếu nó không tồn tại) và cố gắng git add -nxem liệu nó có thể được thêm vào hay không (nó sẽ tự dọn sạch). Nó xuất ra một cái gì đó như:

FAILED:    /dir/1/2/3
SUCCEEDED: /dir/1/2

Kịch bản:

#!/usr/bin/env bash
TOP=$1
FILE=$2
DIR=`pwd`
while : ; do
  TMPFILE=1
  F=$DIR/$FILE
  if [ ! -f $F ]; then
    touch $F
    TMPFILE=0
  fi
  git add -n $F >/dev/null 2>&1
  if [ $? = 0 ]; then
    echo "SUCCEEDED: $DIR"
  else
    echo "FAILED:    $DIR"
  fi
  if [ $TMPFILE = 0 ]; then
    rm $F
  fi
  DIR=${DIR%/*}
  if [ "$DIR" \< "$TOP" ]; then
    break
  fi
done 

1

Để thêm vào câu trả lời chính của việc sử dụng git check-ignore -v filename(cảm ơn BTW) tôi thấy rằng tệp .gitignore của tôi đã chặn mọi thứ vì có một dòng mới sau ký tự đại diện, vì vậy tôi đã có:

* .sublime-project

làm ví dụ Tôi vừa xóa dòng mới, và thì đấy! Nó đã được sửa.

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.