Làm cách nào để xóa tệp khỏi kho Git?


1924

Tôi đã thêm một tệp có tên "file1.txt"vào kho Git. Sau đó, tôi đã cam kết nó, thêm một vài thư mục được gọi dir1dir2và cam kết chúng vào kho Git.

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


85
git rmlà câu trả lời đúng, nhưng hãy nhớ rằng tập tin vẫn sẽ ở đó 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 một cái gì đó quyết liệt hơn. (Thay đổi lịch sử, đặc biệt là đối với nội dung bạn đã thúc đẩy, là một hành động quyết liệt và nên tránh nếu có thể.)
Keith Thompson

8
Lưu ý: trên GitHub, giờ đây bạn có thể xóa trực tiếp một tệp khỏi 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 dưới đây .
VonC

4
@KeithThndry những bước đó có thể là gì nếu tôi rất muốn làm điều đó?
lessthanl0l


Câu trả lời:


3224

Sử dụng git rm.

Nếu bạn muốn xóa tệp khỏi kho Git và hệ thống tệp , hãy sử dụng:

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 Git và không xóa tệp đó khỏi hệ thống tệp, hãy sử dụng:

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

Và để thay đổi để repo từ xa

git push origin branch_name  

93
Cũng tiện dụng: thư mục git rm -r // Để xóa thư mục và nội dung
Reg

10
Điều đó sẽ không thoát khỏi tập tin đó trong các cam kết khác.
VaTo

6
@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

15
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ó khỏi repo, hãy làm: git rm --cached file1.txt
Weston Ganger

5
Điều đáng chú ý là 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 các thông tin đó ngay lập tức . Để trích dẫn GitHub "Một khi bạn đã đẩy một cam kết với GitHub, bạn nên xem xét bất kỳ dữ liệu nào chứa dữ liệu bị xâm phạm. Nếu bạn đã cam kết mật khẩu, hãy thay đổi nó! Nếu bạn đã cam kết một khóa, hãy tạo một mật khẩu mới."
c1moore

608

git rm file.txtxó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 xóa tệp khỏi hệ thống tệp cục bộ, hãy sử dụng:
git rm --cached file.txt

Tình huống chính xác dưới đây là nơi tôi sử dụng git để duy trì kiểm soát phiên bản cho trang web của doanh nghiệp mình, 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 ấy cần các tập tin HUGE, tôi đã tạo một thư mục riêng tư, không liên kết và ftpd các tập tin ở đó để anh ấy tìm nạp 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 -Atừ thư mục cơ sở của trang web. Sau đó, git statuscho thấy các tập tin mới cần cam kết. Bây giờ tôi cần xóa chúng khỏi kiểm soát phiên bản và theo dõi của git ...

Kết quả 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 .003tệp. Rất may, tôi không quan tâm đến những gì đã xảy ra với bản sao cục bộ .003, nhưng một số tệp khác hiện đang thay đổi là các bản cập nhật tôi vừa thực hiện trên trang web và sẽ rất tuyệt vời khi bị 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 tiễn 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ĩ rằng tôi đã đề cập đến câu trả lời Git khác của tôi chia sẻ một số 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. Cuốn sách "Pro Git" đang trực tuyến và giúp tôi rất nhiều.


6
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-geengineering

77

Đầu tiên, nếu bạn đang sử dụng git rm, đặc biệt là cho nhiều tệp, hãy xem xét bất kỳ ký tự đại diện nào sẽ được giải quyết bằng shell chứ không phải bằng gitlệnh.

git rm -- *.anExtension
git commit -m "remove multiple files"

Nhưng, nếu tệp của bạn đã có trên GitHub, bạn có thể (kể từ tháng 7 năm 2013) trực tiếp xóa nó khỏi GUI 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ư mọi chỉnh sửa dựa trên web khác.

Sau đó " git pull" trên repo cục bộ của bạn và điều đó cũng sẽ xóa tệp cục bộ.
Điều này làm cho câu trả lời này là một cách (bùng binh) để xóa một tệp khỏi git repo?
(Không đề cập đến việc một tệp trên GitHub nằm trong "git repo")


nút xóa

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

xóa

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

Để được trợ giúp với 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ề việc tạo , di chuyển , đổi tênxóa các tệp.

Lưu ý: Vì 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 đã xóa vẫn là một phần của lịch sử và bạn có thể khôi phục nó đủ dễ dàng (nhưng chưa qua giao diện web GitHub):

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


4
Bạn phải cuộn xuống phía dưới và nhấn "Cam kết thay đổi" để cam kết xóa!
LevinsonTechnology

1
Điều này không làm việc cho các tập tin 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

9
Câu trả lời này được đề cập đến github, câu hỏi là về một repo git. Không phải làm thế nào để sử dụng giao diện github.
Peter Marshall

65

Đâ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 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.

EDIT: chú ý - sau lệnh này, bạn sẽ không thể đẩy hoặc kéo - bạn sẽ thấy từ chối 'lịch sử không liên quan', bạn có thể sử dụng 'git đẩy - Force -u master master' để đẩy hoặc kéo


9
Đâ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à xóa tất cả dấu vết của các tệp khớ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 phạm phải một số thông tin nhạy cảm (và, nếu cần có thể sử dụng thành công - Force để viết lại lịch sử của bất kỳ repos từ xa nào mà điều này đã được đẩy tới).
yoniLavi

3
Đó chính xác là vấn đề mà tôi gặp phải và phải mất một vài thử nghiệm và lỗi để làm cho đúng. Một anh chàng mà tôi đang làm việc đã cam kết nhiều cơ sở dữ liệu lớn vào một repo trở lại qua nhiều lần cam kết. Đó 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à lớn đến mức github sẽ không chấp nhận đẩy nữa.
Jason Glisson

3
Nếu bạn đang sử dụng một chủ từ xa, bạn cần phải thực hiện một cam kết và đẩy nó lên vớigit push --force -u origin master
AlbertMarkovski

2
@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 vì repo vượt quá giới hạn kích thước của chúng. Ít nhất vài GB. Họ cắt tôi và gửi email cho tôi về nó. Vì vậy, thật không may, tại thời điểm đó, không có sự thúc ép nào sẽ giúp ích.
Jason Glisson

2
@JasonGlisson Tôi cũng đã gặp phải vấn đề đó khi một video được thêm vào kho lưu trữ một cách tình cờ.
AlbertMarkovski

34

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

git rm -r foldername

2
Điều này loại bỏ các thư mục từ địa phương là tốt! Use git rm --cached -r <foldername>
Trục

24

Tổng quát hơn, git helpsẽ giúp với ít nhất những 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

6
Đối với những điều phức tạp hơn, tôi thấy git helpkhó hiểu, nhưng nó tốt cho những điều đơn giản :)
James Polley

9
Nó thực sự không tuyệt vời cho git noobs 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 là một git noob :) Ngoài ra, tôi cảm thấy ít khó hiểu hơn khi nói rằng rm giai đoạn một tệp để xóa chứ không phải xóa khỏi chỉ mục (mặc dù nó vẫn vô nghĩa đối với các noobs).
Roman Starkov

Đồng ý với romkyns: Mô tả "Xóa tệp khỏi cây làm việc và khỏi chỉ mục" không đúng với tôi như đó là 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 đó, có vẻ như bạn chỉ là các tập tin chưa được chỉnh sửa (và tùy ý xóa chúng khỏi cây làm việc - điều đó có nhất thiết ảnh hưởng đến repo không?)
LarsH

14

Nếu bạn muốn xóa tệp khỏi repo, nhưng hãy để nó trong hệ thống tệp (sẽ không bị khóa):

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à khỏi hệ thống tệp thì có hai tùy chọn:

  1. Nếu tệp không có thay đổi được phân loại 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ó thay đổi được phân loại trong chỉ mục:

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

12

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ẽ ghi nhớ nó.

Cách đúng đắn để làm là với 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 đó.

Nhưng, ngay cả sau khi làm điều đó, git có thể nhớ nó bởi vì có thể có cá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 sạch nó hoàn toà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-reposeective-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, làm git filter-branchvà cuối cùng chạy trình 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

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

10

Lưu ý: nếu bạn chỉ muốn xóa tệp khỏi git, hãy sử dụng bên dưới:

git rm --cached file1.txt

Nếu bạn muốn xóa cũng từ đĩa cứng:

git rm file1.txt

Nếu bạn muốn xóa một thư mục (thư mục có thể chứa một vài tệp), vì vậy, bạn nên xóa bằng lệnh đệ quy, như sau:

git rm -r foldername

Nếu bạn muốn xóa một thư mục trong một thư mục khác

git rm -r parentFolder/childFolder

Sau đó, bạn có thể commitpushnhư bình thường. Tuy nhiên, nếu bạn muốn khôi phục thư mục đã xóa, bạn có thể làm theo cách này: khôi phục các tệp đã xóa từ git là có thể.

Từ tài liệu:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​

LỰA CHỌN

<file>…​

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you

có thể cần phải thoát khỏi chúng. Một tên thư mục hàng đầu (ví dụ: dir để loại bỏ dir / file1 và dir / file2) có thể được cung cấp để xóa tất cả các tệp trong thư mục và đệ quy tất cả các thư mục con, nhưng điều này đòi hỏi tùy chọn -r phải được cung cấp rõ ràng. -f --force

Override the up-to-date check.

-n --dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.

-r

Allow recursive removal when a leading directory name is given.

--

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for

tùy chọn dòng lệnh). --cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.

--ignore-chưa từng có

Exit with a zero status even if no files matched.

-q --quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

Đọc thêm về tài liệu chính thức.


7

Để xóa một tập tin cụ thể

tên tập tin git rm

Để xóa tất cả các tệp không bị theo dõi khỏi thư mục theo cách đệ quy trong một lần chụp

git sạch -fdx


5

Nếu bạn có ứng dụng GitHub cho Windows, bạn có thể xóa một tệp trong 5 bước đơn giản:

  • Nhấp vào Đồng bộ hóa.
  • Nhấp vào thư mục chứa tệp và chọn phiên bản mới nhất của tệp.
  • Nhấp vào công cụ và chọn "Mở một vỏ ở đây."
  • Trong trình bao, gõ: "rm {filename}" và nhấn enter.
  • Cam kết thay đổi và đồng bộ lại.

5

Trong trường hợp của tôi, tôi đã cố xóa tệp trên github sau vài lần xác nhận nhưng lưu trên máy tính

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git push --force -u origin master

và sau đó tập tin này đã bị bỏ qua


3
  1. Đầu tiên, loại bỏ các tập tin từ kho lưu trữ cục bộ.

    git rm -r Tên tệp

    hoặc, chỉ xóa các tệp khỏi kho lưu trữ cục bộ nhưng khỏi hệ thống tệp

    git rm - Tên tệp

  2. Thứ hai, Cam kết thay đổi vào kho lưu trữ cục bộ.

    git commit -m "unwanted files or some inline comments"   
    
  3. Cuối cùng, cập nhật / đẩy các thay đổi cục bộ vào kho lưu trữ từ xa.

    git push 
    

điều này sẽ loại bỏ mọi thứ liên quan đến tập tin vô tình được thêm và đẩy?
bapors

1

Tôi đã thử rất nhiều tùy chọn được đề xuất và không có lựa chọn nào hoạt động (tôi sẽ không liệt kê các vấn đề khác nhau). Điều cuối cùng tôi làm, hoạt động, đơn giản và trực quan (với tôi) là:

  1. di chuyển toàn bộ repo địa phương ở nơi khác
  2. sao chép repo một lần nữa từ chủ vào ổ đĩa cục bộ của bạn
  3. sao chép lại các tập tin / thư mục từ bản sao gốc của bạn ở # 1 trở lại bản sao mới từ # 2
  4. đảm bảo rằng tệp vấn đề lớn không có ở đó hoặc bị loại trừ trong tệp .gitignore
  5. làm git add / git commit / git đẩy thông thường

1

Sau khi bạn đã xóa tệp khỏi repo, git rmbạn có thể sử dụng BFG Repo-Cleaner để xóa hoàn toàn và dễ dàng xóa tệp khỏi lịch sử repo.


0

Tôi có các tệp obj và bin vô tình biến nó thành repo mà tôi không muốn làm ô nhiễm danh sách 'các tệp đã thay đổi' của mình

Sau khi tôi nhận thấy họ đi đến điều khiển từ xa, tôi đã bỏ qua họ bằng cách thêm nó vào.gitignore

/*/obj
/*/bin

Vấn đề là chúng đã ở trong điều khiển từ xa và khi chúng được thay đổi, chúng bật lên khi thay đổi và làm ô nhiễm danh sách tệp đã thay đổi.

Để ngừng nhìn thấy chúng, bạn cần xóa toàn bộ thư mục khỏi kho lưu trữ từ xa.

Trong một dấu nhắc lệnh:

  1. CD vào thư mục repo (tức là C:\repos\MyRepo)
  2. Tôi muốn xóa SSIS \ obj. Có vẻ như bạn chỉ có thể xóa ở cấp cao nhất, vì vậy bây giờ bạn cần CD vào SSIS: (tức là C:\repos\MyRepo\SSIS)
  3. Bây giờ gõ câu thần chú git rm -r -f obj
    • rm = loại bỏ
    • -r = loại bỏ đệ quy
    • -f = có nghĩa là lực lượng, vì bạn thực sự có nghĩa là nó
    • obj là thư mục
  4. Bây giờ chạy git commit -m "remove obj folder"

Tôi nhận được một tin nhắn đáng báo động nói rằng 13 tập tin đã thay đổi việc xóa 315222

Sau đó vì tôi không muốn phải tìm kiếm dòng CMD, tôi đã vào Visual Sstudio và thực hiện Sync để áp dụng nó cho điều khiển từ xa


0

Nếu bạn cần xóa các tệp khỏi tiện ích mở rộng đã xác định (ví dụ: các tệp đã biên dịch), bạn có thể thực hiện các thao tác sau để xóa tất cả chúng cùng một lúc:

git remove -f *.pyc

0

Theo tài liệu .

git rm --cached giant_file

Khi nói đến dữ liệu nhạy cảm, tốt hơn hết là đừng nói rằng bạn đã xóa tệp mà chỉ đưa nó vào cam kết đã biết trước:

0. Sửa đổi cam kết cuối cùng

git commit --amend -CHEAD

Nếu bạn muốn xóa tệp khỏi tất cả lịch sử git, theo tài liệu bạn nên làm như sau:

1. Xóa nó khỏi lịch sử địa phương của bạn

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \  --prune-empty --tag-name-filter cat -- --all
# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename
  1. Đừng quên đưa tệp này vào .gitignore (Nếu đó là tệp bạn không bao giờ muốn chia sẻ (chẳng hạn như mật khẩu ...):
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3. Nếu bạn cần loại bỏ từ xa

git push origin --force --all

4. Nếu bạn cũng cần xóa nó khỏi các bản phát hành thẻ:

git push origin --force --tags

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.