Удалите каталог из удаленного репозитория после добавления их в .gitignore

Я совершил и переместил некоторую директорию в github. После этого я изменил файл .gitignore, добавив каталог, который следует игнорировать. Все работает нормально, но каталог (теперь игнорируется) остается на github.

Как удалить этот каталог из github и истории хранилища?

Ответ 1

Правила в вашем файле .gitignore применяются только к файлам без следа. Поскольку файлы в этом каталоге уже были зафиксированы в вашем репозитории, вы должны их отключить, создать фиксацию и нажать на GitHub:

git rm -r --cached some-directory
git commit -m 'Remove the now ignored directory "some-directory"'
git push origin master

Вы не можете удалить файл из своей истории, не переписывая историю своего репозитория - вы не должны этого делать, если кто-то еще работает с вашим репозиторием или вы используете его с нескольких компьютеров. Если вы все еще хотите это сделать, вы можете использовать git filter-branch для перезаписи истории - есть полезное руководство к этому здесь.

Кроме того, обратите внимание, что вывод из git rm -r --cached some-directory будет выглядеть примерно так:

rm 'some-directory/product/cache/1/small_image/130x130/small_image.jpg'
rm 'some-directory/product/cache/1/small_image/135x/small_image.jpg'
rm 'some-directory/.htaccess'
rm 'some-directory/logo.jpg'

rm представляет собой обратную связь от git о репозитории; файлы все еще находятся в рабочем каталоге.

Ответ 2

Я делаю это:

git rm --cached `git ls-files -i --exclude-from=.gitignore` 
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

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


Это, кажется, перестало работать для меня, теперь я делаю:

 git rm -r --cached . 
 git add .
 git commit -m 'Removed all files that are in the .gitignore' 
 git push origin master

Ответ 3

В соответствии с моим ответом здесь: Как удалить каталог из репозитория git?

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


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

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

Шаги, чтобы игнорировать эту папку в следующих коммандах

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

.gitignore файл будет выглядеть следующим образом

/FolderName

remove directory

Ответ 4

Первый ответ Бланделла не помог мне. Однако он показал мне правильный путь. Я сделал то же самое вот так:

> for i in `git ls-files -i --exclude-from=.gitignore`; do git rm --cached $i; done
> git commit -m 'Removed all files that are in the .gitignore'
> git push origin master

Я советую вам сначала проверить файлы, которые нужно удалить, выполнив приведенный ниже оператор:

git ls-files -i --exclude-from=.gitignore

Я использовал файл .gitignore по умолчанию для визуальной студии, и я заметил, что он удаляет все папки журнала и bin в проекте, который не был моим предполагаемым действием.

Ответ 5

Ответ от Бланделла должен сработать, но по какой-то причудливой причине это не касается меня. Я должен был сначала передать имена файлов, выведенные первой командой, в файл, а затем перебрать этот файл и удалить этот файл один за другим.

git ls-files -i --exclude-from=.gitignore > to_remove.txt
while read line; do 'git rm -r --cached "$line"'; done < to_remove.txt
rm to_remove.txt
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

Ответ 6

Примечание. Это решение работает только с графическим интерфейсом Github Desktop.

Используя Github Desktop GUI, это очень просто.

  • Временно переместите папку на другое место (из папки проекта).

  • Отредактируйте файл .gitignore и удалите запись папки, которая будет удалять главный репозиторий на странице github.

  • Зафиксировать и синхронизировать папку проекта.

  • Переместите папку в папку проекта

  • Заново отредактируйте файл .gitignore.

Что все.

Ответ 7

  Этот метод применяет стандартное поведение .gitignore, и не требует ручного указания файлов, которые необходимо игнорировать.

Can't use --exclude-from=.gitignore anymore : / - Here the updated method:

Общий совет: начните с чистого репо - все зафиксировано, ничего не ожидает в рабочем каталоге или индексе, и сделайте резервную копию!

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *

#commit again
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.

git commit -m "re-applied modified .gitignore"

#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

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

Ответ 8

Если вы работаете с PowerShell, попробуйте выполнить следующую команду:

PS MyRepo> git filter-branch --force --index-filter
>> "git rm --cached --ignore-unmatch -r .\\\path\\\to\\\directory"
>> --prune-empty --tag-name-filter cat -- --all

Тогда git push --force --all.

Документация: https://git-scm.com/docs/git-filter-branch