Câu hỏi Xóa tệp khỏi kho lưu trữ Git mà không xóa nó khỏi hệ thống tệp cục bộ


Cam kết ban đầu của tôi chứa một số tệp nhật ký. Tôi đã thêm *log với tôi .gitignorevà bây giờ tôi muốn xóa các tệp nhật ký khỏi kho lưu trữ của mình.

git rm mylogfile.log

sẽ xóa một tệp khỏi kho lưu trữ, nhưng cũng sẽ xóa tệp đó khỏi hệ thống tệp cục bộ.

Làm cách nào để xóa tệp này khỏi repo không có xóa bản sao tệp cục bộ của tôi?


2439
2017-07-17 14:56


gốc


Bản sao của Ngừng theo dõi và bỏ qua các thay đổi đối với tệp trong Git


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


Đối với một tệp:

git rm --cached mylogfile.log

Đối với thư mục duy nhất:

git rm --cached -r mydirectory

3508
2017-07-17 14:57



Cảm ơn! Tôi không chắc chắn làm thế nào tôi bỏ lỡ điều này trong người đàn ông ... "Khi - được đưa ra, nội dung dàn dựng phải khớp với một trong hai đầu của nhánh hoặc tập tin trên đĩa, cho phép tập tin được loại bỏ khỏi chỉ mục . " - mveerman
có thể vì nó không tự giải thích như --keep-local. - Martin
@DGGenuine, --keep-local là một đối số svn rm - bdonlan
cảm ơn @bdonian. Phải là một tùy chọn cho phiên bản git-rm mới. Trớ trêu thay trang này là kết quả hàng đầu khi googling "git rm" --keep-local '" - Carl G
Nhưng làm thế nào o tôi bảo quản các tập tin trên máy chủ từ xa? Điều này giữ một địa phương của tôi, nhưng nếu tôi đẩy và kéo từ một máy chủ khác, tập tin sẽ bị xóa. Tôi cũng đã thêm một .gitignore cho tệp nhưng nó vẫn bị xóa - spankmaster79


Để xóa toàn bộ thư mục khỏi repo (như các tệp Resharper), hãy thực hiện việc này:

git rm -r --cached folderName

Tôi đã cam kết một số tệp resharper và không muốn những tệp đó tồn tại cho những người dùng dự án khác.


249
2018-04-04 18:14



Chỉ là một lưu ý bổ sung cho khách truy cập trong tương lai: Không sử dụng GUI để "Đồng bộ hóa" cam kết quay lại repo. Điều đó sẽ kéo các tập tin trở lại vào repo địa phương của bạn. Bạn phải làm một Git Push repo branch để thực sự xóa các tệp khỏi điều khiển từ xa. - RubberDuck
@RubberDuck Một câu trả lời 3 tuổi, và giải pháp duy nhất làm việc cho tôi :) Cảm ơn - Mariusz


Bạn cũng có thể xóa các tệp khỏi kho lưu trữ dựa trên tệp .gitignore mà không xóa chúng khỏi hệ thống tệp cục bộ:

git rm --cached `git ls-files -i -X .gitignore`

Hoặc, cách khác, trên Windows Powershell:

git rm --cached $(git ls-files -i -X .gitignore)

163
2018-01-31 10:05



Không hoạt động trên Windows. git ls-files -i -X ​​.gitignore hoạt động, nhưng tôi không biết cách gửi các tệp tới 'git rm'. Bạn có biết làm thế nào để làm điều đó? - Erik Z
Hoạt động trên Windows nếu bạn sử dụng Git Bash thay cho giao diện điều khiển cmd - Andreas Zita
Thích cái này. Đã làm việc ngoại trừ việc tôi có một số tệp kết thúc có khoảng trống trong tên tệp. Tôi sửa đổi giải pháp ở đây để điều này: git ls-files -i -X .gitignore | xargs -I{} git rm --cached "{}". Hãy xem xét sửa đổi hoặc thêm giải pháp này vào câu trả lời ở đây, bởi vì nó là một công cụ tuyệt vời để có ... - mpettis
Tôi đã không thử nhưng nó nên được kiểm tra nó sẽ loại bỏ các tập tin như .gitkeep lưu giữ một thư mục trống trong kho. Ví dụ. .gitignore chứa thư mục uploads và repo buộc phải theo dõi .gitkeep. Bằng cách xóa tất cả khỏi repo trong uploads nó cũng sẽ xóa .gitkeep. - Vladimir Vukanac
Lưu ý: không hoạt động với các tệp .gitignore lồng nhau - acidjunk


Ngoài ra, nếu bạn đã cam kết dữ liệu nhạy cảm (ví dụ: tệp chứa mật khẩu), bạn nên xóa hoàn toàn dữ liệu đó khỏi lịch sử của kho lưu trữ. Dưới đây là hướng dẫn giải thích cách thực hiện: http://help.github.com/remove-sensitive-data/


66
2017-08-21 12:16



Câu trả lời này nên bao gồm các lệnh bắt buộc để hoàn thành tác vụ này thay vì liên kết đến một trang web khác. - Florian Lemaitre


Theo câu trả lời của tôi ở đây: https://stackoverflow.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository

Để loại bỏ thư mục / thư mục hoặc tập tin chỉ từ kho git và không phải từ thử địa phương 3 bước đơn giản.


Các bước để xóa thư mục

git rm -r --cached File-or-FolderName
git commit -m "Removed folder from repository"
git push origin master

Các bước bỏ qua thư mục đó trong các cam kết tiếp theo

Để bỏ qua thư mục đó từ các cam kết tiếp theo, hãy tạo một tệp trong thư mục gốc có tên .gitignore   và đặt tên thư mục đó vào đó. Bạn có thể đặt bao nhiêu tùy thích

.gitignore tệp sẽ trông như thế này

/FolderName

remove directory


58
2017-08-24 12:16



Trong sự tò mò, làm thế nào bạn làm mờ? - kmort
@kmort Haha, tôi đã làm điều đó bằng cách sử dụng công cụ "Awesome Screenshot" của trình duyệt Google Chrome, thực sự nhanh chóng đó là lý do tại sao trông lộn xộn. Xin lỗi vì chuyện đó!! awesomescreenshot.com - eirenaios


Một giải pháp chung chung hơn:

  1. Chỉnh sửa .gitignore tập tin.

    ECHO mylogfile.log >> .gitignore

  2. Xóa tất cả các mục khỏi chỉ mục.

    git rm -r -f --cached .

  3. Xây dựng lại chỉ mục.

    git add .

  4. Thực hiện cam kết mới

    git commit -m "Removed mylogfile.log"


54
2017-12-13 11:42



Điều này thực sự sẽ xóa các tập tin? - Mr_and_Mrs_D
Từ GitHub? KHÔNG. Nếu bạn đã đẩy github, nó sẽ không xóa nó khỏi trang web. Nhưng nó sẽ cập nhật kho git cục bộ của bạn. - mAsT3RpEE
Tôi nghĩ rằng bạn muốn điều này: help.github.com/articles/remove-sensitive-data - mAsT3RpEE
Nhận xét bạn đã xóa được loại bỏ nhiều hơn thực sự :) Vấn đề với giải pháp rm --cashed là nó cuối cùng sẽ xóa các tập tin khi một kéo - phải không? Và đây không phải là điều mọi người muốn khi họ nói "Xóa một tệp khỏi kho lưu trữ mà không xóa nó khỏi hệ thống tập tin cục bộ"Bây giờ tại sao giải pháp trên được chấp nhận là vượt ra ngoài tôi - có lẽ OP đã làm việc một mình và không bao giờ kéo? Dunno. Tôi hiểu github" một lần đẩy luôn luôn có "vấn đề ofc - Mr_and_Mrs_D
Vấn đề của tôi không phải là github - đó là tệp thực sự sẽ bị xóa khỏi đồng nghiệp khi họ kéo. tôi không muốn xóa tệp. Điều này đã gây ra cho tôi những vấn đề lớn trong quá khứ. Vì vậy, tôi đã tự hỏi liệu có thực sự là một giải pháp thực sự không làm xóa tệp. Xem thêm bình luận quán trọ câu trả lời được chấp nhận: stackoverflow.com/questions/1143796/… - Mr_and_Mrs_D


Git cho phép bạn bỏ qua các tệp đó bằng cách giả sử chúng không thay đổi. Điều này   được thực hiện bằng cách chạy git update-index --assume-unchanged path/to/file.txt chỉ huy. Khi đánh dấu một tập tin như vậy, git sẽ   hoàn toàn bỏ qua bất kỳ thay đổi nào trên tệp đó; chúng sẽ không xuất hiện khi   chạy trạng thái git hoặc git diff, cũng như chúng sẽ không bao giờ được cam kết.

(Từ https://help.github.com/articles/ignoring-files)

Do đó, không xóa nó, nhưng bỏ qua những thay đổi cho nó mãi mãi. Tôi nghĩ rằng điều này chỉ hoạt động tại địa phương, do đó, đồng nghiệp vẫn có thể thấy những thay đổi với nó trừ khi họ chạy lệnh tương tự như trên. (Tuy nhiên, vẫn cần xác minh điều này).

Lưu ý: Điều này không trả lời trực tiếp câu hỏi, nhưng dựa trên các câu hỏi tiếp theo trong phần nhận xét của các câu trả lời khác.


18
2018-01-28 11:46



Hm, tôi làm điều này nhưng tôi thấy rằng các tập tin có thể được ghi đè nếu ai đó thay đổi nó trên repo. - AlxVallejo


Các câu trả lời trên không hiệu quả với tôi. Tôi đã sử dụng bộ lọc-chi nhánh để xóa tất cả các tệp đã cam kết

xóa tệp khỏi kho lưu trữ git bằng:

git filter-branch --tree-filter 'rm  file'

xóa một thư mục khỏi kho lưu trữ git bằng:

git filter-branch --tree-filter 'rm -rf directory'

Thao tác này sẽ xóa thư mục hoặc tệp khỏi tất cả các cam kết

bạn có thể chỉ định một cam kết bằng cách sử dụng:

git filter-branch --tree-filter 'rm -rf directory' HEAD

Hoặc một phạm vi

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

Để đẩy mọi thứ đến từ xa, bạn có thể thực hiện:

git push origin master --force

4
2018-01-12 13:59



Điều này kết hợp với git rm -r --cached NAME là mẹo để loại bỏ nó khỏi repo git địa phương của bạn và ngăn nó ảnh hưởng đến bất cứ ai kéo về sau (bằng cách xóa lịch sử của tập tin hoặc thư mục khỏi git.) - notbad.jpeg
Điều này viết lại lịch sử git và bạn sẽ cần phải đẩy --force sau, đây là một chút phạm vi với câu hỏi tôi đoán. Trên một repo nổi tiếng của công chúng, bạn không thể thay đổi dòng lịch sử như vậy vì mọi người đã nhân bản repo sẽ gặp vấn đề khi kéo. - Guillaume Perrot
Cảm ơn, cuối cùng ai đó đang giải thích phương pháp bước cũ tốt theo từng bước mà không cần bất kỳ công cụ bên ngoài nào - realtebo