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


1236

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


1
Есть ли файлы в каталогах?
Фред Фу

3
@Iarsmans: да, 6 файлов. Оба каталога идентичны, за исключением одного в верхнем регистре, другого в нижнем регистре.
Сахат Ялкабов

Ответы:


2328

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

Вы можете оформить «мастер» с обоими каталогами;

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

8
У меня была точно такая же ситуация. Когда я пытался git rm -r myFolderэто работает, но также удалил все из каталога «MyFolder». Пришлось вернуть все в папку «MyFolder», а затем зафиксировать.
Джастин

240
@Justin Чтобы удалить только из git и оставить файловую систему как есть, используйтеgit rm -r --cached myFolder
karmakaze

32
Я получаю сообщение об ошибке: fatal: pathspec 'directory' не соответствует ни одному файлу.
user2441441

3
@ user2441441 У меня была эта ошибка, когда я пытался удалить папку / файл, который вообще не был добавлен в
репозиторий

3
git rm -r --cached directory/только удаляет из git отслеживается, но структура хранилища остается.
Нестор

287

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


Шаги по удалению каталога

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

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

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

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

/FolderName

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


1
Вам также нужно будет выполнить команду git rm -r --cached FolderName git commit -m «Удаленная папка из хранилища» на другом компьютере, а затем выполнить синхронизацию.
Саймон

1
Будет ли это удалять каталог с того места, где он был добавлен в хранилище до сих пор? Или это просто удалить каталог и отправить его в репозиторий .git?
alpha_989

1
Большой! За работой!
BeingCoders

2
Хорошо объяснил, хороший ответ
Ракшит Шах

1
отлично сработано. На моей машине третий шаг не работает. Но это работает, если его изменить на $ git push
Hong

82

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


4
Это сработало для меня. Не могли бы вы объяснить аргумент -A?
Арун

2
@Arun -A - сокращение от --all и добавляет изменения из всех отслеживаемых и неотслеживаемых файлов
Joachim Rohde

Это сработало для меня.
UVM

20

Вы можете попробовать это: git rm -rf <directory_name>

Это заставит удалить каталог.


3
это также удалит из локального каталога
abdul rehman kk

18

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

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

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

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

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

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

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


9

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

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

Добавить папку в .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, но не была удалена с локального диска.


7

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

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

rm -r folderName

Нет необходимости привлекать Git.


1
Спасибо! Это как раз то, что мне было нужно.
SpyrosKo

6

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

После удаления каталога зафиксируйте изменения: git commit -m "Your Commit Message"

Затем просто отправьте изменения в удаленный каталог GIT: git push origin < Branch name >


4

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

git rm -r folder_name
git commit -m "your commit"
git push origin master

4

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

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

master может быть заменен на любую другую ветку хранилища.


2

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


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

1

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


1

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

mkdir <YOUR-DIRECTORY>

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

git status

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

touch /YOUR-directory/.keep

Теперь, если вы нажмете git statusGit, вы будете в курсе изменений.

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

rm -r <YOUR-DIRECTORY>

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


0

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

  1. мерзавец
  2. git config user.name "кто-то"
  3. git config user.email "somebody@someplace.com"
  4. git rm -r
  5. git commit -m "удаление каталога"
  6. мастер происхождения git push

0

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

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.