2011-11-10 29 views
55

Possible Duplicate:
How to purge a huge file from commits history in Git?Làm thế nào để xóa một tập tin lớn sai phạm trong git

tôi đã làm một điều ngu ngốc. Hãy tưởng tượng rằng tôi đã cam kết một tập tin 100MB. Hơn tôi thấy điều này và xóa tập tin này và cam kết một lần nữa. Đây là thủ tục bình thường để xóa một tập tin.

Nhưng bây giờ tác dụng phụ là lịch sử của tôi nặng vì nó đã lưu tệp lớn này (tôi tin rằng đây là lý do tại sao nó nặng). Tôi chỉ sử dụng git cục bộ, vì vậy tôi không đồng bộ hóa trong bất kỳ máy chủ nào.

Làm cách nào để xóa tệp này một cách dứt khoát và tiết kiệm dung lượng đĩa?

+1

Xem câu trả lời được chấp nhận cho câu hỏi của tôi http://stackoverflow.com/questions/796983 1/drop-old-cam-git-rebase-nguyên-hợp nhất-xung đột –

+0

Sử dụng trình dọn dẹp repo BFG, một cách đơn giản, nhanh hơn thay thế cho 'git-filter-branch' được tạo ra bởi tôi để xóa các tệp không mong muốn khỏi lịch sử Git. Xem http://stackoverflow.com/a/17890278/438886 –

Trả lời

100

Bạn có thể làm điều đó bằng cách sử dụng lệnh git filter-branch, như thế này:

git filter-branch --tree-filter 'rm -rf path/to/your/file' HEAD 

Bạn có thể tìm thêm tài liệu tại đây http://dalibornasevic.com/posts/2-permanently-remove-files-and-folders-from-a-git-repository

+1

Lưu ý rằng nó cũng sẽ xóa phiên bản hiện đã được kiểm tra, vì vậy hãy đảm bảo bạn có bản sao lưu nếu cần giữ lại. – rleelr

+5

Tôi đang sử dụng Windows. Tôi đã phải trao đổi các dấu nháy đơn cho dấu nháy kép. –

+1

@rleelr Tôi nghĩ trang github đưa ra giải pháp rõ ràng mà không ảnh hưởng đến các tệp khác: https://help.github.com/articles/removing-sensitive-data-from-a-repository/ – MeadowMuffins

13

Bạn có thể mất kịch bản tuyệt vời này từ David Underhill để loại bỏ các tập tin từ kho git:

#!/bin/bash 
set -o errexit 

# Author: David Underhill 
# Script to permanently delete files/folders from your git repository. To use 
# it, cd to your repository's root and then run the script with a list of paths 
# you want to delete, e.g., git-delete-history path1 path2 

if [ $# -eq 0 ]; then 
    exit 0 
fi 

# make sure we're at the root of git repo 
if [ ! -d .git ]; then 
    echo "Error: must run this script from the root of a git repository" 
    exit 1 
fi 

# remove all paths passed as arguments from the history of the repo 
[email protected] 
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD 

# remove the temporary history git-filter-branch otherwise leaves behind for a long time 
rm -rf .git/refs/original/ && git reflog expire --all && git gc --aggressive --prune 
+0

Hãy cẩn thận vì tập lệnh này có thể chạy trong một thời gian dài nếu bạn có nhiều cam kết như tôi (~ 30k và nó sẽ hoạt động cả ngày). –

Các vấn đề liên quan