як видалити непотрібні файли в Git?


110

Я працюю над гілкою, скажімо, "експериментальна" гілка, яку я відгалужую від своєї головної гілки. Тоді я генерую модель користувача в експериментальній гілці, але поки не додаю їх до індексу.

Що мені робити, якщо я хочу скасувати всі зміни файлів, нещодавно додані в моїй експериментальній гілці? Файли, що не відслідковуються, перелічені нижче:

$ 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", сподіваючись скасувати всі ці зміни, але всі файли вище все ще відображаються.

Хто-небудь, будь ласка, пролити на мене світло?


Відповіді:


220

Щоб видалити незатрековані файли / каталоги, виконайте такі дії:

git clean -fdx

-f - сила

-d - каталоги теж

-x - також видаляйте ігноровані файли (не використовуйте це, якщо ви не хочете видаляти ігноровані файли)


Використовуйте обережно!
Ці команди можуть назавжди видалити довільні файли, про які ви не думали спочатку. Перевірте і прочитайте всі коментарі нижче цієї відповіді та розділ - допомога тощо, щоб знати всі деталі, щоб точно налаштувати свої команди та обов'язково отримати очікуваний результат.


54
Додайте -n для попереднього попереднього перегляду, щоб ви випадково не видалили речі
Druska

8
Це чудово! За винятком того, що він також видалить конфігураційні файли, які ви могли навмисно ігнорувати в .gitignore, але все ще потрібні для вашого локального середовища розробки. Ви можете використовувати ту саму команду з додатковим -i для інтерактивного режиму як такого: git clean -fdxi, і він підкаже, які файли потрібно видалити.
moeabdol

5
Це чудово, але ви, можливо, захочете додати повідомлення користувачам -xДО ВИКОРИСТАННЯ З ОБЕРЕЖНОЮ, оскільки це назавжди видалить файли. Або використовувати з, -nяк згадував @Druska
lacostenycoder

3
Ще не використовували -xвидалені файли .project та інші конфігурації. Довелося знову перетягнути репо з останньої комісії в новий каталог.
хронометраж

2
Я думаю, ви повинні повідомити, що ця команда потенційно небезпечна, оскільки може видалити потрібні файли !!!
Девіде

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 for force
-d для каталогу
-x для проігнорованих файлів (додати, якщо потрібно)

Примітка. Додайте -n або --dry-run, щоб просто перевірити, що це буде робити.


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


Будь-яка "зупинка серця" 😂😂😂
Ріші

2

Ви також можете повернутися до попереднього стану місцевого репо-іншим способом:

  1. Додайте відслідковувані файли до місця постановки за допомогою git add.
  2. повернення до попереднього стану місцевого репо с 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.