2012-06-15 27 views
43

Tôi đã kiểm tra một tải tệp trong một chi nhánh và đã hợp nhất và sau đó phải xóa chúng và bây giờ tôi còn lại với tệp .pack lớn mà tôi không biết cách tải loại bỏ.Xóa tệp .pack lớn được tạo bởi git

Tôi đã xóa tất cả các tệp bằng cách sử dụng git rm -rf xxxxxx và tôi cũng chạy tùy chọn --cached.

Ai đó có thể cho tôi biết làm thế nào tôi có thể loại bỏ một tập tin .pack lớn hiện đang có trong thư mục sau:

.git/objects/pack/pack-xxxxxxxxxxxxxxxxx.pack

Tôi chỉ cần loại bỏ các chi nhánh mà tôi vẫn có nhưng tôi không còn sử dụng? Hoặc có cái gì khác tôi cần phải chạy?

Tôi không chắc chắn có bao nhiêu khác biệt nhưng nó cho thấy ổ khóa chống lại tệp.

Cảm ơn


EDIT

Dưới đây là một số trích đoạn từ bash_history tôi rằng nên đưa ra một ý tưởng làm thế nào tôi quản lý để có được vào trạng thái này (giả định tại thời điểm này tôi đang làm việc trên một git branch được gọi là 'nhánh của tôi' và tôi có một thư mục chứa nhiều thư mục/tệp hơn):

git add . 
git commit -m "Adding my branch changes to master" 
git checkout master 
git merge my-branch 
git rm -rf unwanted_folder/ 
rm -rf unwanted_folder/  (not sure why I ran this as well but I did) 

Tôi nghĩ rằng tôi cũng chạy như sau nhưng nó không xuất hiện trong bash_history với t ông khác:

git rm -rf --cached unwanted_folder/ 

Tôi cũng nghĩ tôi chạy một số lệnh git (như git gc) để cố gắng dọn dẹp các tập tin gói nhưng họ không xuất hiện trong các tập tin .bash_history một trong hai.

+0

Bạn có thể làm rõ cách bạn xóa chúng không? Nếu họ vẫn còn trong lịch sử cam kết, sau đó họ vẫn còn trong các tập tin gói của bạn. – loganfsmyth

+0

Xin chào @loganfsmyth, tôi đã thêm các tập lệnh lịch sử bash mà hy vọng sẽ giúp ích. – user1116573

Trả lời

114

Vấn đề là, mặc dù bạn đã xóa các tệp, chúng vẫn xuất hiện trong các bản sửa đổi trước đó. Đó là toàn bộ vấn đề của git, là ngay cả khi bạn xóa một cái gì đó, bạn vẫn có thể lấy lại nó bằng cách truy cập lịch sử.

Những gì bạn đang tìm kiếm để làm được gọi là lịch sử viết lại và liên quan đến lệnh git filter-branch.

GitHub có giải thích tốt về vấn đề trên trang web của họ. https://help.github.com/articles/remove-sensitive-data

Để trả lời câu hỏi của bạn trực tiếp hơn, những gì về cơ bản bạn cần phải chạy là thế này:

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch unwanted_folder' --prune-empty 

này sẽ loại bỏ tất cả các tham chiếu đến các tập tin từ lịch sử của repo.

Tiếp theo, bạn sẽ muốn chạy điều này, để thực sự xóa các tệp khỏi tệp gói.

git gc --aggressive --prune 
+3

Đây không phải là câu trả lời đúng? – Dvir669

+1

Vâng điều này chắc chắn phải là câu trả lời được chấp nhận. – JaKXz

+0

Tôi đã đánh dấu nó là được chấp nhận nếu điều đó khiến mọi người đến với câu hỏi này dễ dàng hơn trong tương lai, mặc dù tôi thực sự đã giải quyết được vấn đề của mình vào lúc đó bằng cách tạo một git repo mới – user1116573

3

Một lựa chọn:

chạy git gc bằng tay để ngưng tụ một số tập tin gói vào một hoặc một vài tập tin gói. Thao tác này liên tục (tức là tệp gói lớn sẽ giữ lại hành vi nén của nó) vì vậy có thể hữu ích khi nén một kho lưu trữ định kỳ với git gc --aggressive

Một tùy chọn khác là lưu mã và .git ở đâu đó rồi xóa .git và bắt đầu lại bằng cách sử dụng mã hiện có này, tạo một kho lưu trữ git mới (git init).

+0

Xin chào Michael, tôi đã thử chạy 'git gc' và nhận được chỉ một vài tệp gói nhưng tệp lớn vẫn là một trong số chúng và tôi chỉ muốn loại bỏ nó để tôi có thể sao lưu thư mục bên ngoài dễ dàng hơn (zip trước đây là 1-2Mb, bây giờ là 55Mb). Trừ khi ai đó có thể đề nghị bất cứ điều gì khác tôi nghĩ rằng tôi có thể phải tạo ra một git tươi. Tôi cho rằng điều này có nghĩa là tôi sẽ mất quyền truy cập vào các chi nhánh mà tôi hiện có vv ...? – user1116573

+1

Tôi đã từ bỏ việc thử và chỉ xóa thư mục .git và tạo một kho lưu trữ git mới như bạn đã nói. Tôi sẽ xem nó là một bài học kinh nghiệm. Cảm ơn Michael. – user1116573

+2

Điều này không có ý nghĩa nhiều. Tại sao bạn không thể nói git để củng cố kho lưu trữ hiện tại và loại bỏ các tập tin gói trong quá trình này? – jml

4

Kịch bản A: Nếu file lớn của bạn chỉ được thêm vào một chi nhánh, bạn không cần phải chạy git filter-branch. Bạn chỉ cần xóa các chi nhánh và chạy thu gom rác thải:

git branch -D mybranch 
git reflog expire --expire-unreachable=all --all 
git gc --prune=all 

Kịch bản B: Tuy nhiên, có vẻ như dựa trên lịch sử bash của bạn, rằng bạn đã hợp nhất các thay đổi vào bậc thầy. Nếu bạn chưa chia sẻ thay đổi với bất kỳ ai (chưa có git push). Điều đơn giản nhất là đặt lại master về trước khi hợp nhất với nhánh có các tệp lớn. Điều này sẽ loại bỏ tất cả các cam kết từ chi nhánh của bạn và tất cả các cam kết thực hiện để làm chủ sau khi hợp nhất. Vì vậy, bạn có thể bị mất những thay đổi - ngoài các tập tin lớn - mà bạn có thể đã thực sự muốn:

git checkout master 
git log # Find the commit hash just before the merge 
git reset --hard <commit hash> 

Sau đó chạy các bước từ kịch bản A.

Kịch bản C: Nếu có thay đổi khác từ chi nhánh hay thay đổi nào trên tổng thể sau khi hợp nhất mà bạn muốn giữ lại, nó sẽ là tốt nhất để rebase tổng thể và chọn lọc bao gồm cam kết mà bạn muốn:

git checkout master 
git log # Find the commit hash just before the merge 
git rebase -i <commit hash> 

Trong trình soạn thảo của bạn, xóa các dòng tương ứng với các cam kết đã thêm các tệp lớn, nhưng để mọi thứ khác như cũ. Lưu và thoát. Chi nhánh chính của bạn chỉ nên chứa những gì bạn muốn và không có tệp lớn nào. Lưu ý rằng git rebase không có -p sẽ loại bỏ các cam kết hợp nhất, vì vậy, bạn sẽ được trái với lịch sử tuyến tính cho chính sau <commit hash>. Điều này có thể phù hợp với bạn, nhưng nếu không, bạn có thể thử với -p, nhưng git help rebase nói combining -p with the -i option explicitly is generally not a good idea unless you know what you are doing.

Sau đó chạy các lệnh từ kịch bản A.

+0

Có một biến thể của kịch bản A [ở đây] (http: // stackoverflow .com/q/33191910/4400585) với, tuy nhiên, một vấn đề ngoài mong đợi. –

0

Tôi trễ một chút để hiển thị nhưng trong trường hợp câu trả lời ở trên không giải quyết được truy vấn thì tôi tìm thấy một cách khác. Chỉ cần xóa tệp lớn cụ thể khỏi tệp .pack. Tôi đã gặp vấn đề này, nơi tôi đã vô tình kiểm tra trong một tệp 2GB lớn. Tôi đã làm theo các bước được giải thích trong liên kết này: http://www.ducea.com/2012/02/07/howto-completely-remove-a-file-from-git-history/

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