Tại sao Git không bỏ qua tệp được chỉ định của tôi?


189

Tôi đã thêm dòng sau vào .gitignore:

sites/default/settings.php

nhưng khi tôi gõ git statusnó sẽ hiển thị tệp dưới dạng tệp không được sắp xếp.

Có vấn đề gì vậy? Tất cả các mẫu khác hoạt động tốt.



Tôi gặp vấn đề tương tự, sau đó tôi phát hiện ra tôi đã lưu tệp .gitignore của mình trên một ổ đĩa khác: mặt-lòng bàn tay:
Henry Chan

Đó là một ý tưởng rất xấu để giữ các công cụ trong kho lưu trữ của bạn và bỏ qua những thay đổi trên đó.
Yevgeniy Afanasyev

Câu trả lời:


362

Hãy chắc chắn rằng bạn .gitignoređang ở trong thư mục gốc của thư mục làm việc và trong thư mục đó chạy git statussao chép đường dẫn đến tệp từ đầu ra trạng thái và dán nó vào .gitignore.

Nếu điều đó không hoạt động, thì có khả năng tệp của bạn đã được Git theo dõi. Bạn có thể xác nhận điều này thông qua đầu ra của git status. Nếu tập tin không được liệt kê trong phần Tập tin không bị chặn của tập tin , thì nó đã được Git theo dõi và nó sẽ bỏ qua quy tắc từ .gitignoretập tin.

Lý do bỏ qua các tệp trong Git là để chúng sẽ không được thêm vào kho lưu trữ. Nếu trước đây bạn đã thêm một tệp mà bạn muốn bỏ qua, thì nó sẽ được theo dõi bởi Git và các quy tắc bỏ qua phù hợp với nó sẽ bị bỏ qua. Git thực hiện điều này vì tệp đã là một phần của kho lưu trữ.

Để thực sự bỏ qua tập tin, bạn phải mở khóa và xóa nó khỏi kho lưu trữ. Bạn có thể làm điều đó bằng cách sử dụng git rm --cached sites/default/settings.php. Thao tác này sẽ xóa tệp khỏi kho lưu trữ mà không xóa tệp (thực tế là như --cachedvậy). Sau khi cam kết thay đổi đó, tệp sẽ bị xóa khỏi kho lưu trữ và bỏ qua nó sẽ hoạt động đúng.


'Ý nghĩa của thư mục làm việc' là gì? Thư mục nơi tìm thấy kho '.git'?
Jonathan Leffler

Thư mục làm việc là thư mục chứa .gitthư mục và chính thư mục gốc của kho lưu trữ. Giống như khi bạn sao chép một kho lưu trữ để /xy/sau đó /xy/là thư mục làm việc của bạn với /xy/.git/bên trong.
chọc

3
Đôi khi, bạn cũng cần phải thực hiện git add .sau git rm --cachedđể xây dựng lại chỉ mục.
Cooper

Ý tưởng để kiểm tra nó trong trạng thái git là tuyệt vời. Tôi tiếp tục kiểm tra nó trong Git Staging trong Eclipse và đường dẫn không chính xác. Cảm ơn!
walla

1
Tôi cần thêm cờ -r (đệ quy) vì tôi cũng đã kiểm tra các thư mục lồng nhau. Trong trường hợp của tôi, tôi đã chuyển đến thư mục gốc của thư mục git của mình, sau đó chạy lệnh git rm --cached -r .vs / Trong đó vs là thư mục cấp cao nhất mà tôi muốn xóa khỏi theo dõi.
Devology Ltd

104

Tôi gặp phải vấn đề này, đó là một câu hỏi cũ, nhưng tôi muốn tập tin đó được theo dõi nhưng không theo dõi nó trên một số bản sao đang hoạt động, để làm điều đó bạn có thể chạy

git update-index --assume-unchanged sites/default/settings.php

5
Đó thực sự là câu trả lời tôi đang tìm kiếm. Tất cả các câu trả lời khác đều cho rằng tệp đã được thêm bằng git add, điều này không phải lúc nào cũng đúng. Với Acquia Cloud, tệp .gitignore được cho là bỏ qua settings.php (ví dụ) nhưng tệp được bao gồm trong lần xác nhận đầu tiên. Mở khóa tệp, chỉ cần xóa tệp khỏi kho lưu trữ, do đó xóa tệp khỏi trang web trực tiếp ...
PatrickS

Giúp tôi quá - cảm ơn bạn! Bỏ phiếu lên. Tôi nghi ngờ mặc dù nó chỉ áp dụng cho repo git địa phương và sẽ không tồn tại một khi bị đẩy đến điều khiển từ xa và nhân bản bởi các nhà phát triển khác?
Ivan

1
Vâng, nó chỉ là địa phương.
Mescalito

40

.gitignore sẽ chỉ bỏ qua các tệp mà bạn chưa thêm vào kho lưu trữ của mình.

Nếu bạn đã làm git add .và tệp đã được thêm vào chỉ mục, .gitignore sẽ không giúp bạn. Bạn sẽ cần phải làm gì git rm sites/default/settings.phpđể loại bỏ nó, và sau đó nó sẽ bị bỏ qua.


thank.but Làm thế nào để tôi loại bỏ các tập tin chỉ từ chỉ mục và không từ thư mục làm việc?
Nick.h

1
git rmnên làm điều đó, nhưng nó có thể yêu cầu bạn sử dụng tùy chọn -f sẽ loại bỏ nó khỏi thư mục làm việc. Tôi đã không tìm ra điều này ngoài việc tạo một bản sao của tệp, làm git rm -fvà sau đó khôi phục bản sao.
jonescb

Giống đàn ông. Tạo một bản sao ở đâu đó, xóa nó, cam kết loại bỏ trạng thái, thêm các tập tin trở lại và xem làm thế nào chúng bị bỏ qua bây giờ.
Yevgeniy Afanasyev

14

Vui lòng sử dụng lệnh này

git rm -rf --cached .
git add .

Đôi khi các tệp .gitignore không hoạt động mặc dù chúng đúng. Lý do Git bỏ qua các tệp là chúng không được thêm vào kho lưu trữ. Nếu bạn đã thêm một tệp mà bạn muốn bỏ qua trước đó, nó sẽ được theo dõi bởi Git và mọi quy tắc khớp bỏ qua sẽ bị bỏ qua. Git làm điều này bởi vì tập tin đã là một phần của kho lưu trữ.


12

Tôi đã từng gặp vấn đề tương tự. Các tệp được xác định ở .gitingorenơi được liệt kê là các tệp không bị theo dõi khi chạy git status.

Lý do là các .gitignoretệp đã được lưu trong UTF-16LEmã hóa, và không UTF8mã hóa.

Sau khi thay đổi mã hóa của .gitignoretập tin thành UTF8nó làm việc cho tôi.


Tôi cảm thấy như một người mới vì điều này ... dang nó Windows
Coty Embry

Bất kỳ ý tưởng tại sao mã hóa tập tin quan trọng? Có lẽ không đọc đúng đường dẫn?
Chargenn

2

Những gì tôi đã làm nó để bỏ qua các tập tin settings.php thành công:

  1. git rm - các trang web đã được cài đặt / default / settings.php
  2. cam kết (đến đây không hoạt động)
  3. xóa các trang web / default / settings.php theo cách thủ công (điều này đã thực hiện thủ thuật)
  4. git thêm.
  5. cam kết (bỏ qua thành công)

Tôi nghĩ rằng nếu có tệp cam kết trên Git thì bỏ qua không hoạt động như mong đợi. Chỉ cần xóa các tập tin và cam kết. Sau đó nó sẽ bỏ qua.


2

Có những trường hợp, ví dụ như các tệp Cấu hình ứng dụng mà tôi muốn theo dõi trong git (vì vậy .gitignore sẽ không hoạt động), nhưng tôi cần thay đổi cho các cài đặt cục bộ. Tôi không muốn git quản lý các tệp này hoặc hiển thị chúng dưới dạng sửa đổi. Để làm điều này, tôi sử dụng Skip-worktree:

git update-index --skip-worktree path/to/file

Bạn có thể xác nhận các tệp bị bỏ qua bằng cách liệt kê các tệp và kiểm tra các dòng bắt đầu bằng S để bỏ qua

git ls-files -v | grep ^S

Nếu trong tương lai bạn muốn có git quản lý tệp cục bộ một lần nữa, chỉ cần chạy:

 git update-index --no-skip-worktree path/to/file

Mescalito ở trên đã có một câu trả lời tuyệt vời, điều đó dẫn tôi đi đúng hướng nhưng

git update-index - tệp không thay đổi / đến / ign.php

Có một hợp đồng với git trong đó: người dùng hứa sẽ không thay đổi tệp và cho phép Git giả định rằng tệp cây làm việc khớp với những gì được ghi trong chỉ mục.

Tuy nhiên, tôi thay đổi nội dung của các tệp, vì vậy trong trường hợp của tôi --skip-worktree là lựa chọn tốt hơn.

Trang web của Toshiharu Nishina đã cung cấp một lời giải thích tuyệt vời về Skip-worktree so với giả định không thay đổi: Bỏ qua các tệp đã được quản lý với Git cục bộ


2

Một lý do khác có thể - một vài trường hợp khách hàng git chạy cùng một lúc . Ví dụ: "git shell" + "GitHub Desktop", v.v.


Điều này đã xảy ra với tôi, tôi đã sử dụng "GitHub Desktop" làm máy khách chính và nó đã bỏ qua một số cài đặt .gitignore mới: commit sau commit:

  1. Bạn cam kết một cái gì đó.
  2. Tiếp theo, cam kết: nó bỏ qua các cài đặt .gitignore. Cam kết bao gồm rất nhiều tệp tạm thời được đề cập trong .gitignore.
  3. Xóa bộ nhớ cache git; kiểm tra xem .gitignore có phải là UTF8 hay không; xóa tệp -> cam kết -> di chuyển tệp trở lại; bỏ qua 1 cam kết - không có gì giúp được

Lý do : trình soạn thảo Visual Studio Code đang chạy trong nền với cùng một kho lưu trữ đã mở. Mã VS có kiểm soát git tích hợp và điều này tạo ra một số xung đột.

Giải pháp : kiểm tra kỹ nhiều máy khách git ẩn, chỉ sử dụng một máy khách git cùng một lúc, đặc biệt là trong khi xóa bộ đệm git.


1

Đảm bảo .gitignore không có tiện ích mở rộng !! Nó không thể là .gitignore.txt, trong windows chỉ cần đặt tên tệp .gitignore. và nó sẽ hoạt động.


0

Tôi vừa thử điều này với git 1.7.3.1 và đưa ra một cấu trúc như:

repo/.git/
repo/.gitignore
repo/sites/default/settings.php

nơi reponhư vậy là "gốc" được đề cập ở trên (tôi sẽ gọi nó là gốc rễ của cây làm việc của bạn), và .gitignorechỉ chứa sites/default/settings.php, các công trình bỏ qua cho tôi (và nó không quan trọng cho dù .gitignoređược thêm vào repo hay không). Điều này có phù hợp với bố trí repo của bạn? Nếu không, có gì khác?


Có. Nó giống hệt như của bạn. Nhưng không hoạt động. Tất cả các mẫu khác đều hoạt động. Như tôi đã nói vấn đề chắc chắn liên quan đến thư mục settings.php.
Nick.h

Tôi cảm thấy đó là một ý tưởng rất tồi để giữ các công cụ trong kho lưu trữ của bạn và bỏ qua những thay đổi trên đó.
Yevgeniy Afanasyev

@YevgeniyAfanasyev ngoại trừ những thứ như đầu ra biên dịch, cài đặt người dùng IDE, tất cả các tệp tạm thời khác được tạo bởi toolchain của bạn
Chris F Carroll

Tôi có nghĩa là giữ cam kết trong kho lưu trữ, không chỉ các tệp trong thư mục dự án. Tại sao bạn cần tệp tạm thời trong kho lưu trữ?
Yevgeniy Afanasyev

0

Chỉ trong trường hợp bất cứ ai trong tương lai có cùng một vấn đề mà tôi đã làm:

Nếu bạn sử dụng

*
!/**/
!*.*

mẹo để xóa các tệp nhị phân không có phần mở rộng, hãy đảm bảo rằng TẤT CẢ các dòng gitignore khác đang DƯỚI ĐÂY. Git sẽ đọc từ .gitignore từ đầu, vì vậy mặc dù tôi đã có 'test.go' trong gitignore của mình, nó đã xuất hiện đầu tiên trong tệp và trở thành 'không được xếp hạng' sau

!*.*

0

Tôi đã thử hầu hết các lệnh trên trên thiết bị đầu cuối VS Code và tôi gặp lỗi như:

fatal: pathspec '[dir]/[file]' did not match any files

Tôi đã mở dự án trên GitHub Desktop và bỏ qua từ đó và nó đã hoạt động.

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.