Remover arquivo grande de várias confirmações atrás (em git)

6

Eu havia feito várias confirmações locais na minha base de código e tentei enviá-la para meu repositório, mas havia muitos arquivos grandes. Eu meio que desisti e continuei trabalhando, fazendo confirmações locais. Eu apaguei os arquivos grandes agora e confirmei novamente, mas ele ainda está tentando enviar os arquivos grandes originais. Tentei adicionar um gitignore depois que eu os comprometi originalmente a ignorar qualquer arquivo acima de 50mb, sem sucesso.

Alguma ideia?

Gentatsu
fonte

Respostas:

11

Leia aqui sobre filtro-filial.

Alguém acidentalmente confirma um enorme arquivo binário com um git add impensado. E você deseja removê-lo em qualquer lugar. Talvez você tenha comprometido acidentalmente um arquivo que continha uma senha e queira tornar seu projeto de código aberto. filter-branch é a ferramenta que você provavelmente deseja usar para limpar todo o seu histórico. Para remover um arquivo chamado passwords.txt de todo o seu histórico, você pode usar a opção --tree-filter para filtrar a ramificação:

$ git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
Rewrite 6b9b3cf04e7c5686a9cb838c3f36a8cb6a0fc2bd (21/21)
Ref 'refs/heads/master' was rewritten

Você também pode fazer uma nova análise interativa em sua ramificação no ponto em que você confirmou esses arquivos e removê-los dessa confirmação. O link acima também explica isso, mas basicamente:

git rebase -i HEAD~X

permitirá que você edite os últimos X confirmados.

ladorm
fonte
No entanto, tenho muitos arquivos grandes e parece que levaria um tempo assim.
Gentatsu 22/03
Eu acho que você quer dizer com ramo de filtro por causa dos vários arquivos. Você não pode usar um regex para obter todos eles? Então, talvez a segunda opção (rebasing) é mais fácil porque você pode ir para que cometem e excluir os arquivos do sistema da mesma forma que os eliminou alrerady
ladorm
Não teria efeito nos meus arquivos atuais? Eles não seriam trocados também, ou eu teria que mesclá-los?
Gentatsu 22/03
Se você não tocar em seus arquivos, eles não serão alterados. A rebase leva seus arquivos de volta ao histórico até o ponto desse commit e começa a reaplicar seus commit. Ele para no commit que você marcou para edição. Nessa confirmação, você deve remover esses arquivos e, em seguida, confirmar com 'git commit --ammend' (está no link que eu lhe dei). Isso modifica a sua confirmação e, em seguida, retomar o rebase e começa a aplicar o resto de seus commits
ladorm
Esqueceu sobre isso! Fiz uma reformulação e apenas esmaguei todos os meus commits, que incluíam o novo arquivo ignorar, e isso funcionou.
Gentatsu