a

Câu hỏi Làm thế nào để làm cho Git "quên" về một tập tin đã được theo dõi nhưng bây giờ là trong .gitignore?


Có một tệp đang được theo dõi bởi git, nhưng bây giờ tập tin nằm trên .gitignore danh sách.

Tuy nhiên, tệp đó vẫn hiển thị trong git status sau khi được chỉnh sửa. Làm thế nào để bạn lực lượng git hoàn toàn quên nó?


3665
2017-08-13 19:23


gốc


git clean -X âm thanh tương tự, nhưng nó không áp dụng trong tình huống này (khi các tệp vẫn đang được Git theo dõi). Tôi đang viết điều này cho bất cứ ai tìm kiếm một giải pháp không theo con đường sai. - imz -- Ivan Zakharyaschev
Câu trả lời thực sự duy nhất cho điều này là xuống dưới đây, xem git update-index --assume-unchanged. Giải pháp này 1) giữ tệp trên máy chủ (chỉ mục), 2) cho phép bạn sửa đổi nó một cách tự do cục bộ. - Qwerty
Bạn cần sử dụng --skip-worktree, xem: stackoverflow.com/questions/13630849/… - Doppelganger
Một câu hỏi quan trọng là: nên tập tin vẫn còn trong kho lưu trữ hay không? Ví dụ: nếu ai đó mới nhân bản repo, họ có nhận được tệp hay không? Nếu VÂNG sau đó git update-index --assume-unchanged <file> là chính xác và tệp sẽ vẫn còn trong kho lưu trữ và các thay đổi sẽ không được thêm vào git add. Nếu KHÔNG (ví dụ: một số tệp bộ nhớ cache, tệp được tạo, v.v.), sau đó git rm --cached <file> sẽ xóa nó khỏi kho lưu trữ. - Martin
@Martin @Qwerty Everyon nên dừng lại để tư vấn cho --assume-unchanged đó là hiệu suất để ngăn git kiểm tra trạng thái của các tệp được theo dõi lớn nhưng thích --skip-worktree dành cho các tệp được theo dõi đã sửa đổi mà người dùng không muốn cam kết nữa. Xem stackoverflow.com/questions/13630849/… - Philippe


Các câu trả lời:


.gitignore sẽ ngăn các tệp không được thêm vào (không có add -f) vào tập hợp các tệp được theo dõi bởi git, tuy nhiên git sẽ tiếp tục theo dõi bất kỳ tệp nào đang được theo dõi.

Để ngừng theo dõi tệp, bạn cần xóa tệp khỏi chỉ mục. Điều này có thể đạt được với lệnh này.

git rm --cached <file>

Việc loại bỏ các tập tin từ bản sửa đổi đầu sẽ xảy ra trên cam kết tiếp theo.


3887
2017-08-13 20:40



quá trình mà workd cho tôi là 1. cam kết chờ thay đổi đầu tiên 2. git rm --cached <file> và commit lại 3. thêm tập tin vào .gitignore, kiểm tra với git status và commit lại - mataal
Thêm rất quan trọng. Nếu tệp bị bỏ qua sẽ bị sửa đổi (nhưng mặc dù điều này không nên được cam kết), sau khi sửa đổi và thực thi git add . nó sẽ được thêm vào chỉ mục. Và cam kết tiếp theo sẽ cam kết nó vào kho lưu trữ. Để tránh điều này thực thi ngay sau khi tất cả mataal đó nói một lệnh nữa: git update-index --assume-unchanged <path&filename> - Dao
Phương pháp của @AkiraYamamoto cũng làm việc tốt cho tôi. Trong trường hợp của tôi, tôi đã loại bỏ đầu ra kể từ khi kho lưu trữ của tôi có hàng ngàn tệp: git rm -r -q --cached . - Aaron Blenkush
Thao tác này sẽ xóa tệp trên git pull Tuy nhiên. - Petr Peller
git rm --cached <file> chỉ cần xóa tệp khỏi kho lưu trữ, git update-index --assume-không thay đổi <file> không hiển thị tệp trong các thay đổi chưa được chỉnh sửa và không thực hiện kéo các thay đổi mới. Nhưng tôi muốn GIT JUST IGNORE NỘI DUNG CỦA TẬP_TIN FILE - Igor Semin


Loạt lệnh dưới đây sẽ loại bỏ tất cả các mục từ chỉ mục Git (không phải từ thư mục làm việc hoặc repo cục bộ), và sau đó cập nhật chỉ số Git, trong khi tôn trọng git bỏ qua. PS. Index = Cache

Đầu tiên:

git rm -r --cached . 
git add .

Sau đó:

git commit -am "Remove ignored files"

1997
2017-09-30 13:51



Để làm nổi bật sự khác biệt giữa câu trả lời này và câu trả lời được chấp nhận: Sử dụng các lệnh này bạn không cần thực sự biết các tệp bị ảnh hưởng. (Hãy tưởng tượng một thư mục tạm thời với nhiều tệp ngẫu nhiên cần được xóa khỏi chỉ mục). - Ludwig
Giống như câu trả lời được chấp nhận. Các tệp sẽ bị xóa vào git pull. - Petr Peller
Nó sẽ được tốt đẹp để có điều này như là một lệnh git tiêu chuẩn. Cái gì đó như git rmignored. - Berik
@gudthing -r là viết tắt của "đệ quy" - Monkey King
Với điều này, bạn có thể kết thúc việc thêm khác các tệp vô dụng hiện không có trong .gitignore. Điều này có thể khó tìm ra nếu phụ thuộc vào tiếng ồn của bạn git status là sau lệnh này. Một lệnh chỉ loại bỏ các tệp mới bị bỏ qua sẽ tốt hơn. Đó là lý do tại sao tôi thích Câu trả lời của thSoft - KurzedMetal


git update-index công việc của tôi:

git update-index --assume-unchanged <file>

Chú thích: Giải pháp này thực sự độc lập trên .gitignore như gitignore chỉ dành cho các tệp không được theo dõi.

chỉnh sửa: Vì câu trả lời này đã được đăng, một tùy chọn mới đã được tạo và nên được ưu tiên hơn. Bạn nên sử dụng --skip-worktree dành cho các tệp được theo dõi được sửa đổi mà người dùng không muốn cam kết nữa và giữ --assume-unchanged để thực hiện ngăn chặn git kiểm tra trạng thái của các tệp được theo dõi lớn. Xem https://stackoverflow.com/a/13631525/717372 để biết thêm chi tiết...


740
2017-11-27 11:24



Điều này LÀ câu trả lời thực sự. Thật tuyệt vời, rất đơn giản, không gây ô nhiễm git status và thực sự rất trực quan. Cảm ơn. - Pablo Olmos de Aguilera C.
Tôi đã đi đủ tốt rm [...] . giải pháp, ít nhất tôi có thể mò mẫm cách nó hoạt động. Tôi không tìm thấy tài liệu tuyệt vời về những gì update-index & --assume-unchanged làm. Bất cứ ai có thể thêm như thế nào so sánh này với khác, trong đó tôi muốn loại bỏ tất cả các tập tin mà có thể đã bị bỏ qua? (Hoặc một liên kết để giải thích rõ ràng?) - Brady Trainor
git update-index --assume-unchanged <path> … sẽ khiến git bỏ qua những thay đổi trong (các) đường dẫn đã chỉ định, bất kể .gitignore. Nếu bạn kéo từ xa và điều khiển từ xa đã thay đổi đường dẫn này, git sẽ không hợp nhất với một xung đột và bạn sẽ cần phải hợp nhất theo cách thủ công. git rm --cached <path> … sẽ khiến git ngừng theo dõi đường dẫn đó. Nếu bạn không thêm đường dẫn đến .gitignorebạn sẽ thấy con đường trong tương lai git status. Tùy chọn đầu tiên có ít tiếng ồn hơn trong lịch sử cam kết git và cho phép thay đổi tệp "bỏ qua" được phân phối trong tương lai. - ManicDee
Hoàn tác bằng cách sử dụng: git update-index --no-giả-không thay đổi <file> - xgMz
Tôi khá bối rối vì đây không phải là câu trả lời được chấp nhận. Câu trả lời được chấp nhận ở đây rõ ràng không trả lời câu hỏi thực tế đang được hỏi. Câu trả lời này bỏ qua những thay đổi đối với tệp trong kho lưu trữ trong khi không xóa nó khỏi kho lưu trữ. - Dave Cooper


git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

Điều này có danh sách các tập tin bị bỏ qua và loại bỏ chúng khỏi chỉ mục, sau đó cam kết các thay đổi.


218
2018-05-23 22:29



Nếu bạn cần phải loại bỏ chúng khỏi thư mục làm việc, quá, sau đó chỉ cần chạy git ls-files --ignored --exclude-standard | xargs git rm . Tôi tin rằng câu trả lời này là tốt nhất! Bởi vì nó rất rõ ràng, theo cách Unix, và thực hiện điều mong muốn một cách trực tiếp, mà không cần phải soạn thảo các tác dụng phụ của các lệnh khác phức tạp hơn. - imz -- Ivan Zakharyaschev
Câu trả lời chính xác; tuy nhiên, lệnh sẽ thất bại nếu bạn có đường dẫn có dấu cách ở giữa, ví dụ: "My dir / my_ignored_file.txt" - David Hernandez
git ls-files --ignored --exclude-standard | sed 's /.*/"&"/' | xargs git rm - cắt - David Hernandez
git rm sẽ phàn nàn nếu ls-files không phù hợp với bất cứ điều gì. Sử dụng xargs -r git rm ... nói xargs không chạy git rm nếu không có tệp nào phù hợp. - Wolfgang
Sẽ tốt hơn nếu sử dụng \ 0 làm dấu phân tách: git ls-files --ignored --exclude-standard -z|xargs -0 git rm --cached - Nils-o-mat


Tôi luôn luôn sử dụng lệnh này để loại bỏ những tập tin không được theo dõi. Một dòng, kiểu Unix, đầu ra sạch:

git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

Nó liệt kê tất cả các tệp bị bỏ qua của bạn, thay thế mọi dòng đầu ra bằng một dòng được trích dẫn thay thế để xử lý các đường dẫn có dấu cách bên trong và chuyển mọi thứ đến git rm -r --cached để xóa đường dẫn / tệp / dir khỏi chỉ mục.


60
2018-06-19 15:42



Giải pháp tuyệt vời! Làm việc hoàn hảo và cảm thấy chính xác hơn khi xóa tất cả các tệp rồi thêm chúng trở lại. - Jon Catmull
Tôi cũng thấy điều này "sạch nhất". Nó có thể là hiển nhiên, nhưng chỉ cần chạy phần đầu tiên, git ls-files --ignored --exclude-standard, một mình, cho phép bạn hiểu / xác minh tệp nào mới của bạn .gitignore sẽ loại trừ / xóa, trước khi bạn tiếp tục và thực thi git rm. - JonBrave
Lưu ý, không thành công trên tên tệp có các ký tự "khó chịu" nhất định trong chúng, ví dụ: \n. Tôi đã đăng giải pháp của mình để phục vụ cho việc này. - JonBrave
Một cảnh báo khác: khi kéo, điều này sẽ khiến tệp bị xóa trong thư mục làm việc của người khác, đúng không? - LarsH


Nếu bạn không thể git rm một tệp được theo dõi bởi vì những người khác có thể cần nó (cảnh báo, ngay cả khi bạn  git rm --cached, khi người khác nhận được thay đổi này, các tệp của họ sẽ bị xóa trong hệ thống tệp của họ), hãy xem https://gist.github.com/1423106 cho những cách mọi người đã làm việc xung quanh vấn đề.


49
2017-07-19 00:08



git sẽ không xóa tệp, nếu nó bị bẩn vào thời điểm xóa. Và nếu nó không bẩn, việc truy xuất tệp sẽ dễ dàng như git checkout <oldref> -- <filename> - nhưng sau đó nó sẽ được kiểm tra và bỏ qua. - amenthes
Trong khi điều này về mặt lý thuyết có thể trả lời câu hỏi, nó sẽ là thích hợp hơn để bao gồm các phần thiết yếu của câu trả lời tại đây và cung cấp liên kết để tham khảo. Xem đây để được hướng dẫn cách viết tốt hơn câu trả lời "dựa trên liên kết". Cảm ơn! - GhostCat
Chỉ cần nói. Câu trả lời 5 tuổi, và 45 người bỏ phiếu, nhưng không ai dám nói "chỉ có câu trả lời liên kết là xấu?" - GhostCat


di chuyển nó ra, cam kết, sau đó di chuyển nó trở lại. Điều này đã làm việc cho tôi trong quá khứ. Có lẽ có một cách 'gittier' để thực hiện điều này.


44
2017-08-13 19:27



Điều này làm việc tuyệt vời nếu bạn muốn bỏ qua một loạt các tập tin mà trước đây không bị bỏ qua. Mặc dù như bạn nói, có lẽ là một cách tốt hơn cho việc này. - Oskar Persson
Đây chính xác là những gì tôi đã làm. Đơn giản chỉ cần di chuyển các tập tin vào một thư mục bên ngoài git, sau đó làm "git add.", "Git commit". (Điều này loại bỏ các tập tin) sau đó thêm gitignore, tham khảo các tập tin / thư mục, cam kết một lần nữa để thêm các tập tin gitignore để git, sau đó sao chép / di chuyển trở lại trong các thư mục, và họ cần được bỏ qua. NB: nó sẽ xuất hiện rằng các tập tin đã bị xóa khỏi GIT, vì vậy có lẽ sẽ loại bỏ chúng khỏi các checkouts / pull khác, như đã đề cập trong các giải pháp trên, nhưng vì bạn đang tạo bản sao của chúng ban đầu, đây không phải là vấn đề IMHO. chỉ để cho các thành viên còn lại biết ... - Del
Đây là cách dễ nhất để loại bỏ các thư mục được cam kết sai. - Martlark
Có vẻ là cách duy nhất, tôi có thể thấy. Đó là một lỗi lớn (không phải là 'tính năng') trong git rằng ngay sau khi bạn thêm một tập tin / thư mục để .gitignore, nó không chỉ bỏ qua tập tin đó từ thời điểm đó - mãi mãi - ở khắp mọi nơi. - JosephK