Видаліть папку з відстеження git


403

Мені потрібно виключити папку (завантаження імен) із відстеження. Я намагався бігти

git rm -r --cached wordpress/wp-content/uploads

і після цього я додав шлях до .gitignore

/wordpress/wp-content/uploads

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

Що я роблю неправильно?

Я також спробував

git update-index --assume-unchanged <file>

але це, здається, знімає лише файли. Але мені потрібно видалити цілу папку (включаючи підпапки) з відстеження.


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

2
Як зазначає @keltar, виконання файлів не призведе до видалення ваших файлів. Він здійснить їх видалення з Git , але ваша робоча копія все одно їх буде містити. Але якщо ви pullзробите десь інше, ці файли будуть видалені з нової системи.
Кріс

Відповіді:


866

Я зіткнувся з цим питанням під час Гуглінга за "папку видалення git з відстеження" Питання ОП привело мене до відповіді. Я резюмую це для наступних поколінь.

Питання

Як видалити папку зі свого сховища git, не видаляючи її з локальної машини (тобто середовища розробки)?

Відповідь

Крок 1. Додайте шлях до папки до кореневого .gitignoreфайлу репо .

path_to_your_folder/

Крок 2. Видаліть папку з локального відстеження git, але зберігайте її на диску.

git rm -r --cached path_to_your_folder/

Крок 3. Змініть свої зміни на git repo.

Папка вважатиметься "видаленою" з точки зору Git (тобто вони є в минулій історії, але не в останній комісії, і люди, які витягують з цього репо, отримають файли, видалені з дерев), але залишайтеся у вашому робочому каталозі тому що ти звик --cached.


2
Швидке запитання, чи повинен шлях до папки бути повним шляхом? чи просто шлях із сховищем git, що виступає базою?
HMSCelestia

Я вважаю, що це повний шлях, але не пам’ятаю точно.
Tod Birdsall

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

це правильно видалило мої файли від відстеження на гілці, але видалило їх після об'єднання!
Гарольд

1
для мене все ще залишається. Також - чи слід скасувати вибір тих файлів під час вибору, які знаходяться в папці? Я пробував обидва способи. Якщо відмінити вибір, це не дозволяє натиснути, але я змінив один char в інший файл, який слід відстежувати. Ще не допомагає
Дарій.V

44

Це працює для мене:

git rm -r --cached --ignore-unmatch folder_name

--ignore-unmatch Тут важливо, без цієї опції git вийде з помилкою у першому файлі, не в індексі.


unknown option 'ignore unmatched'
Ініго

Це важливий прапор, якщо каталог порожній, дякую!
МНН

дуже корисно, якщо ви хочете просто видалити певні розширення файлів із каталогу:git rm -r --cached --ignore-unmatch .idea/*.xml
takanuva15

14

Щоб забути каталог, рекурсивно додайте /*/*до шляху:

git update-index --assume-unchanged wordpress/wp-content/uploads/*/*

Використання git rm --cachedне добре для співпраці. Детальніше тут: Як зупинити відстеження та ігнорувати зміни до файлу в Git?


1
Це дуже елегантне рішення! рекурсивна хитрість шляху врятувала мені день. Дякую!
Азіз Альто

8

Я знаю, що це стара тема, але я просто хотів додати трохи, оскільки помічене рішення не вирішило для мене проблеми (хоча я намагався багато разів).

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

  1. Зробіть резервну копію локальної папки і поставте в безпечне місце.
  2. Видаліть папку з місцевого репо
  3. Переконайтеся, що кеш очищено git rm -r --cached your_folder/
  4. Додати your_folder/в .gitignore
  5. Внести зміни
  6. Додайте резервну копію назад у вашу репо

Тепер ви повинні побачити, що папка більше не відстежується.

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


Дякую!!! Гіт зводив мене з розуму, не ігноруючи папку .metadata затемнення. Виконуйте ваші дії з папкою .metadata eclipse, і вона нарешті спрацювала.
MasterN8

5

З документації по git:

Ще одна корисна річ, яку ви можете зробити - це зберегти файл у вашому робочому дереві, але видалити його з місця постановки. Іншими словами, ви можете зберегти файл на своєму жорсткому диску, але більше не матимете Git. Це особливо корисно, якщо ви забули додати щось у свій .gitignore файл і випадково його інсценізували, наприклад, великий файл журналу чи купу .a зібраних файлів. Для цього скористайтеся опцією --cached:

$ git rm --cached readme.txt

То, може, не включати "-r"?


1
ОП вже пробували --cached. -rВаріант для «рекурсивних», які повинні бути включені в даному випадку.
Кріс

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