Câu hỏi Làm thế nào tôi có thể xóa một tập tin từ git repo?


Tôi đã thêm một tệp có tên "file1.txt" để git repo. Sau đó tôi cam kết, thêm một vài thư mục gọi là dir1 và dir2và cam kết git repo.

Bây giờ repo hiện tại đã "file1.txt", dir1 và dir2.
Làm thế nào tôi có thể xóa "file1.txt" mà không ảnh hưởng đến những người khác như dir1 và dir2?


1323
2018-01-12 07:48


gốc


git rm là câu trả lời đúng, nhưng hãy nhớ rằng tệp sẽ vẫn ở đó trong lịch sử. Nếu bạn muốn xóa một tệp vì nó có thông tin nhạy cảm, bạn sẽ cần phải làm điều gì đó quyết liệt hơn. (Thay đổi lịch sử, đặc biệt là đối với nội dung bạn đã đẩy, là một hành động quyết liệt và nên tránh nếu có thể.) - Keith Thompson
Lưu ý: trên GitHub, bây giờ bạn có thể trực tiếp xóa một tập tin từ giao diện web (mà không cần phải sao chép repo). Xem câu trả lời của tôi bên dưới. - VonC
@ KeithThompson những bước có thể được nếu tôi tuyệt vọng muốn làm điều đó? - lessthanl0l
@ lessthanl0l: stackoverflow.com/q/872565/827263 - Keith Thompson
liên quan help.github.com/articles/… - Trevor Boyd Smith


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


Sử dụng git rm:

git rm file1.txt
git commit -m "remove file1.txt"

Nhưng nếu bạn chỉ muốn xóa tệp khỏi kho lưu trữ Git và không xóa nó khỏi hệ thống tệp, hãy sử dụng:

git rm --cached file1.txt
git commit -m "remove file1.txt"

Và để đẩy các thay đổi cho repo từ xa

git push origin branch_name  

2228
2018-01-12 07:52



Cũng tiện dụng: git rm -r directory // Để xóa thư mục và nội dung - Reg
Điều đó sẽ không loại bỏ tập tin đó trong các cam kết khác. - VaTo
@SaulOrtega: Đúng vậy. Để xóa tệp khỏi các cam kết trước đó (thay đổi lịch sử trong quá khứ), hãy xem trang trợ giúp của GitHub trên Xóa dữ liệu nhạy cảm. - Greg Hewgill
Hãy lưu ý điều này sẽ xóa các tập tin cục bộ quá. Nếu bạn chỉ muốn xóa nó từ repo làm: git rm --cached file1.txt - Weston Ganger
Cần lưu ý rằng nếu tệp đó chứa thông tin nhạy cảm (ví dụ: thông tin đăng nhập), bạn nên thay đổi những thông tin đăng nhập ngay lập tức. Để trích GitHub "Một khi bạn đã đẩy một cam kết để GitHub, bạn nên xem xét bất kỳ dữ liệu nó có chứa để được thỏa hiệp. Nếu bạn đã cam kết một mật khẩu, thay đổi nó! Nếu bạn cam kết một chìa khóa, tạo ra một cái mới." - c1moore


git rm file.txt xóa tệp khỏi repo nhưng cũng xóa nó khỏi hệ thống tệp cục bộ.

Để xóa tệp khỏi repo và không phải xóa nó khỏi hệ thống tập tin cục bộ sử dụng:
git rm --cached file.txt 

Tình hình chính xác dưới đây là nơi tôi sử dụng git để duy trì quyền kiểm soát phiên bản cho trang web của doanh nghiệp của tôi, nhưng thư mục "mickey" là thư mục tmp để chia sẻ nội dung riêng tư với nhà phát triển CAD. Khi anh ta cần các tệp HUGE, tôi đã tạo một thư mục riêng, không được liên kết và ftpd các tệp ở đó để anh ta tìm nạp thông qua trình duyệt. Quên tôi đã làm điều này, sau đó tôi đã thực hiện một git add -A từ thư mục cơ sở của trang web. Sau đó, git status cho thấy các tệp mới cần cam kết. Bây giờ tôi cần xóa chúng khỏi theo dõi và kiểm soát phiên bản của git ...

Đầu ra mẫu dưới đây là từ những gì vừa xảy ra với tôi, nơi tôi vô tình xóa .003 tập tin. Rất may, tôi không quan tâm chuyện gì đã xảy ra với bản sao cục bộ .003, nhưng một số tệp hiện đang được thay đổi khác là các bản cập nhật tôi vừa mới thực hiện cho trang web và sẽ sử thi được xóa trên hệ thống tệp cục bộ! "Hệ thống tệp cục bộ" = trang web trực tiếp (không phải là một thực hành tuyệt vời, nhưng là thực tế).

[~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
(use --cached to keep the file, or -f to force removal)
[~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
rm 'shop/mickey/mtt_flange_SCN.7z.003'
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
#   modified:   shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
rm 'shop/mickey/mtt_flange_SCN.7z.002'
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.002
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
[~/www]$

Cập nhật: Câu trả lời này đang nhận được một số lưu lượng truy cập, vì vậy tôi nghĩ tôi sẽ đề cập đến câu trả lời Git khác chia sẻ một vài tài nguyên tuyệt vời: Trang này có một hình ảnh giúp làm sáng tỏ Git cho tôi. Các Sách "Pro Git" trực tuyến và giúp tôi rất nhiều.


547
2018-05-25 20:26



Sau đó bạn cần phải cam kết điều này với một cái gì đó như git commit -m "Just removing file1.txt" và sau đó, nếu bạn có một kho lưu trữ từ xa, hãy đẩy cam kết với một cái gì đó như git push origin master. - ban-geoengineering


Nếu tệp của bạn đã có trên GitHub, bạn bây giờ (tháng 7 năm 2013) có thể trực tiếp xóa nó từ giao diện web!

Chỉ cần xem bất kỳ tệp nào trong kho lưu trữ của bạn, nhấp vào biểu tượng thùng rác ở trên cùng và cam kết xóa giống như bất kỳ chỉnh sửa dựa trên web nào khác.

delete button

(cam kết sẽ phản ánh việc xóa tệp đó):

commit a deletion

Và cứ như thế, nó biến mất.

Để được trợ giúp về các tính năng này, hãy nhớ đọc các bài viết trợ giúp của chúng tôi về đang tạo, di chuyển, đổi tênxóa các tập tin.

Lưu ý: Vì đây là hệ thống kiểm soát phiên bản, Git luôn có lưng của bạn nếu bạn cần khôi phục tệp sau này.

Câu cuối cùng có nghĩa là tập tin đã xóa vẫn là một phần của lịch sử, và bạn có thể khôi phục nó một cách dễ dàng (nhưng chưa thông qua giao diện web GitHub):

Xem "Khôi phục tệp đã xóa trong repo Git".


57
2017-07-04 20:53



Bạn phải cuộn xuống dưới cùng và nhấn "Cam kết thay đổi" để thực hiện việc xóa! - LevinsonTechnologies
Điều này không hoạt động đối với các tệp văn bản lớn. Máy chủ cố gắng hiển thị tệp như trong ảnh chụp màn hình và sau đó không thành công với lỗi 500. - CapeCoder
Câu trả lời này đề cập đến github, câu hỏi là về một repo git. Không phải cách sử dụng giao diện github. - Peter Marshall


Đây là lựa chọn duy nhất làm việc cho tôi.

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'

Lưu ý: Thay thế * .sql bằng tên tệp hoặc loại tệp của bạn. Hãy rất cẩn thận vì điều này sẽ đi qua mọi cam kết và trích xuất loại tệp này.


39
2018-02-27 19:29



Đây là một câu trả lời tuyệt vời, nhưng lưu ý rằng trái ngược với các câu trả lời khác, lệnh này viết lại lịch sử cam kết và loại bỏ tất cả dấu vết của các tệp phù hợp với mẫu. Điều này đặc biệt hữu ích nếu bạn thấy bạn vô tình cam kết một số thông tin nhạy cảm (và, nếu cần thiết có thể sử dụng thành công - buộc phải viết lại lịch sử của bất kỳ repos từ xa nào đã được đẩy tới). - yoniLavi
Đó chính xác là vấn đề mà tôi đã có và phải mất một số thử nghiệm và sai sót để có được nó đúng. Một người mà tôi đang làm việc đã cam kết một số cơ sở dữ liệu lớn đổ vào một repo đi qua nhiều cam kết nhiều. Đó là lý do tại sao tôi sử dụng .sql trong ví dụ của tôi. Repo của tôi trở nên cồng kềnh và to đến nỗi github sẽ không chấp nhận push nữa. - Jason Glisson
Nếu bạn đang sử dụng một tổng thể từ xa, bạn cần phải buộc một cam kết và đẩy nó lên với git push --force -u origin master - AlbertMarkovski
@AlbertMarkovski Xin lỗi tôi không cụ thể. Github thực sự sẽ không chấp nhận sự thúc đẩy bởi vì repo vượt quá giới hạn kích thước của chúng. Ít nhất một vài GB. Họ cắt lời tôi và gửi email cho tôi về nó. Vì vậy, thật không may, không có số tiền buộc phải đẩy sẽ giúp vào thời điểm đó. - Jason Glisson
@JasonGlisson Tôi cũng phải đối mặt với vấn đề đó, nơi một video đã được thêm vào một kho lưu trữ do tai nạn. - AlbertMarkovski


Nói chung, git help sẽ giúp với ít nhất câu hỏi đơn giản như thế này:

zhasper@berens:/media/Kindle/documents$ git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]

The most commonly used git commands are:
   add        Add file contents to the index
   :
   rm         Remove files from the working tree and from the index

23
2018-01-12 08:21



Đối với những thứ phức tạp hơn, tôi tìm thấy git help gây nhầm lẫn, nhưng nó tốt cho những điều đơn giản :) - James Polley
Nó không thực sự tuyệt vời cho git noobs bởi vì "index" không phải là một khái niệm git noobs quen thuộc. Tôi nói từ kinh nghiệm cá nhân của một git noob :) Ngoài ra, tôi cảm thấy nó ít khó hiểu hơn khi nói rằng rm  giai đoạn một tập tin để xóa thay vì xóa khỏi chỉ mục (mặc dù nó vẫn vô nghĩa đối với noobs). - Roman Starkov
Đồng ý với romkyns: Mô tả "Xóa tệp khỏi cây đang hoạt động và khỏi chỉ mục" không có âm thanh với tôi giống như cách xóa tệp khỏi repo. Có lẽ nếu tôi hiểu git tốt hơn nó sẽ. Thay vào đó nó có vẻ như bạn chỉ là unstaging tập tin (và tùy chọn loại bỏ chúng khỏi cây làm việc - đó sẽ nhất thiết ảnh hưởng đến repo?) - LarsH


Ngoài ra, nếu đó là thư mục cần xóa và các thư mục hoặc tệp con tiếp theo, hãy sử dụng:

git rm -r foldername

23
2018-04-17 15:41





Nếu bạn muốn xóa các tập tin từ repo, nhưng để nó trong hệ thống tập tin (sẽ được untracked):

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"

Nếu bạn muốn xóa tệp khỏi repo và từ hệ thống tệp thì có hai tùy chọn:

  1. Nếu tệp không có thay đổi được dàn dựng trong chỉ mục:

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. Nếu tệp có các thay đổi được dàn dựng trong chỉ mục:

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    

10
2018-03-20 12:13





git rm sẽ chỉ xóa tệp trên nhánh này kể từ bây giờ, nhưng nó vẫn còn trong lịch sử và git sẽ nhớ nó.

Cách đúng để làm điều đó là git filter-branch, như những người khác đã đề cập ở đây. Nó sẽ viết lại mọi cam kết trong lịch sử của chi nhánh để xóa tập tin đó.

Nhưng, ngay cả sau khi làm điều đó, git có thể nhớ nó bởi vì có thể được tham chiếu đến nó trong reflog, điều khiển từ xa, thẻ và như vậy.

Nếu bạn muốn xóa hoàn toàn nó trong một bước, tôi khuyên bạn nên sử dụng git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

Thật dễ dàng, chỉ cần làm git forget-blob file1.txt.

Điều này sẽ xóa mọi tham chiếu, thực hiện git filter-branchvà cuối cùng chạy bộ thu gom rác git git gc để loại bỏ hoàn toàn tệp này trong repo của bạn.


10
2018-01-23 12:56





Một cách khác nếu bạn muốn xóa tệp khỏi thư mục cục bộ của mình bằng lệnh rm và sau đó đẩy các thay đổi đến máy chủ từ xa.

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

7
2017-10-06 03:07