Xóa thư mục khỏi theo dõi git


404

Tôi cần loại trừ một thư mục (tên tải lên) khỏi theo dõi. Tôi đã cố chạy

git rm -r --cached wordpress/wp-content/uploads

và sau đó tôi đã thêm đường dẫn đến .gitignore

/wordpress/wp-content/uploads

Nhưng khi tôi chạy, git statuschúng hiển thị như đã xóa. Nếu tôi cố gắng thực hiện các thay đổi, các tệp sẽ bị xóa, không chỉ bị xóa khỏi theo dõi.

Tôi đang làm gì sai?

Tôi cũng đã thử

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

nhưng điều này dường như chỉ mở khóa các tập tin. Nhưng tôi cần xóa toàn bộ thư mục (bao gồm cả các thư mục con) khỏi theo dõi.


Đã xóa không có nghĩa là git sẽ xóa các tệp của bạn. Tuy nhiên, nếu bạn sẽ sử dụng reset --hard, nó sẽ.
keltar

2
Như @keltar đề cập, cam kết sẽ không khiến các tệp của bạn bị xóa. Nó sẽ cam kết xóa chúng khỏi Git , nhưng bản sao làm việc của bạn vẫn chứa chúng. Nhưng nếu bạn pullcam kết ở một nơi khác, các tệp đó sẽ bị xóa khỏi hệ thống mới.
Chris

Câu trả lời:


868

Tôi đã gặp câu hỏi này trong khi Googling cho "git xóa thư mục khỏi theo dõi". Câu hỏi của OP dẫn tôi đến câu trả lời. Tôi đang tóm tắt nó ở đây cho các thế hệ tương lai.

Câu hỏi

Làm cách nào để xóa thư mục khỏi kho git của tôi mà không xóa thư mục đó khỏi máy cục bộ (tức là môi trường phát triển)?

Câu trả lời

Bước 1. Thêm đường dẫn thư mục vào .gitignoretập tin gốc của repo của bạn .

path_to_your_folder/

Bước 2. Xóa thư mục khỏi theo dõi git cục bộ của bạn, nhưng giữ nó trên đĩa của bạn.

git rm -r --cached path_to_your_folder/

Bước 3. Đẩy các thay đổi của bạn đến repo git của bạn.

Thư mục sẽ được coi là "đã bị xóa" khỏi quan điểm của Git (tức là chúng có trong lịch sử quá khứ, nhưng không phải trong cam kết mới nhất và những người kéo từ repo này sẽ xóa các tệp khỏi cây của họ), nhưng vẫn ở trong thư mục làm việc của bạn bởi vì bạn đã sử dụng --cached.


2
Câu hỏi nhanh, đường dẫn thư mục có phải là đường dẫn đầy đủ không? hoặc chỉ là đường dẫn với kho git đóng vai trò là cơ sở?
HMSCelestia

Tôi tin rằng đó là con đường đầy đủ, nhưng đừng nhớ chắc chắn.
Tod Birdsall

7
"Và những người lấy từ repo này sẽ xóa các tệp khỏi cây của họ" Tôi có thể ngăn chặn điều này không?
Leo Gasparrini

điều này đã xóa chính xác các tệp của tôi khỏi theo dõi trên một nhánh, nhưng đã xóa chúng sau khi hợp nhất!
Harold

1
đối với tôi vẫn còn. Ngoài ra - tôi có nên bỏ chọn các tệp đó khi cam kết trong thư mục không? Tôi đã thử cả hai cách. Nếu bỏ chọn, nó không cho phép đẩy, nhưng sau đó tôi đã thay đổi một char trong một tệp khác cần được theo dõi. Vẫn không giúp được gì
Darius.V

44

Điều này làm việc cho tôi:

git rm -r --cached --ignore-unmatch folder_name

--ignore-unmatch rất quan trọng ở đây, nếu không có tùy chọn đó, git sẽ thoát với lỗi trên tệp đầu tiên không có trong chỉ mục.


unknown option 'ignore unmatched'
Inigo

Đây là một lá cờ quan trọng nếu thư mục trống, cảm ơn bạn!
MNN

rất hữu ích nếu bạn chỉ muốn xóa một số phần mở rộng tệp khỏi một thư mục:git rm -r --cached --ignore-unmatch .idea/*.xml
takanuva15


8

Tôi biết đây là một chủ đề cũ nhưng tôi chỉ muốn thêm một chút vì giải pháp được đánh dấu không giải quyết được vấn đề cho tôi (mặc dù tôi đã thử nhiều lần).

Cách duy nhất tôi thực sự có thể dừng biểu mẫu git theo dõi thư mục là làm như sau:

  1. Tạo một bản sao lưu của thư mục cục bộ và đặt ở một nơi an toàn.
  2. Xóa thư mục khỏi repo cục bộ của bạn
  3. Đảm bảo xóa bộ nhớ cache git rm -r --cached your_folder/
  4. Thêm your_folder/vào .gitignore
  5. Cam kết thay đổi
  6. Thêm bản sao lưu vào repo của bạn

Bây giờ bạn sẽ thấy rằng thư mục không còn được theo dõi.

Đừng hỏi tôi tại sao chỉ xóa bộ nhớ cache không hiệu quả với tôi, tôi không phải là siêu thuật sĩ Git nhưng đây là cách tôi giải quyết vấn đề.


Cảm ơn bạn!!! Git đã khiến tôi phát điên khi không bỏ qua thư mục nhật thực .metadata. Thực hiện theo các bước của bạn với thư mục nhật thực .metadata và cuối cùng nó đã hoạt động.
MasterN8

5

Từ tài liệu git:

Một điều hữu ích khác mà bạn có thể muốn làm là giữ tệp trong cây làm việc của bạn nhưng xóa nó khỏi khu vực tổ chức của bạn. Nói cách khác, bạn có thể muốn giữ tệp trên ổ cứng của mình nhưng không có Git theo dõi nó nữa. Điều này đặc biệt hữu ích nếu bạn quên thêm một cái gì đó vào tệp .gitignore của mình và vô tình dàn dựng nó, như một tệp nhật ký lớn hoặc một loạt các tệp được biên dịch .a. Để làm điều này, sử dụng tùy chọn --cached:

$ git rm --cached readme.txt

Vì vậy, có thể không bao gồm "-r"?


1
OP đã thử --cached. Các -rtùy chọn là "đệ quy", mà nên được bao gồm trong trường hợp này.
Chris

Tôi thấy điều này hữu ích. Tôi đã tìm kiếm cách để làm điều đó trên một thư mục, và sau đó xem cách để làm điều đó trên một tập tin. Tôi đánh dấu nhận xét này.
ánh sá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.