Remova o diretório do repository remoto depois de adicioná-los ao .gitignore

Eu cometi e empurrei alguns diretórios para o github. Depois disso, alterei o arquivo .gitignore adicionando um diretório que deveria ser ignorado. Tudo funciona bem, mas o diretório (agora ignorado) fica no github.

Como excluo esse diretório do github e do histórico do repository?

As regras em seu arquivo .gitignore aplicam-se apenas a arquivos não acompanhados. Como os arquivos sob esse diretório já foram confirmados no seu repository, você precisa desassociá-los, criar um commit e enviá-lo para o GitHub:

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

Você não pode excluir o arquivo do seu histórico sem rewrite o histórico do seu repository – você não deve fazer isso se alguém estiver trabalhando com o seu repository, ou se você estiver usando de vários computadores. Se você ainda quiser fazer isso, você pode usar git filter-branch para rewrite o histórico – há um guia útil para isso aqui .

Adicionalmente, note que a saída do git rm -r --cached some-directory será algo como:

 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' 

O rm é o feedback do git sobre o repository; os arquivos ainda estão no diretório de trabalho.

Eu faço isso:

 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 

O que irá remover todos os arquivos / pastas que estão no seu git ignorar, poupando você tem que escolher cada um manualmente


Isso parece ter parado de funcionar para mim, eu agora faço:

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

Como por minha resposta aqui: Como remover um diretório do repository git?

Para remover pasta / diretório apenas do repository git e não do local tente 3 passos simples.


Etapas para remover o diretório

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

Passos para ignorar essa pasta nos próximos commits

Para ignorar essa pasta das próximas confirmações, crie um arquivo na raiz chamado .gitignore e coloque o nome dessas pastas nele. Você pode colocar quantos quiser

arquivo .gitignore será semelhante a este

 /FolderName 

remover diretório

A resposta de Blundell deveria funcionar, mas por alguma razão bizarra isso não aconteceu comigo. Eu tive que pipe primeiro os nomes de arquivos gerados pelo primeiro comando em um arquivo e, em seguida, percorrer esse arquivo e excluir esse arquivo um por um.

 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 

A primeira resposta de Blundell não funcionou para mim. No entanto, mostrou-me o caminho certo. Eu fiz a mesma coisa assim:

 > 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 

Eu aconselho você a verificar os arquivos a serem apagados primeiro, executando a seguinte declaração:

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

Eu estava usando um arquivo .gitignore padrão para o visual studio e notei que estava removendo todas as pastas de log e bin no projeto que não era a minha ação pretendida.

Nota: Esta solução funciona apenas com a GUI do Github Desktop .

Usando o Github Desktop GUI é muito simples.

  1. Mova a pasta para outro local (para fora da pasta do projeto) temporariamente.

  2. Edite seu arquivo .gitignore e remova a input da pasta que será removida do repository principal na página do github.

  3. Confirme e sincronize a pasta do projeto.

  4. Volte a mover a pasta para a pasta do projeto

  5. Edite .gitignore arquivo .gitignore .

Isso é tudo.

Se você estiver trabalhando no PowerShell, tente o seguinte como um único comando.

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

Então, git push --force --all .

Documentação: https://git-scm.com/docs/git-filter-branch