Як видалити локальні (без треку) файли з поточного робочого дерева Git


6838

Як видалити незаймані локальні файли з поточного робочого дерева?


86
Цей інтерактивний чіт-лист git ndpsoftware.com/git-cheatsheet.html показує робочу область git (google дає кращі результати з "робочої області", ніж "робоча копія").
qneill

28
Примітка. Якщо ви хочете видалити лише незафіксовані файли, але не всі , git cleanтепер інтерактивний режим! Дивіться мою відповідь на це інше питання : git 1.8.4+
VonC

17
Зауважте, що ви не видаляєте файли з гілки git, оскільки гілка є посиланням на фільтр і тому не містить файлів, що не відслідковуються. Вони присутні лише в робочому каталозі і не мають нічого спільного з гілками. Це, мабуть, лише термінологічне уточнення.
Павло Шімерда

6
Щоб уточнити розуміння непосвяченого та тих, хто не є Git - запустіть статус git, і якщо він відображає файл як невизначений, і ви не хочете, щоб цей файл знаходився в репо, ви можете просто перейти до вашої файлової системи та видалити або перемістити її . Це не спричинить нічого поганого ні для вашого місцевого репо, ні для Git. Ви також можете використовувати git cleanчи деякі зміни у відповідях нижче, включаючи інтерактивну версію для видалення лише вибіркових файлів, але інтерактивний режим може бути стомлюючим. Що б ви не робили, переконайтеся, що ви розумієте, що git cleanбуде видалено або використати --dry-runдля того, щоб це повідомило вам, нічого не видаляючи.
LightCC

4
Якщо файли ще не відстежуються, ви не могли їх просто видалити без git? rm files-to-be-deleted
матч

Відповіді:


8730

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

Чистий крок - будьте обережні: це видалить файли :

# 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у вашій конфігурації встановлено значення "true" (за замовчуванням), потрібно вказати -fінакше нічого насправді не станеться.

Знову див. git-cleanДокументи для отримання додаткової інформації.


Параметри

-f, --force

Якщо змінна конфігурація Git clean.requireForce не встановлена ​​на false, git clean буде відмовлятися від запуску, якщо не вказано -f, -nабо -i.

-x

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

-X

Видаліть лише файли, ігноровані Git. Це може бути корисно для відновлення всього з нуля, але зберігайте файли, створені вручну.

-n, --dry-run

Насправді нічого не видаляйте, просто покажіть, що було б зроблено.

-d

Видаліть незатрековані каталоги на додаток до файлів, що не відслідковуються. Якщо каталог без відстеження керується іншим сховищем Git, він не видаляється за замовчуванням. Скористайтеся -fопцією двічі, якщо ви дійсно хочете видалити такий каталог.


287
git clean -fпрацює лише в каталозі, де він називається (і підкаталогах). Якщо ви хочете очистити всю робочу копію, вам слід зателефонувати в її кореневий каталог.
Едуардо Безерра

17
Це також видалення всіх файлів всередині .gitignore. Мені потрібно видалити лише нові файли / папки, які не містяться у .gitignore
Kostanos

24
@Kostanos Якщо ви не хочете видаляти файли, які знаходяться у .gitignore, не вказуйте прапор -x.
Ло-Тан

51
git clean -f :/працює так, як ніби ви запустили його в кореневій репортаж. Дивіться також пізніші відповіді, що також враховують підмодулі зgit clean -ffxd :/
ось

18
@Michelle мерзотник чистий -xfd буде також видалити всі файли ігнорованих В ТВОЇХ .gitignore , і вони не можуть бути відшкодовані
thedanotto

986

Використовуйте git clean -f -dдля того, щоб також видалити каталоги .

  1. Насправді нічого не видаляйте, просто покажіть, що було б зроблено.

    git clean -n
    

    або

    git clean --dry-run
    
  2. Видаліть незатрековані каталоги на додаток до файлів, що не відслідковуються. Якщо каталог без відстеження керується іншим сховищем Git, він не видаляється за замовчуванням. Скористайтеся цим -fваріантом двічі, якщо ви дійсно хочете видалити такий каталог.

    git clean -fd
    

Потім ви можете перевірити, чи справді ваші файли відсутні git status.


115
Як було сказано раніше, добре запустити йогоgit clean -n -d
Ms01

15
Те саме робити git clean -ndі git clean -fd.
Місер

477

Я здивований, що ніхто раніше про це не згадував:

git clean -i

Це означає, що це інтерактивна інформація, і ви отримаєте швидкий огляд того, що буде видалено, пропонуючи вам можливість включити / виключити файли, які стосуються цього. Загалом, все ж швидше, ніж виконання обов'язкового --dry-runперед реальною чисткою.

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

git iclean

Незважаючи на це, додаткове тримання інтерактивних команд може бути стомлюючим досвідчених користувачів. У ці дні я просто використовую вже згаданеgit clean -fd


16
@ pal4life Додано в 1.8.4, можливо, ви маєте старішу версію git? github.com/git/git/blob/master/Documentation/RelNotes/1.8.4.txt
Mattias Backman

Мені це подобається - мені зручніше це мати в моїй історії башів, ніж будь-який інший варіант, тому що нічого не важливого, якщо я випадково на нього ctrl-r або ctrl-p.
csvoss


250

Якщо каталог без відстеження є власним сховищем git (наприклад, підмодуль), вам потрібно використовувати -fдва рази:

git clean -d -f -f


4
До речі, це записано в документації : Git відмовиться видаляти каталоги з .git підкаталогом або файлом, якщо не вказано другий -f. Але дякую все одно!
Максим Суслов

248

Простий спосіб видалення незатребуваних файлів

Щоб видалити всі незаймані файли, найпростіший спосіб - додати їх спочатку та скинути репо, як показано нижче

git add --all
git reset --hard HEAD


8
Ви можете замінити git add --allна git add .. Таким чином, ви можете зробити це коротше в один рядок git add . && git reset --hard HEAD (будьте дуже обережні з цією командою) .
Руссо

22
Навіщо використовувати це над git clean?
користувач2864740

8
Тому що git cleanмабуть також видаляє все, що ігнорується. Він просто видалив мою node_modulesпапку. Для цього слід спершу виконати всі файли, крім ігнорованих, а потім видалити їх, виконавши скидання. Проігноровані файли торкатися не будуть.
Андреас

5
@Andreas він не видаляє ігноровані файли для мене (git 2.14.1). Вам слідgit clean -n все одно запуститись перед тим, як зробити справжнє видалення (або використовувати git clean -i).
Qw3ry

8
git cleanвидаляє ігноровані файли лише у тому випадку, якщо ви використовуєте -xабо -Xпараметр, або варіант, інакше він просто видаляє незатребувані файли.
подвійнеDown

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-wolf.


3
Чи можете ви пояснити -у на скрині? Я не стежу за тим, як це працює інакше, ніж git stash save. Я спробував це, і це спрацювало. Дивився на git docs і не міг його знайти і там.
Winnemucca

9
-uеквівалентно --include-untracked. Ви можете знайти допомогу git help stash.
хіроші

3
@hiroshi Дякую! після випробування кожного проклятого рішення від десятка різних людей це те, що нарешті спрацювало ... ось! Нада навіть гет-скриш. Заощаджуючий піклувався про непідконтрольних. скинути жорстку / чисту силу / тощо. жоден із них нічого для мене не зробив.
killjoy

3
Цей saveваріант був знятий на користь push, що робить те саме, але більше. Більше ви можете прочитати тут, /programming/44680028/whats-the-difference-bet
Script Wolf

120

Це те, що я завжди використовую:

git clean -fdx

Для дуже великого проекту ви можете запустити його кілька разів.


@Martin Одним із проектів, над якими я працюю, є +8 років, які розробляють +80 розробників, які активно кодують. Git іноді не вдається очистити його при першому проході.
Оскар Фраксідас

1
Я можу це підтвердити, тому це все ще діє в 2020 році. Ми також працюємо над великим проектом, і мені довелося запустити його 4-5 разів, поки GIT не знайшов більше файлів, які потрібно видалити.
турболокут

90

git-clean - це те, що ви шукаєте. Він використовується для видалення відслідковуваних файлів з робочого дерева.


86

Якщо потрібно, щоб видалити відслідковувані файли з певного підкаталогу,

git clean -f {dir_path}

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

git clean -fxd {dir_path}

після цього ви будете змінювати файли лише в git status.


68

Видаліть усі додаткові папки та файли з цього підмодуля repo +

Це приводить вас у такий же стан, як і свіжий клон.

git clean -ffdx

Видаліть усі додаткові папки та файли з цього репо, але не його підмодулі

git clean -fdx

Видаліть зайві папки, але не файли (наприклад, папка збирання чи журналів)

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. Ура
олібре

запустіть дві команди послідовно: git clean -fdX, git clean -fdx
Clock ZHONG

55

Гаразд, видалити непотрібні файли та папки, які не відстежуються , легко використовувати gitв командному рядку, просто зробіть це так:

git clean -fd

Перевірте це перед тим, як це видалить файли та папки, не створюючи історії ...

Також у цьому випадку -fвиступає сила і-d означає каталог ...

Отже, якщо ви хочете видалити лише файли, ви можете використовувати -fлише:

git clean -f

Якщо ви хочете видалити (каталоги) та файли, ви можете видалити лише незатребувані каталоги та файли на зразок цього:

git clean -fd

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

І додаючи -iпрапор, git запитує вас дозволу на видалення файлів по черзі на ходу.

Якщо ви не впевнені і хочете перевірити речі спочатку, додайте -nпрапор.

Використовуйте, -qякщо ви не хочете бачити жодного звіту після успішного видалення.

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


видалення непотрібних файлів і папок, що не відслідковуються


Що з цим зображенням?
Pacerier

37

Кращий спосіб - використовувати: git clean

git clean -d -x -f

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

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


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

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


20

Лайфхак для такої ситуації я щойно вигадав і спробував (це прекрасно працює):

git add .
git reset --hard HEAD

Остерігайся!Перш ніж це зробити, обов’язково введіть необхідні зміни (навіть у файлах, що не відслідковуються) .


3
Принаймні, це інший підхід. :) Інший спосіб, який запам'ятав би видалені файли в рефлогу, але не в будь-яких гілках, був би:git add . git commit -m 'about to delete' git reset --hard HEAD~
joeytwiddle

2
ще більш швидкий шляхgit add . && git reset --hard HEAD
thybzi

3
git add . && git reset --hard
Плеймор

Це може бути не тим, що ви хочете, якщо є також зміни, які ви хочете зробити.
лакостенікодер

@AlexanderMills git reset --hardскидає всі неускладнені зміни, АМЕ НЕВІДКЛЮЧЕНІ ФАЙЛИ до стану останньої фіксації. Ось чому нам в першу чергу потрібно git add .- це поетапно виконувати всі непотрібні файли (щоб вони також були скинуті)
thybzi

19

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

Переконайтеся , що прапори -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}: / це буде так, як якщо б ви запустили команду в корінь repo
The-null-Pointer-

19

Для мене працювали лише наступні:

git clean -ffdx

У всіх інших випадках я отримував повідомлення "Пропуск каталогів" для деяких підкаталогів.


2
Дякую. Я залишив поза -xта просто використовував, git clean -ffdщоб уникнути стирання файлів у .gitignore.
Фекмор

15

Якщо ви просто хочете видалити файли, перелічені як неактивні, за допомогою "git status"

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

Я вважаю за краще це "git clean", оскільки "git clean" видалить файли, ігноровані git, тому наступна збірка повинна буде відновити все, і ви також можете втратити налаштування IDE.


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

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

Він також очистить ваш каталог, але надасть вам можливість для завантаження файлів у будь-який момент часу, використовуючи приховану скриньку із застосувати чи поп . Тоді, пізніше, ви можете очистити свої сховища за допомогою:

git stash drop // or clean

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.

Видаліть незатрековані каталоги на додаток до файлів, що не відслідковуються. Якщо каталог без відстеження керується іншим сховищем Git, він не видаляється за замовчуванням. Використовуйте параметр -f двічі, якщо ви дійсно хочете видалити такий каталог.

2. -f, - сила

Якщо для змінної конфігурації Git clean.requireForce не встановлено значення false, git clean буде відмовлятися від запуску, якщо не вказано -f, -n або -i.

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

Покажіть, що буде зроблено, та чистіть файли інтерактивно. Детальніше див. У "Інтерактивному режимі".

4. -н, - сушитися

Насправді нічого не видаляйте, просто покажіть, що було б зроблено.

5. -q, - тихо

Будьте спокійні, повідомляйте лише про помилки, але не про файли, які успішно видаляються.

6. -е, --виключити =

На додаток до тих, які знайдені у .gitignore (за каталогом) та $ GIT_DIR / info / виключити, також вважають ці шаблони такими, що є у наборі діючих правил ігнорування.

7. -х

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

8. -X

Видаліть лише файли, ігноровані Git. Це може бути корисно для відновлення всього з нуля, але зберігайте файли, створені вручну.


Я думаю, у вас є помилка uggesteduggestion
друку,

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!

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. Скиньте локальну гілку сховища так само, як віддалену HEAD HEAD
  4. https://jwiegley.github.io/git-from-the-bottom-up/3-Reset/4-doing-a-hard-reset.html

Це також видалить зміни, поетапні для фіксації, не лише відслідковуваних файлів, які можуть бути не такими, які ви хочете.
розпущений

Не працює: залишає деякі файли. git clean -ffdxє рішення
Євген Гр. Філіппов

7

Очистіть сховище git та всі підмодулі рекурсивно

Наступна команда очистить поточний сховище git та всі його підмодулі рекурсивно:

(git clean -d -x -f && git submodule foreach --recursive git clean -d -x -f)

напевно це слід використовувати з великою обережністю
лакостенікодер

6
git clean -f

видалить неактивні файли з поточного git

git clean -fd

коли ви хочете видалити каталоги та файли, це видалить лише невиправлені каталоги та файли


5

о-мі-zsh з zsh надає ці великі псевдоніми через плагін git. Їх можна використовувати і в басі.

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

  • gclean видаляє каталоги, що не відслідковуються, на додаток до файлів, що не відслідковуються .
  • gpristineважко скинути локальні зміни, видалити незатребувані каталоги, відслідковувані файли та не використовувати стандартні правила ігнорування, прочитані з .gitignore (за каталогом) та $ GIT_DIR / info / виключити, але все ж використовувати правила ігнорування, надані з параметрами -e. Це дозволяє видалити всі незафіксовані файли, включаючи збірку продуктів. Це можна використовувати (можливо, спільно із скиданням git) для створення незайманого робочого каталогу для перевірки чистої збірки .

2
Дякую за відгуки, моя заява була заплутаною. Я хотів сказати, що виділені псевдоніми надходять автоматично з о-мі-зш. Вони, очевидно, чудово працюють в bash. Я відредагував свою відповідь, щоб це відобразити.
ZenLulz

4

Мені подобається використовувати git stashкоманду, пізніше ви можете отримати сховані файли та зміни. git cleanтакож є хорошим варіантом, але повністю залежить від ваших вимог. Ось пояснення щодо того, як зберігати git та git clean, 7.3 Git Tools - Stashing and Cleaning

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.