gitignore không bỏ qua thư mục


135

Trong foothư mục gốc của dự án tôi có một thư mục. Trong foothư mục tôi có một barthư mục. Tôi muốn bỏ qua tất cả các thay đổi cho tất cả các tệp trong barthư mục của tôi . Tôi có cái này trong gitignore:

/foo/bar

Thư mục được kiểm tra: nó tồn tại và nó có các tệp bị bỏ qua. gitignorecommitted. Tuy nhiên, tôi có một tập tin nơi tôi thực hiện một giao dịch và nằm trong barthư mục của mình . Khi tôi gõ

git status

Trong tôi, git bashtôi thấy các tập tin nên được bỏ qua. Điều gì có thể là lý do và làm thế nào tôi có thể bỏ qua thành công tất cả các tệp trong thư mục thanh của mình?

Lưu ý rằng các tệp trước đây đã bị bỏ qua với cùng một dòng, nhưng tôi phải tạm thời xóa dòng commitđó thành một cái gì đó trên máy chủ. Sau khi commit, tôi đặt lại dòng vào gitignore. Điều này đã được một thời gian trước đây, nhưng bây giờ tôi đã quan sát thấy rằng các tập tin sẽ được trong git status. Tôi hy vọng có thể sửa đổi các tệp bị bỏ qua mà không xuất hiện trong git status.


Trong tương lai, bạn không cần phải sửa đổi bỏ qua của mình để thêm một cái gì đó bị bỏ qua. git add -f ignored-filesẽ thêm một tập tin ngay cả khi nó bỏ qua.
Chris

Không git status foo/bar/file-that-should-be-ignoredcho cái gì?
Chris

Các tập tin nên được bỏ qua nếu có bất kỳ thay đổi xảy ra. Tôi rõ ràng đang thiếu một cái gì đó, nhưng theo hiểu biết của tôi, danh sách trạng thái git nên trống trong trường hợp đó với điều kiện / foo / bar có mặt trong .gitignore
Lajos Arpad

4
Có vẻ như tập tin đó thực sự đang được Git theo dõi. Nó phải được thêm vào kho lưu trữ tại một số điểm. Bạn có thể xem lịch sử của nó với git log foo/bar/file-that-should-be-ignored. Nếu nó không phải là một phần của kho lưu trữ, bạn nên xóa nó đi git rm --cached foo/bar/file-that-should-be-ignoredvà sau đó cam kết theo đề xuất của Reck bên dưới (mặc dù tôi sẽ chỉ làm nó trên tệp chứ không phải toàn bộ thư mục). Điều này sẽ (a) xóa tệp khỏi Git, (b) giữ tệp trong bản sao cục bộ của bạn và (c) khiến tệp bị xóa khi người khác fetchhoặc pullcam kết mới.
Chris

Câu trả lời:


341

Tôi đoán thư mục này đã được kiểm tra vào git trước đây?

Chạy git rm -r --cached <folder>và kiểm tra lại.


3
Điều này sẽ loại bỏ hoàn toàn thư mục khỏi repo (phiên bản hiện tại). OP muốn thư mục ở đó, nhưng những thay đổi mới không nên được theo dõi
Gareth

Thật không may, tôi phải loại bỏ chấp nhận. Giải pháp này đã loại bỏ các phiên bản từ xa của các tập tin khi được đẩy. Tôi muốn thiết lập gitignore để bỏ qua tất cả các tệp của một thư mục, không xóa nó từ xa. Điều đó có thể không? Tôi đã hoàn nguyên giải pháp.
Lajos Arpad

12
git update-index --assume-unchanged <folder>có lẽ?
Reck

3
@Lajos bạn không nên sửa lỗi của anh ấy thay vì thêm bình luận "chỉnh sửa" khó hiểu này?
cregox

2
@Cawas, vì trang web này là về chia sẻ kiến ​​thức, câu trả lời là: không. Thật sai lầm khi chấp nhận một câu trả lời có lỗi. Điều đó -r không phải là tùy chọn.
Lajos Arpad

46

Đối với tôi, câu trả lời được chấp nhận là một phần của giải pháp chứ không phải toàn bộ giải pháp. Có thể, các bước khác mà tôi sắp đăng là rõ ràng, nhưng tôi đã bỏ lỡ chúng đầu tiên. Đây là các bước tôi đã thực hiện để đảm bảo .gitignoretệp của mình bỏ qua thư mục mà tôi muốn nó bỏ qua:

  1. Cam kết mọi thay đổi mà bạn cần sửa chữa / thay đổi.
  2. Chạy lệnh này: git rm -r --cached .(loại bỏ mọi thứ khỏi chỉ mục git để làm mới kho git của bạn)
  3. Sau đó chạy lệnh này: git add .(để thêm mọi thứ trở lại repo)
  4. Cuối cùng, cam kết những thay đổi này bằng cách sử dụng git commit -m ".gitignore Fixed"

Bạn có thể tìm thấy liên kết đến bài viết từ nơi tôi tìm thấy giải pháp ở đây .


1
Đây không phải là một giải pháp khả thi dựa trên câu hỏi ban đầu. @ lagos-arpad đặc biệt hỏi về thư mục con chứ không phải toàn bộ dự án. Giải pháp của bạn loại bỏ mọi thứ khỏi cấp gốc của kho git và đây không phải là cách tiếp cận được đề xuất để giải quyết vấn đề này.
justinhartman

Ngay cả khi đó chỉ là thư mục con, giải pháp này vẫn hiệu quả với tôi khi tôi chỉ xử lý một tệp. Bạn có thể vui lòng giải thích tại sao nó không được khuyến khích?
sikanderBabwani

1
Những gì bạn đã giải quyết là không quan trọng. Đây không phải là câu trả lời cho câu hỏi và có khả năng nguy hiểm như câu trả lời khác đã chỉ ra. Điều này loại bỏ những thứ trên repo từ xa mà bạn không nhất thiết muốn.
RichieHH

8

Tôi đã gặp vấn đề này và tôi nhận ra git thực sự đã bỏ qua các tệp / thư mục một cách chính xác, nhưng trình soạn thảo mã của tôi (Visual Studio Code) chỉ là lỗi và không "tô màu chúng" đúng cách trong thanh bên UI. Tôi đã khởi động lại VSCode và chúng bị mờ đi như mong đợi.


Tương tự ở đây: Mã VS v1.30.2 (người dùng)
xinthose

Tương tự cho tôi. Cảm ơn bạn rất nhiều cho giải pháp này! Tôi đã tự hỏi tại sao .gitignore của tôi không hoạt động cho đến khi tôi thử khởi động lại VS Code. Tôi đang ở trên Visual Studio Code v1.44.2.
Fritz Lim

6

Như một bổ sung cho câu trả lời được chấp nhận

git rm -r --cached /foo/bar/
git status

Khi tôi làm điều đó, thiết bị đầu cuối hiển thị một loạt các rmtập tin trong thư mục đó. Vì vậy, để ngăn chặn một cam kết khác có thể ảnh hưởng không cần thiết đến điều khiển từ xa, tôi đã làm:

git reset HEAD *
git status

Sau đó, nó không nói gì để cam kết và khi tôi sửa đổi các tập tin bên trong /foo/bar/và thực hiện git statustôi vẫn nhận được nothing to commit.


1
Điều này chỉ đưa tôi trở lại nơi tôi bắt đầu (vấn đề)
Shonubi Korede
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.