Удалить папку из git tracking


405

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

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

и после этого я добавил путь к .gitignore

/wordpress/wp-content/uploads

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

Что я делаю неправильно?

Я также пытался

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

но это, кажется, отследить только файлы. Но мне нужно удалить из отслеживания целую папку (включая подпапки).


Удаление не означает, что git собирается удалить ваши файлы. Однако, если вы будете использовать reset --hard, это будет.
keltar

2
Как упоминает @keltar, фиксация не приведет к удалению ваших файлов. Он сохранит их удаление из Git , но ваша рабочая копия все равно будет содержать их. Но если вы делаете pullчто-то еще, эти файлы будут удалены из новой системы.
Крис

Ответы:


870

Я сталкивался с этим вопросом во время поиска в Google "git remove folder from tracking". Вопрос ОП привел меня к ответу. Я резюмирую это здесь для будущих поколений.

Вопрос

Как удалить папку из моего репозитория git, не удаляя ее с моего локального компьютера (т.е. среды разработки)?

Ответ

Шаг 1. Добавьте путь к папке в корневой .gitignoreфайл репо .

path_to_your_folder/

Шаг 2. Удалите папку из локального git-трекинга, но сохраните ее на своем диске.

git rm -r --cached path_to_your_folder/

Шаг 3. Вставьте ваши изменения в ваш репозиторий Git.

Папка будет считаться «удаленной» с точки зрения Git (то есть они находятся в прошлой истории, но не в последнем коммите, а люди, извлекающие из этого репо, удалят файлы из своих деревьев), но остаются в вашем рабочем каталоге потому что ты использовал --cached.


2
Быстрый вопрос, должен ли путь к папке быть полным путем? или просто путь с репозиторием git в качестве базы?
HMSCelestia

Я считаю, что это полный путь, но не помню точно.
Тод Бердсолл

7
"и люди, извлекающие из этого репо, удалят файлы из своих деревьев" Могу ли я предотвратить это?
Лев Гаспаррини

это правильно удалило мои файлы из отслеживания на ветке, но удалило их после слияния!
Гарольд

1
для меня все еще остается. Кроме того - я должен отменить выбор тех файлов при фиксации, которые находятся в папке? Я пробовал оба пути. Если отменить выбор, он не позволяет нажать, но тогда я изменил один символ в другом файле, который должен быть отслежен. Все равно не помогает
Дариус.В

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, но именно так я решил проблему.


Спасибо!!! Git сводил меня с ума, не игнорируя папку .metadata затмения. Выполните ваши действия с папкой eclipse .metadata, и она наконец заработала.
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.