Как удалить локальные (неотслеживаемые) файлы из текущего рабочего дерева Git

6844

Как вы удаляете неотслеживаемые локальные файлы из вашего текущего рабочего дерева?

Readonly
источник
86
На этом интерактивном шпаргалке git ndpsoftware.com/git-cheatsheet.html показано рабочее пространство git (Google дает вам лучшие результаты с «рабочим пространством», чем с «рабочей копией»).
13
28
Примечание: если вы хотите удалить только некоторые неотслеживаемые файлы, но не все , git cleanтеперь есть интерактивный режим! Смотрите мой ответ на этот другой вопрос : git 1.8.4+
VonC
17
Обратите внимание, что вы не удаляете файлы из ветки git, так как ветка является ссылкой на коммит и поэтому не содержит неотслеживаемых файлов. Они присутствуют только в рабочем каталоге и не имеют ничего общего с ветками. Это, вероятно, просто уточнение терминологии.
Павел Шимерда
6
Чтобы уяснить понимание непосвященных и новичков в Git - запустите git status и если он показывает файл как неотслеживаемый, и вы не хотите, чтобы этот файл находился в репозитории, вы можете просто зайти в свою файловую систему и удалить или переместить ее , Это не принесет ничего плохого вашему локальному репо или Git. Вы также можете использовать git cleanили некоторые варианты ответов ниже, в том числе интерактивную версию, чтобы удалить только отдельные файлы, но интерактивный режим может быть утомительным. Что бы вы ни делали, убедитесь, что вы понимаете, что git cleanбудет удалять или использовать, --dry-runчтобы оно сообщало вам, не удаляя ничего.
LightCC
4
Если файлы еще не отслеживаются, не могли бы вы просто удалить их без мерзавца? rm files-to-be-deleted
mhatch

Ответы:

8735

git-clean - удаляет неотслеживаемые файлы из рабочего дерева

конспект

git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <path>…​

Описание

Очищает рабочее дерево путем рекурсивного удаления файлов, которые не находятся под контролем версий, начиная с текущего каталога .

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

Если <path>...даны какие-либо необязательные аргументы, затрагиваются только эти пути.


Шаг 1, чтобы показать, что будет удалено с помощью -nопции:

# Print out the list of files which will be removed (dry run)
git clean -n

Clean Step - будьте осторожны: это удалит файлы :

# Delete the files from the repository
git clean -f
  • Чтобы удалить каталоги, запустите git clean -f -dилиgit clean -fd
  • Чтобы удалить проигнорированные файлы, запустите git clean -f -Xилиgit clean -fX
  • Чтобы удалить проигнорированные и не проигнорированные файлы, запустите git clean -f -xилиgit clean -fx

Обратите внимание на разницу в регистре Xдля двух последних команд.

Если clean.requireForceв вашей конфигурации установлено значение «истина» (по умолчанию), нужно указать, -fиначе ничего на самом деле не произойдет.

Снова смотрите git-cleanдокументы для получения дополнительной информации.


Опции

-f, --force

Если для переменной конфигурации Git clean.requireForce не задано значение false, git clean откажется запускаться, если не указано -f, -nили -i.

-x

Не используйте стандартные правила игнорирования, считанные из .gitignore (для каждого каталога) и $GIT_DIR/info/exclude, но все же используйте правила игнорирования, заданные с -eпараметрами. Это позволяет удалить все неотслеживаемые файлы, включая продукты сборки. Это может быть использовано (возможно, в сочетании с git reset) для создания первичного рабочего каталога для тестирования чистой сборки.

-X

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

-n, --dry-run

На самом деле ничего не удаляйте, просто покажите, что будет сделано.

-d

Удалите неотслеживаемые каталоги в дополнение к неотслеживаемым файлам. Если неотслеживаемый каталог управляется другим Git-репозиторием, по умолчанию он не удаляется. Используйте -fопцию дважды, если вы действительно хотите удалить такой каталог.

Ashkan Sirous
источник
288
git clean -fработает только в каталоге, где он называется (и подкаталогах). Если вы хотите очистить всю рабочую копию, вам следует вызвать ее в корневой каталог.
Эдуардо Безерра
17
Он также удаляет все файлы внутри .gitignore. Мне нужно удалить только файлы / папки, которые являются новыми и не в .gitignore
Kostanos
24
@Kostanos Если вы не хотите удалять файлы, находящиеся в .gitignore, не указывайте флаг -x.
Ло-Тан
52
git clean -f :/работает так, как будто вы запустили его в корневом каталоге репо. См. Также более поздние ответы, также учитывающие подмодули сgit clean -ffxd :/
здесь
18
@Michelle git clean -xfd также удалит все файлы, которые в настоящее время игнорируются в вашем .gitignore, и они не подлежат восстановлению
thedanotto
987

Используйте, git clean -f -dчтобы убедиться, что каталоги также удалены.

  1. На самом деле ничего не удаляйте, просто покажите, что будет сделано.

    git clean -n
    

    или

    git clean --dry-run
    
  2. Удалите неотслеживаемые каталоги в дополнение к неотслеживаемым файлам. Если неотслеживаемый каталог управляется другим Git-репозиторием, по умолчанию он не удаляется. Используйте эту -fопцию дважды, если вы действительно хотите удалить такой каталог.

    git clean -fd
    

Затем вы можете проверить, действительно ли ушли ваши файлы git status.

robert.berger
источник
115
Как было сказано ранее, хорошо git clean -n -d
пробовать
15
То же самое делать git clean -ndи git clean -fd.
Майкл
478

Я удивлен, что никто не упомянул об этом раньше:

git clean -i

Это означает интерактивный, и вы получите быстрый обзор того, что будет удалено, предлагая вам возможность включить / исключить затронутые файлы. В целом, все еще быстрее, чем запуск обязательной --dry-runперед реальной уборкой.

Вам нужно будет добавить, -dесли вы также хотите позаботиться о пустых папках. В конце концов, это дает хороший псевдоним:

git iclean

Это сказанное, дополнительное удерживание руки интерактивных команд может быть утомительным для опытных пользователей. В эти дни я просто использую уже упомянутыеgit clean -fd

SystematicFrank
источник
16
@ pal4life Он был добавлен в 1.8.4, возможно, вы используете старую версию git? github.com/git/git/blob/master/Documentation/RelNotes/1.8.4.txt
Маттиас Бэкман
Мне нравится это - мне удобнее иметь его в моей истории bash, чем любой другой вариант, потому что нет ничего страшного, если я случайно нажму ctrl-r или ctrl-p.
csvoss
Может быть, это git clean -iработает, только если вызывается из корня рабочей копии?
Алессандро Якопсон
250

Если неотслеживаемый каталог является собственным репозиторием git (например, подмодулем), вам нужно использовать -fдважды:

git clean -d -f -f

Михал Шайбе
источник
4
Кстати, это написано в документации : Git откажется удалять каталоги с подкаталогом или файлом .git, если не указан второй -f. Но все равно спасибо!
Максим Суслов
248

Простой способ удалить неотслеживаемые файлы

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

git add --all
git reset --hard HEAD

Thanga
источник
8
Вы можете заменить git add --allна git add .. Таким образом, вы можете сделать это более коротким способом в режиме oneline git add . && git reset --hard HEAD (будьте очень осторожны с этой командой) .
RousseauAlexandre
22
Зачем использовать это снова git clean?
user2864740
8
Потому что, git cleanвидимо, также удаляет все, что игнорируется. Он просто удалил мою node_modulesпапку. Выполнение этого сначала очистит все файлы, кроме игнорируемых, а затем удалит их, выполнив сброс. Проигнорированные файлы не будут затронуты.
Андреас
5
@ Андреас не удаляет игнорируемые файлы для меня (git 2.14.1). Вы должны запустить вgit clean -n любом случае, прежде чем делать реальное удаление (или использовать git clean -i).
Qw3ry
8
git cleanудаляет проигнорированные файлы, только если вы используете либо опцию, -xлибо -X, иначе он просто удаляет неотслеживаемые файлы.
Двойной Вниз
140

Мне нравится, git stash push -uпотому что вы можете отменить их все git stash pop.

РЕДАКТИРОВАТЬ: Также я нашел способ показать неотслеживаемый файл в тайнике (например git show stash@{0}^3) https://stackoverflow.com/a/12681856/338986

EDIT2: git stash saveустарела в пользу push. Спасибо @ script-волк.

Hiroshi
источник
3
Можете ли вы объяснить -u на тайнике? Я не понимаю, как это работает иначе, чем git stash save. Я попробовал это, и это сработало. Посмотрел на git docs и тоже не смог там его найти.
Виннемукка
9
-uэквивалентно --include-untracked. Вы можете найти помощь с git help stash.
Хироши
3
@hiroshi Спасибо! попробовав каждое чертово решение от дюжины разных людей, это тот, который наконец-то сработал ... вот так! Даже гадкий сундук делал нада. Сохранить - вы позаботились о неотслеживаемых. сброс жесткого / чистого усилия / и т.д., ничего из этого не сделало для меня ничего.
killjoy
3
saveВариант осуждался в пользу push, которая делает то же самое , но больше. Вы можете прочитать больше здесь, /programming/44680028/whats-the-difference-between-git-stash-save-and-git-stash-push/44681952
Скрипт Wolf
120

Это то, что я всегда использую:

git clean -fdx

Для очень большого проекта вы можете запустить его пару раз.

Оскар Фракседас
источник
@Martin Один из проектов, над которым я работаю, +8 лет с +80 разработчиками, активно кодирующими. Git иногда не может очистить его при первом проходе.
Оскар Фракседас
1
Я могу подтвердить это, так что это все еще действует в 2020 году. Мы также работаем над большим проектом, и мне пришлось запускать его 4-5 раз, пока GIT не нашел больше файлов для удаления.
Турболокост
90

git-clean - это то, что вы ищете. Используется для удаления неотслеживаемых файлов из рабочего дерева.

Эспоо
источник
86

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

git clean -f {dir_path}

И комбинированный способ удаления неотслеживаемых каталогов / файлов и игнорируемых файлов.

git clean -fxd {dir_path}

после этого вы будете изменять файлы только в git status.

Виджей С
источник
68

Удалите все лишние папки и файлы в этом репо + подмодули

Это приводит вас в то же состояние, что и свежий клон.

git clean -ffdx

Удалите все дополнительные папки и файлы в этом репо, но не его подмодули

git clean -fdx

Удалите лишние папки, но не файлы (например, папку build или logs)

git clean -fd

Удалить лишние папки + пропущенные файлы (но не новые добавленные файлы)

Если файл не был проигнорирован и еще не зарегистрирован, он остается. Обратите внимание на заглавную X.

git clean -fdX

Новый интерактивный режим

git clean
Шиталь шах
источник
57

git clean -fd удаляет каталог

git clean -fX удаляет проигнорированные файлы

git clean -fx удаляет проигнорированные и не проигнорированные файлы

могут быть использованы все вышеперечисленные варианты в комбинации как

git clean -fdXx

проверьте руководство git для получения дополнительной помощи

Пуджа
источник
10
Команда git clean -fdXxвыдает сообщение об ошибке «fatal: -x и -X нельзя использовать вместе» (с использованием git-2.8). Для вашего последнего предложения в вашем ответе, пожалуйста, предоставьте ссылку на руководство git. Приветствия
olibre
выполните две команды по порядку: git clean -fdX, git clean -fdx
Часы ZHONG
55

ОК, удалить ненужные неотслеживаемые файлы и папки легко gitв командной строке, просто сделайте это так:

git clean -fd

Двойная проверка прежде чем делать это, поскольку он будет удалять файлы и папки, не делая истории ...

Также в этом случае -fвыступает за силу и-d означает каталог ...

Итак, если вы хотите удалить только файлы, вы можете использовать -fтолько:

git clean -f

Если вы хотите удалить (каталоги) и файлы, вы можете удалить только неотслеживаемые каталоги и файлы, например:

git clean -fd

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

И добавление -i флага заставляет git запрашивать разрешение на удаление файлов один за другим на ходу.

Если вы не уверены и хотите сначала проверить, добавьте -n флаг.

использование -q если вы не хотите видеть какой-либо отчет после успешного удаления.

Я также создаю изображение ниже, чтобы сделать его более запоминающимся, особенно я видел, как многие люди -fиногда путают, когда чистят папку, или как-то путают !


удаление ненужных неотслеживаемых файлов и папок

Алиреза
источник
Что с этим изображением?
Пейсер
37

Лучше всего использовать git clean

git clean -d -x -f

Это удаляет неотслеживаемые файлы, включая каталоги (-d)и файлы, игнорируемыеgit (-x) .

Кроме того, замените -fаргумент, -nчтобы выполнить интерактивный режим dry-runили -iдля интерактивного режима, и он скажет вам, что будет удалено.

Chhabilal
источник
25

Пользовательский интерактивный подход:

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/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/arsdumpgenerator/s3/ [y/N]? y

-i для интерактивной
-f для принудительной
-d для директории
-x для игнорируемых файлов (добавьте при необходимости)

Примечание: Добавьте -n или --dry-run, чтобы просто проверить, что он будет делать.

bit_cracker007
источник
20

Lifehack для такой ситуации, которую я только что изобрел и попробовал (это прекрасно работает):

git add .
git reset --hard HEAD

Осторожно! Обязательно передайте все необходимые изменения (даже в неотслеживаемых файлах) перед выполнением этого .

thybzi
источник
3
По крайней мере, это другой подход. :) Другой способ, который запомнил бы удаленные файлы в reflog, но не в каких-либо ветках, был бы:git add . git commit -m 'about to delete' git reset --hard HEAD~
joeytwiddle
2
еще более быстрый способgit add . && git reset --hard HEAD
тибзи
3
git add . && git reset --hard
Плеймор
Это может быть не то, что вы хотите, если есть также изменения, которые вы хотите зафиксировать.
lacostenycoder
@AlexanderMills git reset --hardсбрасывает все незафиксированные изменения, НО НЕ ОБНАРУЖЕННЫЕ ФАЙЛЫ, до состояния последнего коммита. Вот почему нам сначала нужно git add .- чтобы все неотслеживаемые файлы были подготовлены (чтобы они тоже сбрасывались)
thybzi
19

git clean -f -d -x $(git rev-parse --show-cdup)применяет clean к корневому каталогу, независимо от того, где вы вызываете его в дереве каталогов репозитория. Я использую его все время, так как он не заставляет вас покидать папку, в которой вы сейчас работаете, и позволяет очищать и фиксировать прямо из того места, где вы находитесь.

Убедитесь , что флаги -f, -d, -xсоответствовать вашим потребностям:

-d
       Remove untracked directories in addition to untracked files. If an
       untracked directory is managed by a different Git repository, it is
       not removed by default. Use -f option twice if you really want to
       remove such a directory.

-f, --force
       If the Git configuration variable clean.requireForce is not set to
       false, git clean will refuse to delete files or directories unless
       given -f, -n or -i. Git will refuse to delete directories with .git
       sub directory or file unless a second -f is given. This affects
       also git submodules where the storage area of the removed submodule
       under .git/modules/ is not removed until -f is given twice.

-x
       Don't use the standard ignore rules read from .gitignore (per
       directory) and $GIT_DIR/info/exclude, but do still use the ignore
       rules given with -e options. This allows removing all untracked
       files, including build products. This can be used (possibly in
       conjunction with git reset) to create a pristine working directory
       to test a clean build.

Есть и другие доступные флаги, просто проверьте git clean --help.

Никита Леонов
источник
Кстати, вы можете просто сделать git clean {flags}: / так будет, как если бы вы запустили команду в корне
репозитория
19

У меня работали только следующие:

git clean -ffdx

Во всех других случаях я получал сообщение «Пропуск каталога» для некоторых подкаталогов.

rahul286
источник
2
Спасибо. Я пропустил -xи просто использовал, git clean -ffdчтобы избежать стирания файлов в .gitignore.
Фекмор
15

Если вы просто хотите удалить файлы, перечисленные как неотслеживаемые «git status»

git stash save -u
git stash drop "stash@{0}"

Я предпочитаю это «git clean», потому что «git clean» удалит файлы, игнорируемые git, поэтому ваша следующая сборка должна будет перестроить все, и вы также можете потерять настройки IDE.

jazzdev
источник
3
Это также удалит действительные изменения в отслеживаемых файлах. Я бы не рекомендовал это.
code_dredd
2
Да, вы хотите сначала внести изменения в отслеживаемые файлы.
Jazzdev
14

Чтобы узнать, что будет удалено перед фактическим удалением:

git clean -d -n

Это выведет что-то вроде:

Удалил sample.txt

Чтобы удалить все, что перечислено в выводе предыдущей команды:

git clean -d -f

Это выведет что-то вроде:

Удаление файла sample.txt

Омар Мовафи
источник
11

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

git clean -fdn

Это покажет вам список файлов, которые будут удалены. Теперь, чтобы фактически удалить эти файлы, используйте эту команду:

git clean -fd
Gaurav
источник
11

Будьте внимательны при выполнении команды `git clean`.

Всегда используйте -n перед запуском фактической команды, поскольку она покажет вам, какие файлы будут удалены.

git clean -n -d 
git clean -f -d

По умолчанию git cleanудаляются только неотслеживаемые файлы, которые не игнорируются. Любой файл, который соответствует шаблону в вашем .gitignore или других игнорируемых файлах, не будет удален. Если вы тоже хотите удалить эти файлы, вы можете добавить -xкоманду к чистой команде.

git clean -f -d -x

Существует также интерактивный режим, доступный -iс командой clean

git clean -x -i

альтернативно

Если вы не уверены на 100%, что удаление вашей незафиксированной работы безопасно, вы можете вместо этого использовать копирование

git stash --all

Это также очистит ваш каталог, но даст вам возможность извлекать файлы в любой момент времени, используя stash с apply или pop . Затем на более позднем этапе вы можете очистить свой тайник, используя:

git stash drop // or clean
DevWL
источник
2
тайник - хорошая идея, однако вы можете ее использоватьgit stash save and type some comment as to what this stash was for
lacostenycoder
9

Команда для удаления неотслеживаемых файлов из git docs - это git clean

git clean - удаляет неотслеживаемые файлы из рабочего дерева

Предлагаемый метод: использование Интерактивного режима, git clean -i чтобы мы могли контролировать его. давайте посмотрим оставшиеся доступные варианты.

Доступные Варианты:

git clean 
    -d -f -i -n -q -e -x -X (can use either)

Объяснение:

1. -d

Удалите неотслеживаемые каталоги в дополнение к неотслеживаемым файлам. Если неотслеживаемый каталог управляется другим Git-репозиторием, по умолчанию он не удаляется. Используйте параметр -f дважды, если вы действительно хотите удалить такой каталог.

2. -f, --force

Если для переменной конфигурации Git clean.requireForce не задано значение false, git clean откажется запускаться, если не указано -f, -n или -i.

3. -i, - интерактивный

Покажите, что будет сделано, и очистите файлы в интерактивном режиме. Подробнее см. «Интерактивный режим».

4. -n, --dry-run

На самом деле ничего не удаляйте, просто покажите, что будет сделано.

5. -q, --quiet

Будьте спокойны, сообщайте только об ошибках, но не о файлах, которые были успешно удалены.

6. -e, --exclude =

В дополнение к тем, которые находятся в .gitignore (для каждого каталога) и в $ GIT_DIR / info / exclude, также следует учитывать, что эти шаблоны входят в набор действующих правил игнорирования.

7.-х

Не используйте стандартные правила игнорирования, считанные из .gitignore (для каждого каталога) и $ GIT_DIR / info / exclude, но все же используйте правила игнорирования, заданные с опциями -e. Это позволяет удалить все неотслеживаемые файлы, включая продукты сборки. Это может быть использовано (возможно, в сочетании с git reset) для создания первичного рабочего каталога для тестирования чистой сборки.

8. -X

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

Мохидин бен Мухаммед
источник
Я думаю, у вас есть опечатка, uggestedно это просто " uggestionLOL
Lacostenycoder
8

Обычная git cleanкоманда не удаляет неотслеживаемые файлы с моей git version 2.9.0.windows.1.

$ git clean -fdx     # doesn't remove untracked files
$ git clean -fdx *   # Append star then it works!
kujiy
источник
7

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

git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]

Пример:

git reset --hard HEAD

Ссылки:

  1. https://git-scm.com/docs/git-reset
  2. Как использовать 'git reset --hard HEAD', чтобы вернуться к предыдущему коммиту?
  3. Сбросить ветку локального репозитория, чтобы она была похожа на заголовок удаленного репозитория
  4. https://jwiegley.github.io/git-from-the-bottom-up/3-Reset/4-doing-a-hard-reset.html
Elangovan
источник
Это также удалит изменения, сделанные для фиксации, а не только неотслеживаемые файлы, которые могут не соответствовать вашим ожиданиям.
скрипучим
Не работает: оставляет несколько файлов. git clean -ffdxтакое решение
Евгений Гр. Филиппов
7

Очистить git-репозиторий и все подмодули рекурсивно

Следующая команда рекурсивно очистит текущий репозиторий git и все его подмодули:

(git clean -d -x -f && git submodule foreach --recursive git clean -d -x -f)
Сергей
источник
конечно, это следует использовать с большой осторожностью
lacostenycoder
6
git clean -f

удалит неотслеживаемые файлы из текущего git

git clean -fd

когда вы хотите удалить каталоги и файлы, будут удалены только неотслеживаемые каталоги и файлы

Судхир Вишвакарма
источник
5

oh-my-zsh с zsh предоставляет эти отличные псевдонимы через плагин git. Их можно использовать и в bash.

gclean='git clean -fd'
gpristine='git reset --hard && git clean -dfx'

  • gclean удаляет неотслеживаемые каталоги в дополнение к неотслеживаемым файлам .
  • gpristineжестко сбрасывать локальные изменения, удалять неотслеживаемые каталоги, неотслеживаемые файлы и не использовать стандартные правила игнорирования, считанные из .gitignore (для каждого каталога) и $ GIT_DIR / info / exclude, но все же использовать правила игнорирования, заданные с опциями -e. Это позволяет удалить все неотслеживаемые файлы, включая продукты сборки. Это может быть использовано (возможно, в сочетании с git reset) для создания первичного рабочего каталога для тестирования чистой сборки .
ZenLulz
источник
2
Спасибо за ваш отзыв, мое заявление сбило с толку. Я хотел сказать, что выделенные псевдонимы приходят автоматически с oh-my-zsh. Они, очевидно, прекрасно работают в bash. Я отредактировал свой ответ, чтобы отразить это.
ZenLulz
4

Мне нравится использовать git stashкоманду, позже вы можете получить спрятанные файлы и изменения. git cleanЭто также хороший вариант, но полностью зависит от ваших требований. Вот объяснение git stash и git clean, 7.3 Git Tools - Копирование и очистка

Зия
источник