.gitignore após confirmação

210

Eu tenho um repositório git hospedado no Github. Depois de cometer muitos arquivos, estou percebendo que eu preciso para criar .gitignoree excluir .exe, .objarquivos.

No entanto, ele removerá automaticamente esses arquivos confirmados do repositório? Existe alguma maneira de forçar isso?

Madhur Ahuja
fonte
6
Futuros googlers podem achar isso extremamente útil. Bem
Austin Dean

Respostas:

331

Não, você não pode forçar a remoção de um arquivo que já foi confirmado no repositório porque ele foi adicionado ao .gitignore

Você precisa git rm --cachedremover os arquivos que não deseja no repositório. (--cached porque você provavelmente deseja manter a cópia local, mas remover do repositório.) Portanto, se você deseja remover todos os exe's do repositório, faça

git rm --cached /\*.exe

(Observe que o asterisco * é citado no shell - isso permite que o git, e não o shell, expanda os nomes dos caminhos dos arquivos e subdiretórios)

manojlds
fonte
6
@ Madhur Ahuja Na verdade, se você fizer git rm /\*.exeisso, todos os exe serão excluídos em seu repo #
manojlds
4
Para que servem os \ \ 's?
Costa
5
@ Costa estão lá para escapar do asterisco, para impedir que o shell o interprete, como pretendido git.
Lambart
2
Aviso: os arquivos são mantidos em local, é verdade ... Mas outros usuários que executam a git pullverão seus arquivos excluídos.
ByScripts
42

No entanto, ele removerá automaticamente esses arquivos confirmados do repositório?

Não. Mesmo com um existente, .gitignorevocê pode preparar arquivos "ignorados" com o -fsinalizador (force). Se os arquivos já tiverem sido confirmados, eles não serão removidos automaticamente.

git rm --cached path/to/ignored.exe
KingCrunch
fonte
Isso significa que eu tenho remover individualmente cada .exe
Madhur Ahuja
Você é provavelmente capaz de lote isso, mas eu não sei como isso funciona no Windows
KingCrunch
30

Se você ainda não enviou as alterações:

git rm -r --cached .
git add .
git commit -m 'clear git cache'
git push
slal
fonte
15

Eu tive que remover .idea e pastas de destino e depois de ler todos os comentários, isso funcionou para mim:

git rm -r .idea
git rm -r target
git commit -m 'removed .idea folder'

e depois pressione para dominar

Emanuele
fonte
.ideafoi o meu problema, acho que também foi seu:)
Olivier Pons
5

No entanto, ele removerá automaticamente esses arquivos confirmados do repositório?

Não.

A 'melhor' receita para fazer isso é usar git filter-branchcomo está escrito aqui:

A página de manual do git-filter-branch contém exemplos abrangentes.

Nota Você reescreverá o histórico. Se você publicou alguma revisão contendo os arquivos adicionados acidentalmente, isso pode criar problemas para os usuários dessas ramificações públicas. Informe-os ou talvez pense sobre o quanto você precisa remover os arquivos.

Nota Na presença de tags, sempre use a --tag-name-filter catopção para git filter-branch. Isso nunca dói e vai lhe poupar a dor de cabeça quando você perceber mais tarde que precisava

ver
fonte
Executei este comando que mostrava Reescrever 57c1f1f04a3ed01f50c3260714cfc82c973ac816 (3/3) AVISO: Ref 'refs / heads / master' permanece inalterado e nada aconteceu #
Madhur Ahuja
É um aviso e provavelmente significa que a ramificação principal (ainda) não continha nenhuma revisão com os arquivos a serem removidos. Você pode facilmente verificar isso. Se houver algum problema, atualize a pergunta. PS: use - --allpara reescrever todas as ramificações (locais) de uma só vez
consulte
1

Mesmo depois de excluir o (s) arquivo (s) e depois confirmar, você ainda terá esses arquivos no histórico. Para excluí-los, considere usar o BFG Repo-Cleaner . É uma alternativa ao git-filter-branch.

Cinza
fonte