làm thế nào để xóa các tệp không được theo dõi trong Git?


110

Tôi đang làm việc trên một nhánh, chẳng hạn như nhánh "thử nghiệm" mà tôi tách ra từ nhánh chính của mình. Sau đó, tôi tạo một mô hình người dùng trong nhánh thử nghiệm, nhưng chưa thêm chúng vào chỉ mục.

Tôi phải làm gì nếu muốn loại bỏ tất cả các thay đổi của các tệp được thêm gần đây trong nhánh thử nghiệm của mình? Các tệp không được theo dõi được liệt kê như sau:

$ git status
 On branch new_chick
 Untracked files:
   (use "git add <file>..." to include in what will be committed)

       .project
       app/models/user.rb
       db/migrate/
       test/fixtures/users.yml
       test/unit/user_test.rb

Tôi đã cố gắng chạy "git reset --hard" với hy vọng hoàn tác tất cả những thay đổi đó, nhưng tất cả các tệp ở trên vẫn hiển thị.

Có ai hãy làm sáng tỏ cho tôi được không?


Câu trả lời:


220

Để xóa các tệp / thư mục không được theo dõi, hãy làm:

git clean -fdx

-f - lực lượng

-d - thư mục quá

-x - cũng xóa các tệp bị bỏ qua (không sử dụng tính năng này nếu bạn không muốn xóa các tệp bị bỏ qua)


54
Thêm -n vào bản xem trước trước để bạn không vô tình xóa nội dung
Druska

8
Điều đó thật tuyệt! Ngoại trừ việc nó cũng sẽ xóa các tệp cấu hình mà bạn có thể đã cố tình bỏ qua trong .gitignore nhưng vẫn cần cho môi trường phát triển cục bộ của bạn. Bạn có thể sử dụng lệnh tương tự với -i bổ sung cho chế độ tương tác, chẳng hạn như: git clean -fdxi và nó sẽ nhắc bạn về những tệp bạn muốn xóa.
moeabdol

5
Điều này thật tuyệt, nhưng bạn có thể muốn thêm thông báo cho người dùng SỬ DỤNG -xCÙNG THẬN TRỌNG vì nó sẽ xóa tệp vĩnh viễn. Hoặc sử dụng với -nnhư được đề cập bởi @Druska
lacostenycoder

3
-xVẫn chưa sử dụng , .project và các tệp cấu hình khác đã bị xóa. Phải kéo repo từ lần cam kết cuối cùng vào một thư mục mới.
máy chấm công

2
Tôi nghĩ rằng bạn phải thông báo rằng lệnh này có khả năng nguy hiểm vì nó có thể xóa các tệp bị truy nã !!!
Davide

20

Cách tiếp cận tương tác của người dùng:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i cho tương tác
-f cho lực lượng
-d cho thư mục
-x cho các tệp bị bỏ qua (thêm nếu cần)

Lưu ý: Thêm -n hoặc --dry-run để chỉ kiểm tra xem nó sẽ làm gì.


17

Đó là những tệp chưa được kiểm tra. Điều này có nghĩa là git không theo dõi chúng. Nó chỉ liệt kê chúng vì chúng không có trong tệp git ignore. Vì chúng không bị git theo dõi nên git resetsẽ không chạm vào chúng.

Nếu bạn muốn xóa tất cả các tệp chưa được theo dõi, cách đơn giản nhất là git clean -f(sử dụng git clean -nthay thế nếu bạn muốn xem nó sẽ phá hủy những gì mà không thực sự xóa bất kỳ thứ gì). Nếu không, bạn chỉ có thể xóa các tệp bạn không muốn bằng tay.


5

Để xóa các tệp không được theo dõi:

git clean -f

Để xóa các thư mục không được theo dõi, hãy sử dụng:

git clean -f -d

Để ngăn ngừa ngừng tim, hãy sử dụng

git clean -n -f -d


Bất kỳ "ngừng tim" 😂😂😂
Rishi

2

Bạn cũng có thể quay lại trạng thái trước đó của repo cục bộ theo cách khác:

  1. Thêm các tệp chưa được theo dõi vào khu vực dàn dựng với git add.
  2. trở lại trạng thái trước đó của repo cục bộ với git reset --hard.


0

Vâng, tôi đã gặp vấn đề tương tự. Tôi đã thực hiện mới nhất nhưng có một số thay đổi trong cục bộ do đó việc hợp nhất không xảy ra với một tệp cụ thể. Tệp không được kiểm soát và tôi không muốn chúng nên Những gì tôi đã làm là -

$ git checkout filepath / tên tệp

filepath - Vị trí từ nơi tôi thực hiện git bash. sau đó khi tôi lấy bản cập nhật mới nhất, những thay đổi đã có sẵn


0

Trong khi git clean hoạt động tốt, tôi vẫn thấy hữu ích khi sử dụng script của riêng mình để làm sạch git repo, nó có một số ưu điểm.

Thao tác này hiển thị danh sách các tệp cần được làm sạch, sau đó sẽ được nhắc nhở tương tác để làm sạch hoặc không. Đây gần như luôn là điều tôi muốn vì việc nhắc tương tác trên mỗi tệp trở nên tẻ nhạt.

Nó cũng cho phép lọc danh sách theo cách thủ công, hữu ích khi có các loại tệp bạn không muốn làm sạch (và có lý do để không cam kết).


git_clean.sh


#!/bin/bash
readarray -t -d '' FILES < <(
    git ls-files -z --other --directory |
        grep --null-data --null -v '.bin$\|Cargo.lock$'
)
if [ "$FILES" = "" ]; then
    echo  "Nothing to clean!"
    exit 0
fi

echo "Dirty files:"
printf '  %s\n' "${FILES[@]}"

DO_REMOVE=0
while true; do
    echo ""
    read -p "Remove ${#FILES[@]} files? [y/n]: " choice
    case "$choice" in
        y|Y )
            DO_REMOVE=1
            break ;;
        n|N )
            echo "Exiting!"
            break ;;
        * ) echo "Invalid input, expected [Y/y/N/n]"
            continue ;;
    esac
done

if [ "$DO_REMOVE" -eq 1 ];then
    echo "Removing!"
    for f in "${FILES[@]}"; do
       rm -rfv "$f"
    done
fi
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.