Làm cách nào để xóa thư mục .git của tôi? Đã xóa thư mục dự án của tôi, nhưng .git vẫn còn rất lớn


85

Các đối tượng .git / trong thư mục dự án rails của tôi vẫn còn rất lớn, sau khi xóa hàng trăm Megabyte rác vô tình tạo ra.

Tôi đã thử git add -A, cũng như các lệnh khác để cập nhật chỉ mục và xóa các tệp không tồn tại. Tôi thu thập, có lẽ không chính xác, rằng các tệp có hai tên ký tự trong thư mục là các đốm màu. Tôi đã cố gắng quay trở lại các cam kết trước đó, nhưng không may mắn.

Tôi có thể làm gì để xóa thư mục này?

Câu trả lời:


137
  • Nếu bạn đã thêm các tệp và sau đó xóa chúng, các đốm màu vẫn tồn tại nhưng bị treo lơ lửng. git fscksẽ liệt kê các đốm màu không thể truy cập và git prunesẽ xóa chúng.

  • Nếu bạn đã thêm tệp, cam kết và sau đó quay lại với git reset --hard HEAD^, chúng sẽ bị kẹt sâu hơn một chút. git fscksẽ không liệt kê bất kỳ cam treo lủng lẳng hoặc đốm màu, vì chi nhánh của bạn reflog đang nắm giữ lên chúng. Dưới đây là một cách để đảm bảo rằng chỉ những đối tượng có trong lịch sử của bạn sẽ còn lại:

    git reflog expire --expire=now --all
    git repack -ad  # Remove dangling objects from packfiles
    git prune       # Remove dangling loose objects
    
  • Một cách khác cũng là sao chép kho lưu trữ, vì điều đó sẽ chỉ mang các đối tượng có thể truy cập được. Tuy nhiên, nếu các đối tượng treo lơ lửng đã được đóng gói (và nếu bạn thực hiện nhiều thao tác, git có thể đã được đóng gói tự động), thì một bản sao cục bộ sẽ mang theo toàn bộ packfile:

    git clone foo bar                 # bad
    git clone --no-hardlinks foo bar  # also bad
    

    Bạn phải chỉ định một giao thức để buộc git tính một gói mới:

    git clone file://foo bar  # good
    

Đúng, tôi đã cam kết trước khi nhận thấy vấn đề. Tôi đã thử mọi thứ trừ lệnh cuối cùng. Khi tôi chạy điều này từ trong thư mục dự án của mình "cảnh báo: Có vẻ như bạn đã nhân bản một kho lưu trữ trống." Tôi đã đọc tài liệu, nhưng nó rất nặng. Làm cách nào tôi có thể trỏ bản sao đến đúng nguồn?
light24bulbs

1
@user file://fooURL có liên quan đến thư mục hiện tại và dấu file:///home/me/foo(ba dấu gạch chéo) là tuyệt đối.
Josh Lee

cảm ơn! đó là kích thước giảm đi một nửa, nhưng gói của tôi vẫn gấp mười lần kích thước của phần còn lại của kho lưu trữ. Tôi đã cố gắng tỉa ..
light24bulbs

1
@user Nếu nhiều cam kết có các tệp lớn bị nhầm lẫn, thì bạn có thể muốn sử dụng git-filter-branch để chọn chúng.
Josh Lee

2
Xin lỗi, không có hiệu lực. Trưởng nhóm phát triển của tôi nói rằng kích thước bây giờ nằm ​​trong phạm vi chấp nhận được nhưng không thuận lợi. Nếu bạn có thời gian để tiếp tục đút thìa cho tôi thì điều đó thật tuyệt vời, nhưng bạn đã khiến tôi phải đứng vững. Cảm ơn jleedev.
light24bulbs


13

Sparkleshare đã tạo 13GB tệp tmp_pack_ trong git của tôi sau khi không thể kéo nhiều lần đăng ký hình ảnh lớn. Điều duy nhất có ích là ...

rm -f .git/objects/*/tmp_*

'git gc' đã không xóa các tệp đó.


Đó là một giải pháp khá thô bạo nhưng tôi thấy không có lý do gì nó không hoạt động. Đẹp!
light24bulbs

1
Tình huống tuyệt vọng đòi hỏi các biện pháp tuyệt vọng, Nó hoạt động như một sự quyến rũ! Tks.
medina

rm là cho lệnh linux? còn người dùng windows thì sao @cat?
gumuruh

7

Nếu bạn vẫn còn một repo lớn sau khi cắt tỉa và đóng gói lại ( gc --aggressive --prune=tomorrow...) thì bạn có thể chỉ cần tìm kiếm một repo kỳ lạ:

git rev-list --objects --all |
    while read sha1 fname
    do 
        echo -e "$(git cat-file -s $sha1)\t$\t$fname"
    done | sort -n

Điều này sẽ cung cấp cho bạn danh sách các đối tượng được sắp xếp theo kích thước tăng dần. Bạn có thể sử dụng git-filter-branch để xóa thủ phạm khỏi repo của mình.

Xem "Xóa đối tượng" trong http://progit.org/book/ch9-7.html để được hướng dẫn


@DavidJames cảm ơn vì gợi ý. Tôi đã làm cho nó thậm chí còn dễ đọc hơn, IMO
sehe

Đề phòng trường hợp bất kỳ ai khác đi qua điều này: có một lỗi đánh máy trong args trong ngoặc đơn: nên được --aggressive. Đã cố gắng chỉnh sửa, nhưng hóa ra bạn không thể chỉnh sửa một lỗi đánh máy nhỏ như vậy.
hellobenallan

@hellobenallan cảm ơn vì ghi chú, đã sửa
hẹn

1

Đệ quy:

find ./ -iname '*.!*' -size 0 -delete
for i in */.git; do ( echo $i; cd $i/..; git gc --aggressive --prune=now --force; ); done
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.