как удалить неотслеживаемые файлы в 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 - удалить также игнорируемые файлы (не используйте это, если не хотите удалять игнорируемые файлы)


Используйте с осторожностью!
Эти команды могут навсегда удалить произвольные файлы, о которых вы сначала не думали. Пожалуйста, дважды проверьте и прочтите все комментарии под этим ответом и разделом --help и т. Д., Чтобы знать все детали, чтобы точно настроить свои команды и, несомненно, получить ожидаемый результат.

manojlds
источник
54
Сначала добавьте -n для предварительного просмотра, чтобы случайно не удалить что-то
Друска
8
Это круто! За исключением того, что он также удалит файлы конфигурации, которые вы могли намеренно проигнорировать в .gitignore, но по-прежнему нужны для вашей локальной среды разработки. Вы можете использовать ту же команду с дополнительным -i для интерактивного режима как такового: git clean -fdxi, и он предложит вам, какие файлы вы хотите удалить.
moeabdol
5
Это замечательно, но вы можете добавить примечание для пользователей, чтобы ИСПОЛЬЗОВАТЬ -xВНИМАНИЕ, потому что это приведет к безвозвратному удалению файлов. Или используйте with, -nкак упомянуто @Druska
lacostenycoder
3
Не использовал -xдо сих пор .project и другие файлы конфигурации были удалены. Пришлось снова вытащить репо из последней фиксации в новый каталог.
хронометрист
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 или --dry-run, чтобы просто проверить, что он будет делать.

bit_cracker007
источник
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.
Томаш Назаренко
источник
1

Команда для вашего спасения git clean.

Джагрити Кумари
источник
0

Ну, у меня была аналогичная проблема. Я взял последнюю, но в локальном были некоторые изменения, из-за которых слияние не происходило с конкретным файлом. Файл не отслеживался, и я не хотел их, поэтому я сделал следующее:

$ git checkout путь к файлу / имя файла

filepath - место, откуда я сделал git bash. затем, когда я взял последние, изменения были доступны

SKB
источник
0

Хотя git cleanработает хорошо, я все же считаю полезным использовать мой собственный скрипт для очистки репозитория git, но у него есть некоторые преимущества.

Это показывает список файлов, которые нужно очистить, а затем интерактивно предлагает очистить или нет. Это почти всегда то, что я хочу, поскольку интерактивные подсказки для каждого файла утомительны.

Он также позволяет вручную фильтровать список, что удобно, когда есть типы файлов, которые вы не хотите очищать (и у вас есть причина не фиксировать).


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
ideasman42
источник