Áp dụng .gitignore trên kho lưu trữ hiện có đã theo dõi số lượng lớn tệp


314

Tôi có một dự án Visual Studio hiện có trong kho lưu trữ của tôi. Gần đây tôi đã thêm một tệp .gitignore trong dự án của mình và tôi cho rằng Git sẽ bỏ qua các tệp được liệt kê trong tệp.

Vấn đề của tôi là tất cả các tệp đó đã được theo dõi và theo như tôi biết thì Git sẽ không bỏ qua một tệp đã được theo dõi trước khi một quy tắc được thêm vào tệp này để bỏ qua nó.

Nó được đề xuất để sử dụng: git rm --cachedvà tự theo dõi chúng theo dõi nhưng điều đó sẽ đưa tôi mãi mãi đi qua chúng từng cái một.

Tôi đã nghĩ về việc xóa kho lưu trữ và tạo lại nó một lần nữa nhưng lần này với tệp .gitignore có mặt, nhưng phải có một cách tốt hơn để làm điều này.


1
bạn có thể git rm --cachedtoàn bộ thư mục với -rtùy chọn, nếu điều đó hữu ích
Nathan Wallace



Câu trả lời:


870

Câu trả lời này đã giải quyết vấn đề của tôi:

Trước hết, cam kết tất cả các thay đổi đang chờ xử lý.

Sau đó chạy lệnh này:

git rm -r --cached .

Điều này loại bỏ mọi thứ khỏi chỉ mục, sau đó chỉ cần chạy:

git add .

Cam kết:

git commit -m ".gitignore is now working"

9
Câu trả lời hoàn hảo ! Vui lòng thêm một git push origincũng để phản ánh những thay đổi trong kho lưu trữ từ xa.
Sanket Berde

8
Tôi bắt đầu sử dụng câu trả lời này ... và nó đã xóa gần như mọi thứ trong dự án của tôi! Rõ ràng là tôi đã làm điều gì đó sai. Nhưng tôi muốn cảnh báo mọi người đừng theo đề nghị này một cách tình cờ.
Đánh dấu Olbert

4
Điều này có làm mất lịch sử của các tệp khi bạn xóa và thêm lại chúng không
Aran Mulholland

10
Tôi tự hỏi có bao nhiêu cam kết đang sử dụng .gitignore is now workingtin nhắn này . :)
ihavenoidea

1
Phương pháp này làm việc tốt cho tôi. Tôi đã tạo một tệp gitignore, bỏ qua toàn bộ thư mục, sau đó cam kết thay đổi tạo gitignore này. Sau đó tôi đã làm theo ba lệnh trên chính xác như họ đã nói. Nó hoạt động hoàn hảo, nhưng tôi nên nói rằng trước tiên bạn phải "cam kết tất cả các thay đổi đang chờ xử lý" như đã nêu ở trên.
Erich Meissner

61
  1. Tạo một tệp .gitignore, để làm điều đó, bạn chỉ cần tạo bất kỳ tệp .txt trống nào.

  2. Sau đó, bạn phải thay đổi tên của nó bằng cách viết dòng sau trên cmd ( git.txttên của tệp bạn vừa tạo):

    rename git.txt .gitignore

  3. Sau đó, bạn có thể mở tệp và viết tất cả các tệp không bị theo dõi mà bạn muốn bỏ qua cho tốt. Ví dụ, của tôi trông như thế này:

`` `

OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

Có cả một tập hợp các tệp .gitignore hữu ích của GitHub

  1. Khi bạn đã có thứ này, bạn cần thêm nó vào kho git của mình giống như bất kỳ tệp nào khác, chỉ có nó phải nằm trong thư mục gốc của kho lưu trữ.

  2. Sau đó, trong thiết bị đầu cuối của bạn, bạn phải viết dòng sau:

    git config --global core.excludesfile ~ / .gitignore_global

Từ tài liệu chính thức:

Bạn cũng có thể tạo tệp .gitignore toàn cầu, đây là danh sách các quy tắc bỏ qua các tệp trong mọi kho lưu trữ Git trên máy tính của bạn. Ví dụ: bạn có thể tạo tệp tại ~ / .gitignore_global và thêm một số quy tắc vào nó.

Mở Terminal. Chạy lệnh sau trong thiết bị đầu cuối của bạn: git config --global core.excludesfile ~ / .gitignore_global

Nếu kho lưu trữ đã tồn tại thì bạn phải chạy các lệnh sau:

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

Nếu bước 2 không hoạt động thì bạn nên viết lộ trình lỗ của các tệp mà bạn muốn thêm.


4
@Karen_Wiznia "git config ... _global" tạo ra một gitesore toàn cầu cho tất cả các repo Git trên máy tính. OP không muốn làm điều đó.
ivan7707

Tôi ước tôi có thể thích điều này hơn một lần, tôi liên tục quay lại câu hỏi này để tìm kiếm lời nhắc này.
Antony D'Andrea

1
Nó phải là "mv git.txt .gitignore" thay vì "đổi tên git.txt .gitignore".
Ahmad F

30

Theo quy định tại đây Bạn có thể cập nhật chỉ mục:

git update-index --assume-unchanged /path/to/file

Bằng cách này, các tệp sẽ không hiển thị trong git statushoặc git diff.

Để bắt đầu theo dõi các tệp một lần nữa, bạn có thể chạy:

git update-index --no-assume-unchanged /path/to/file

5
Đây là câu trả lời tốt hơn - nó chỉ tập trung vào một tệp duy nhất, tệp mà bạn không muốn được theo dõi bởi kho lưu trữ. Câu trả lời được đánh dấu cao nhất cũng sẽ hoạt động, nhưng nó không chỉ đơn thuần là bỏ qua một tệp theo dõi bởi git.
Chris Mejka

1
Đây là một người tốt. Nhưng nếu chúng ta kéo thì sao? Có bất kỳ xung đột hợp nhất?
pramod

@pramod, câu hỏi tuyệt vời. Tôi không thực sự chắc chắn. Hãy thử nó trong một kho lưu trữ thử nghiệm tước?
Patrick James McDougle

15

Nếu bạn thêm .gitignorequá muộn, git sẽ tiếp tục theo dõi các tệp đã được cam kết bất kể. Để khắc phục điều này, bạn luôn có thể xóa tất cả các trường hợp được lưu trong bộ nhớ cache của các tệp không mong muốn.

Đầu tiên, để kiểm tra những tập tin bạn thực sự theo dõi, bạn có thể chạy:

git ls-tree --name-only --full-tree -r HEAD

Giả sử bạn đã tìm thấy các tệp không mong muốn trong một thư mục như cache/vậy, sẽ an toàn hơn khi nhắm mục tiêu thư mục đó thay vì tất cả các tệp của bạn.

Vì vậy, thay vì:

git rm -r --cached .

An toàn hơn khi nhắm mục tiêu tệp hoặc thư mục không mong muốn:

git rm -r --cached cache/

Sau đó tiến hành thêm tất cả các thay đổi,

git add .

và cam kết ...

git commit -m ".gitignore is now working"

Tham khảo: https://amyetheredge.com/code/13.html


Đây là câu trả lời tốt nhất và rõ ràng nếu bạn chỉ muốn xóa một vài tệp chứ không phải toàn bộ kho lưu trữ. Tôi cho bạn ngón tay cái của tôi lên.
Apuig

2

Đây là một cách để loại bỏ các chế độ không bị chặn của bất kỳ tập tin nào nếu không được bỏ qua theo tập hợp các mẫu loại trừ hiện tại:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

Điều này để lại các tập tin trong thư mục làm việc của bạn nhưng loại bỏ chúng khỏi chỉ mục.

Thủ thuật được sử dụng ở đây là cung cấp một tệp chỉ mục không tồn tại cho git ls-files để nó nghĩ rằng không có tệp được theo dõi. Mã shell ở trên yêu cầu tất cả các tệp sẽ bị bỏ qua nếu chỉ mục trống và sau đó xóa chúng khỏi chỉ mục thực tế bằng git rm.

Sau khi các tệp đã được dịch vụ không bị khóa, hãy sử dụng trạng thái git để xác minh rằng không có gì quan trọng đã bị xóa (nếu vậy hãy điều chỉnh các mẫu loại trừ của bạn và sử dụng git reset - đường dẫn để khôi phục mục nhập đã xóa). Sau đó, thực hiện một cam kết mới mà bỏ đi crud ra.

Các trò chơi crudal vẫn sẽ có trong bất kỳ cam kết cũ. Bạn có thể sử dụng nhánh bộ lọc git để tạo các phiên bản sạch của các cam kết cũ nếu bạn thực sự cần một lịch sử sạch (nb sử dụng nhánh bộ lọc git sẽ ghi lại lịch sử, vì vậy không nên thực hiện một cách nhẹ nhàng nếu bạn có bất kỳ cộng tác viên nào đã kéo bất kỳ cam kết lịch sử nào của bạn sau khi giới thiệu về crud Lần đầu tiên được giới thiệu).


Nghe có vẻ là một giải pháp vững chắc :) Tôi đoán rằng đây là dành cho Linux shell phải không? Thật không may, tôi là người dùng Win7. Bất cứ cách nào tôi có thể làm điều này trong windows?
Tohid

0

Xóa tệp khỏi khu vực tổ chức

git reset HEAD .

Thêm tất cả các thay đổi

git add .

Cam kết:

git commit -m ".gitignore is now working"

-1

Tôi nghĩ rằng đây là một cách dễ dàng để thêm tệp .gitignore vào kho lưu trữ hiện có.

Điều kiện tiên quyết :

Bạn cần một trình duyệt để truy cập tài khoản github của bạn.

Các bước

  1. Tạo một tệp mới trong dự án bắt buộc (hiện tại) của bạn và đặt tên là .gitignore . Bạn sẽ nhận được lời nhắc gợi ý cho các mẫu .gitignore ngay khi bạn đặt tên tệp là .gitignore . Sử dụng các mẫu này hoặc sử dụng gitignore.io để tạo nội dung của tệp gitignore của bạn .
  2. Cam kết thay đổi.
  3. Bây giờ sao chép kho lưu trữ này.

Chúc vui vẻ!


-3

Sử dụng git clean
Nhận trợ giúp khi chạy

git clean -h

Nếu bạn muốn xem điều gì sẽ xảy ra trước tiên, hãy đảm bảo vượt qua công tắc -n để chạy khô:

git clean -xn

Để loại bỏ rác thải

git clean -xdf

Cẩn thận: Bạn có thể bỏ qua các tệp cấu hình cục bộ như cơ sở dữ liệu.yml cũng sẽ bị xóa. Sử dụng có nguy cơ của riêng bạn.

Sau đó

git add .
git commit -m ".gitignore is now working"
git push
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.