Как удалить каталог из репозитория git?

У меня есть 2 каталога в моем репозитории GitHub. Я хочу удалить одно из них. Как я мог сделать это, не удаляя и не создавая заново весь репозиторий?


person Sahat Yalkabov    schedule 10.06.2011    source источник
comment
В каталогах есть файлы?   -  person Fred Foo    schedule 11.06.2011
comment
@Iarsmans: Да, 6 файлов. Оба каталога идентичны, за исключением того, что один в верхнем регистре, а другой в нижнем.   -  person Sahat Yalkabov    schedule 11.06.2011
comment
Вам нужно только: git rm -r --cached folder_name   -  person Vadim    schedule 31.08.2020


Ответы (16)


Удалить каталог из git и локального

Вы можете проверить "master" с обоими каталогами;

git rm -r one-of-the-directories // This deletes from filesystem
git commit . -m "Remove duplicated directory"
git push origin <your-git-branch> (typically 'master', but not always)

Удалить каталог из git, но НЕ локальный

Как упоминалось в комментариях, вы обычно хотите удалить этот каталог из git, но не удалять его полностью из файловой системы (локально)

В этом случае используйте:

git rm -r --cached myFolder
person karmakaze    schedule 11.06.2011
comment
У меня была такая же ситуация. Когда я попробовал git rm -r myFolder, он работал, но также удалил все из каталога MyFolder. Пришлось вернуть все в каталоге MyFolder, а затем зафиксировать. - person Justin; 25.10.2012
comment
@Justin Чтобы удалить только из git и оставить файловую систему как есть, используйте git rm -r --cached myFolder - person karmakaze; 16.11.2012
comment
как его удалить из github в Интернете? - person a coder; 04.04.2016
comment
@acoder не знает прямого веб-пути, может быть API, иначе клонируйте репозиторий git rm -r myFolder и нажмите - person karmakaze; 05.04.2016
comment
разобрался, нажмите на мусорную корзину - person a coder; 05.04.2016
comment
Имейте в виду, что если вы работаете с другим совместно используемым репо, несмотря на то, что вы запускаете версию --cached, они удалят эту папку из своей локальной копии в тот момент, когда они извлекут новые изменения. См. Это объяснение об этом gist.github.com/scy/6636390 - person Leonardo Brambilla; 29.04.2016
comment
И используйте git rm -r --cached *, чтобы удалить все - person H A; 11.06.2016
comment
как можно выбрать из ветки ведьмы? - person Mahdi; 21.06.2016
comment
git rm -r --cached myFolder произведет удаление в текущей ветке, которую затем все еще нужно зафиксировать и нажать. - person karmakaze; 22.06.2016
comment
@karmakaze fatal: pathspec 'myFolder' не соответствует ни одному файлу, но я могу увидеть 'myFolder' в репозитории с помощью команды 'git ls-tree --full-tree -r HEAD'. - person Dr.jacky; 11.07.2016
comment
Я получаю следующее сообщение об ошибке: fatal: pathspec 'directory' не соответствует ни одному файлу. - person user2441441; 09.09.2016
comment
@ user2441441 У меня эта ошибка выскакивала, когда я пытался удалить папку / файл, который вообще не был добавлен в репо - person lukeatdesignworks; 13.10.2016
comment
@lukeatdesignworks У меня была такая же ошибка. По-видимому, удаление всех файлов из каталога удалило сам каталог из-под контроля версий, поэтому попытка удалить этот каталог дала фатальную: pathspec 'directory' не соответствует ни одной ошибке файлов. - person esdot; 05.01.2017
comment
.gitignore не действует, когда я добавляю исключения после запуска git rm -r --cached to_be_excluded_dir. Все снова добавлено. - person codezombie; 04.02.2018
comment
git rm -r --cached directory/only удаляется из git tracked, но структура репозитория остается. - person Néstor; 29.08.2018
comment
Я думаю, что ответ очень хороший, однако было бы более интуитивно понятно, если бы вы сначала упомянули, как удалить только из git. В итоге я удалил свою папку, потому что думал, что вопрос ясен, что это касается только git - person dieHellste; 23.10.2019
comment
Это мне очень помогло, отличный ответ! - person Kumar Abhinav; 18.12.2019
comment
fatal: pathspec 'web/assets/2d40d8f2/' did not match any files будет брошен, когда вы используете git rm --cached web/assets/2d40d8f2/ - person Muhammad Omer Aslam; 30.03.2020
comment
Что означает . в git commit . -m "Remove duplicated directory"? - person vineeshvs; 20.04.2020
comment
. (также известный как точка / точка) обозначает текущий каталог. Я считаю, что это работает на всех платформах (но я менее уверен в версиях Windows). - person karmakaze; 23.04.2020
comment
@lukeatdesignworks. Вы получите эту ошибку, если каталог также будет пуст. Потому что по умолчанию git игнорирует пустые каталоги. - person Faizi; 27.12.2020

Чтобы удалить папку / каталог только из репозитория git, а не из локального, попробуйте 3 простые команды.


Действия по удалению каталога

git rm -r --cached FolderName
git commit -m "Removed folder from repository"
git push origin master

Действия по игнорированию этой папки при следующих фиксациях

Чтобы игнорировать эту папку из следующих коммитов, создайте один файл в корневой папке (основной каталог проекта, в котором инициализирован git) с именем .gitignore и поместите в него имя этой папки. Вы можете игнорировать столько файлов / папок, сколько хотите

Файл .gitignore будет выглядеть так

/FolderName

удалить каталог

person Suresh Karia    schedule 03.12.2014
comment
Вам также потребуется выполнить команду git rm -r --cached FolderName git commit -m Удаленная папка из репозитория на другом компьютере, а затем выполнить извлечение, чтобы синхронизировать ее. - person Simon; 06.10.2015
comment
Удалит ли это каталог с того места, где он был добавлен в репозиторий до сих пор? Или просто удалить каталог и повторно передать его в репозиторий .git? - person alpha_989; 21.01.2018
comment
Почему бы просто не сделать rm -rf FolderName; git add -A; git commit -m 'removed FolderName? - person alpha_989; 21.01.2018
comment
@Matt West Рад, что это помогло - person Suresh Karia; 02.08.2018
comment
Большой! Работающий! - person ; 20.11.2018
comment
Хорошо объяснено, хороший ответ - person Rakshit Shah; 25.11.2018
comment
отличная работа. На моей машине третий шаг не работает. Но он работает, если его изменить на $ git push - person Hong; 01.08.2019
comment
Мне не повезло: robdavisprojects @ Robs-MacBook-Air default% ls default.services.yml drushrc.php settings.ddev.php default.settings.php files settings.php robdavisprojects @ Robs-MacBook-Air default% git rm -r - -cached files fatal: pathspec 'files' не соответствует ни одному файлу robdavisprojects @ Robs-MacBook-Air по умолчанию% - person therobyouknow; 15.12.2019
comment
Ответьте мне: файлы папок не контролировались git, так что все в порядке. Я могу просто файлы rmdir или файлы rm -Rf - person therobyouknow; 15.12.2019

Если по какой-то причине то, что сказал кармаказе, не работает, вы можете попробовать удалить каталог, который хотите использовать, или с помощью браузера файловой системы (например, в проводнике Windows). После удаления каталога введите команду:
git add -A
, затем
git commit -m 'deleting directory'
, а затем
git push origin master.

person cmcculloh    schedule 11.06.2011
comment
Это сработало для меня. Не могли бы вы объяснить аргумент -A? - person Arun; 15.10.2018
comment
@Arun -A является сокращением от --all и добавляет изменения из всех отслеживаемых и неотслеживаемых файлов - person Joachim Rohde; 03.04.2019

Вы можете попробовать следующее: git rm -rf <directory_name>

Это принудительно удалит каталог.

person Breen ho    schedule 23.10.2013
comment
это также удалит из локального каталога - person Abdul Rehman Kaim Khani; 24.03.2019

Если вы удалите файлы в каталоге (с git rm, как объясняют другие ответы), тогда каталог больше не существует, что касается git. Вы не можете зафиксировать пустой каталог или удалить его.

Это не похоже на Subversion, где вы должны явно svn rm emptyfolder/, и, кстати, именно поэтому страница man для git описывает себя как «тупой трекер контента»

Ответ на "Как добавить пустой каталог в репозиторий git " ссылки на часто задаваемые вопросы по этой теме:

В настоящее время конструкция индекса git (промежуточная область) позволяет перечислять только файлы, и никто, достаточно компетентный, чтобы внести изменения, разрешающие пустые каталоги, не позаботился об этой ситуации, чтобы исправить ее.

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

Вы можете сказать "git add <dir>", и он добавит туда файлы.

Если вам действительно нужен каталог для оформления заказа, вы должны создать в нем файл. .gitignore хорошо подходит для этой цели; вы можете оставить его пустым или ввести имена файлов, которые должны появиться в каталоге.

person dbr    schedule 06.08.2013

Я уже зафиксировал папку раньше и хочу удалить каталог из истории.

Я сделал следующее:

Добавить папку в .gitignore:

echo Folder_Name/ >> .gitignore

Удалить из всех коммитов:

git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch Folder_Name/' --prune-empty --tag-name-filter cat -- --all

удалите ссылки из старых коммитов:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

Убедитесь, что все старые ссылки полностью удалены

rm -Rf .git/logs .git/refs/original

Выполните сборку мусора

git gc --prune=all --aggressive

отправьте вам изменения в онлайн-репозиторий:

git push

Вы здесь закончили.

Но вы можете выполнить следующие действия, чтобы отправить все изменения во все ветки: Но будьте осторожны с этой командой!

git push origin --all --force
git push origin --tags --force

После этого папка была удалена из git, но не удалена с локального диска.

person Skyborg    schedule 14.05.2019

Перейдите в каталог git и введите следующую команду: rm -rf ‹Имя каталога>

После удаления каталога зафиксируйте изменения: git commit -m "Ваше сообщение о фиксации".

Затем просто нажмите изменения в удаленном каталоге GIT: git push origin ‹Имя ветки>

person anky    schedule 13.07.2016

для удаления пустых папок

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

rm -r folderName

Нет необходимости задействовать Git.

person Ridha Rezzag    schedule 19.12.2018
comment
Спасибо! Это как раз то, что мне было нужно. - person SpyrosKo; 09.06.2019

Вы можете удалить папку локально, а затем нажать, как показано ниже:

git rm -r folder_name
git commit -m "your commit"
git push origin master
person shrikant    schedule 26.02.2016

Обычно я использую git add --all для удаления файлов / папок из удаленных репозиториев

rm -r folder_name
git add --all
git commit -m "some comment"
git push origin master

master можно заменить любой другой веткой репозитория.

person ettanany    schedule 05.09.2016

Вы можете использовать Attlasian Source Tree (Windows) (https://www.atlassian.com/software/sourcetree/overview). Просто выберите файлы из дерева и нажмите кнопку «Удалить» вверху. Файлы будут удалены из локального репозитория и локальной базы данных git. Затем зафиксируйте, затем нажмите.

person Sergey Groshev    schedule 01.09.2015
comment
Я тоже этим занимаюсь. Тем не менее, это действительно упрощает изучение команд git. - person Micah Montoya; 26.03.2018

Один из моих коллег предложил BFG Repo-Cleaner, который я считаю мощным. Это не только удаление ненужных данных, но и очистка вашего репозитория от любой связанной с ним информации о фиксации.

person thanh.h.le    schedule 16.11.2016

Первая команда git должна знать, кто вы, прежде чем что-либо удалять

  1. git init
  2. git config user.name "кто-то"
  3. git config user.email "кто-то@someplace.com"
  4. git rm -r
  5. git commit -m "удаление каталога"
  6. git push origin master
person Zeus    schedule 06.07.2017

Чтобы добавить новый каталог:

mkdir <YOUR-DIRECTORY>

Но теперь Git не знает об этом новом каталоге, потому что Git отслеживает файлы, а не каталоги DIRECTORY

git status

Git не узнает о внесенных нами изменениях, поэтому мы добавляем скрытый .keep файл, чтобы Git узнал об этом новом изменении.

touch /YOUR-directory/.keep

Теперь, если вы нажмете git status, Git узнает об изменениях.

И если вы хотите удалить каталог, вы должны использовать эту команду.

rm -r <YOUR-DIRECTORY>

И если вы отметили с помощью git status, вы увидите, что каталог был удален.

person Abo3atef    schedule 22.10.2017

Комбинация двух ответов сработала для меня

git rm -r one-of-the-directories
git commit . -m "Remove duplicated directory"
git push

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

git filter-branch --tree-filter 'rm -rf path/to/your/file' HEAD
git push
person user3821178    schedule 31.12.2019

попробуйте rm -r -f <folder name> или rm -r --force <folder name> - принудительно удалить папку

person Arshad    schedule 08.02.2021