วิธีลบไฟล์ที่ไม่ได้ติดตามใน Git


111

ฉันกำลังทำงานในสาขาหนึ่งพูดว่าสาขา "ทดลอง" ซึ่งฉันแตกแขนงออกจากสาขาหลักของฉันจากนั้นฉันสร้างรูปแบบผู้ใช้ในสาขาทดลอง แต่ยังไม่ได้เพิ่มลงในดัชนี

ฉันต้องทำอย่างไรหากต้องการยกเลิกการเปลี่ยนแปลงทั้งหมดของไฟล์ที่เพิ่งเพิ่มในสาขาทดลองของฉัน ไฟล์ที่ไม่ได้ติดตามมีการระบุไว้ด้านล่าง:

$ 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

ฉันพยายามเรียกใช้ "git reset --hard" โดยหวังว่าจะเลิกทำการเปลี่ยนแปลงทั้งหมด แต่ไฟล์ทั้งหมดด้านบนยังคงแสดงอยู่

ใครก็ได้โปรดให้ความกระจ่างแก่ฉันบ้าง?


คำตอบ:


221

ในการลบไฟล์ / ไดเรกทอรีที่ไม่ได้ติดตามให้ทำ:

git clean -fdx

-f - กำลัง

-d - ไดเรกทอรีด้วย

-x - ลบไฟล์ที่ละเว้นด้วย (อย่าใช้สิ่งนี้หากคุณไม่ต้องการลบไฟล์ที่ถูกละเว้น)


ใช้ด้วยความระมัดระวัง!
คำสั่งเหล่านี้สามารถลบไฟล์โดยพลการอย่างถาวรซึ่งคุณไม่เคยคิดมาก่อนในตอนแรก โปรดตรวจสอบอีกครั้งและอ่านความคิดเห็นทั้งหมดด้านล่างคำตอบนี้และส่วน - ความช่วยเหลือ ฯลฯ เพื่อทราบรายละเอียดทั้งหมดเพื่อปรับแต่งคำสั่งของคุณอย่างละเอียดและได้รับผลลัพธ์ที่คาดหวังอย่างแน่นอน


54
เพิ่ม -n เพื่อดูตัวอย่างก่อนเพื่อไม่ให้คุณนำสิ่งของออกโดยไม่ได้ตั้งใจ
Druska

8
นี่มันเยี่ยมมาก! ยกเว้นว่ามันจะลบไฟล์คอนฟิกูเรชันที่คุณอาจละเลยโดยเจตนาใน. gitignore แต่ยังคงต้องการสภาพแวดล้อมการพัฒนาภายในของคุณ คุณสามารถใช้คำสั่งเดียวกันกับ -i พิเศษสำหรับโหมดโต้ตอบได้เช่น git clean -fdxi และจะแจ้งให้คุณทราบว่าคุณต้องการลบไฟล์ใด
moeabdol

5
นี่เป็นสิ่งที่ดี แต่คุณอาจต้องการเพิ่มประกาศให้ผู้ใช้ใช้โดย-xมีข้อควรระวังเนื่องจากจะเป็นการลบไฟล์อย่างถาวร หรือใช้-nตามที่กล่าวไว้โดย @Druska
lacostenycoder

3
ยังไม่ได้ใช้-xไฟล์. project และไฟล์กำหนดค่าอื่น ๆ ที่ถูกลบ ต้องดึง repo อีกครั้งจากการกระทำล่าสุดไปยังไดเร็กทอรีใหม่
ผู้รักษาเวลา

2
ฉันคิดว่าคุณต้องแจ้งว่าคำสั่งนี้อาจเป็นอันตรายเพราะสามารถลบไฟล์ที่ต้องการได้ !!!
Davide

20

วิธีการโต้ตอบกับผู้ใช้:

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 สำหรับโต้ตอบ
-f สำหรับบังคับ
-d สำหรับไดเร็กทอรี
-x สำหรับไฟล์ที่ถูกละเว้น (เพิ่มหากจำเป็น)

หมายเหตุ: เพิ่ม-nหรือ- ดรายรันเพื่อตรวจสอบว่าจะทำอะไร


17

ไฟล์เหล่านี้เป็นไฟล์ที่ไม่มีการติดตาม ซึ่งหมายความว่า git ไม่ได้ติดตามพวกเขา เป็นเพียงการแสดงรายการเนื่องจากไม่ได้อยู่ในไฟล์ git ละเว้น เนื่องจาก git ไม่ได้ติดตามgit resetพวกเขาจึงไม่แตะต้องพวกเขา

หากคุณต้องการกำจัดไฟล์ที่ไม่ถูกติดตามทั้งหมดวิธีที่ง่ายที่สุดคือgit clean -f(ใช้git clean -nแทนหากคุณต้องการดูว่ามันจะทำลายอะไรโดยไม่ต้องลบอะไรเลย) มิฉะนั้นคุณสามารถลบไฟล์ที่คุณไม่ต้องการด้วยมือได้


5

สำหรับการลบไฟล์ที่ไม่ถูกติดตาม:

git clean -f

สำหรับการลบไดเรกทอรีที่ไม่ถูกติดตามให้ใช้:

git clean -f -d

เพื่อป้องกันภาวะหัวใจหยุดเต้นให้ใช้

git clean -n -f -d


"หัวใจหยุดเต้น" ใด ๆ 😂😂😂
Rishi Kulshreshtha

2

คุณสามารถย้อนกลับไปยังสถานะก่อนหน้าของ repo ในพื้นที่ได้ด้วยวิธีอื่น:

  1. เพิ่มไฟล์ที่ไม่ได้ติดตามไปยังพื้นที่การจัดเตรียมด้วยgit add.
  2. กลับไปที่สถานะก่อนหน้าของ repo git reset --hardท้องถิ่นที่มี


0

ฉันมีปัญหาที่คล้ายกัน ฉันได้ดำเนินการล่าสุด แต่มีการเปลี่ยนแปลงบางอย่างในท้องถิ่นเนื่องจากการผสานไม่ได้เกิดขึ้นกับไฟล์ใดไฟล์หนึ่ง ไฟล์ไม่ถูกติดตามและฉันไม่ต้องการให้สิ่งที่ฉันทำคือ -

$ git checkout filepath / filename

filepath - ตำแหน่งที่ฉันทำ git bash จากนั้นเมื่อฉันทำการเปลี่ยนแปลงล่าสุดมีการเปลี่ยนแปลง


0

แม้ว่าจะใช้git cleanงานได้ดี แต่ฉันก็ยังพบว่ามีประโยชน์ในการใช้สคริปต์ของตัวเองเพื่อล้าง git repo แต่ก็มีข้อดีอยู่บ้าง

นี่แสดงรายการไฟล์ที่จะล้างจากนั้นโต้ตอบพร้อมท์ให้ล้างหรือไม่ นี่เป็นสิ่งที่ฉันต้องการเกือบตลอดเวลาเนื่องจากการแจ้งเตือนแบบโต้ตอบต่อไฟล์นั้นน่าเบื่อ

นอกจากนี้ยังอนุญาตให้กรองรายการด้วยตนเองซึ่งมีประโยชน์เมื่อมีประเภทไฟล์ที่คุณไม่ต้องการล้าง (และมีเหตุผลที่จะไม่กระทำ)


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.