Aplique .gitignore em um repositório existente já acompanhando um grande número de arquivos

314

Eu tenho um projeto do Visual Studio existente no meu repositório. Recentemente, adicionei um arquivo .gitignore ao meu projeto e suponho que ele diga ao Git para ignorar os arquivos listados no arquivo.

Meu problema é que todos esses arquivos já estão sendo rastreados e, até onde eu sei, o Git não ignorará um arquivo que já foi rastreado antes de uma regra ser adicionada a esse arquivo para ignorá-lo.

Foi sugerido o uso: git rm --cachede desmarcá-los manualmente, mas isso levará uma eternidade para examiná-los um por um.

Pensei em excluir o repositório e recriá-lo novamente, mas desta vez com o arquivo .gitignore presente, mas deve haver uma maneira melhor de fazer isso.

Esconder
fonte
1
você pode git rm --cacheddiretórios inteiros com a -ropção, se isso for útil
Nathan Wallace
Veja também: Como rastrear arquivos do Git
Patrick James McDougle

Respostas:

870

Esta resposta resolveu meu problema:

Primeiro, confirme todas as alterações pendentes.

Em seguida, execute este comando:

git rm -r --cached .

Isso remove tudo do índice e, em seguida, basta executar:

git add .

Comprometa-o:

git commit -m ".gitignore is now working"
Esconder
fonte
9
Resposta perfeita! Por favor, adicione a git push origintambém para refletir as alterações no repositório remoto.
Sanket Berde
8
Comecei a usar esta resposta ... e ela excluiu quase tudo no meu projeto! Obviamente eu estava fazendo algo errado. Mas quero alertar as pessoas a não seguirem essa sugestão casualmente.
Mark Olbert
4
Será que isso acabar perdendo a história para os arquivos quando você remover e re-adicioná-los
Aran Mulholland
10
Gostaria de saber quantos commits existem usando esta .gitignore is now workingmensagem. :)
ihavenoidea
1
Este método funcionou bem para mim. Criei um arquivo gitignore, ignorei um diretório inteiro e, em seguida, confirmei essa alteração na criação do gitignore. Segui esses três comandos acima exatamente como eles disseram. Funcionou perfeitamente, mas devo dizer que você deve "confirmar todas as alterações pendentes" primeiro, como indicado acima.
Erich Meissner
61
  1. Crie um arquivo .gitignore, para fazer isso, basta criar qualquer arquivo .txt em branco.

  2. Em seguida, você deve alterar o nome, escrevendo a seguinte linha no cmd (onde git.txtestá o nome do arquivo que você acabou de criar):

    rename git.txt .gitignore

  3. Em seguida, você pode abrir o arquivo e gravar todos os arquivos não rastreados que deseja ignorar definitivamente. Por exemplo, o meu fica assim:

`` ``

OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

Existe toda uma coleção de arquivos .gitignore úteis do GitHub

  1. Depois de ter isso, você precisa adicioná-lo ao seu repositório git, como qualquer outro arquivo, mas ele deve estar na raiz do repositório.

  2. Então, no seu terminal, você deve escrever a seguinte linha:

    git config --global core.excludesfile ~ / .gitignore_global

Do documento oficial:

Você também pode criar um arquivo .gitignore global, que é uma lista de regras para ignorar arquivos em todos os repositórios Git no seu computador. Por exemplo, você pode criar o arquivo em ~ / .gitignore_global e adicionar algumas regras a ele.

Terminal aberto. Execute o seguinte comando no seu terminal: git config --global core.excludesfile ~ / .gitignore_global

Se o repositório já existir, você deverá executar estes comandos:

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

Se a etapa 2 não funcionar, você deve escrever a rota do furo dos arquivos que deseja adicionar.

SomeAnonymousPerson
fonte
4
@Karen_Wiznia o "git config ... _global" cria um gitingore global para todos os repositórios Git no computador. O OP não queria fazer isso.
ivan7707
Gostaria de poder gostar disso mais de uma vez. Volto continuamente a esta pergunta buscando esse lembrete.
Antony D'Andrea
1
Deve ser "mv git.txt .gitignore" em vez de "renomear git.txt .gitignore".
Ahmad F
30

Conforme especificado aqui Você pode atualizar o índice:

git update-index --assume-unchanged /path/to/file

Ao fazer isso, os arquivos não aparecerão em git statusou git diff.

Para começar a rastrear os arquivos novamente, você pode executar:

git update-index --no-assume-unchanged /path/to/file
Patrick James McDougle
fonte
5
Essa é a melhor resposta - ela é focada apenas no arquivo único, o arquivo que você não deseja que seja rastreado pelo repositório. A resposta mais alta marcada também funcionará, mas faz muito mais do que simplesmente ignorar um arquivo do rastreamento pelo git.
Chris Mejka
1
Essa é boa. Mas e se puxarmos? Existem conflitos de mesclagem?
Pramod
@ pramod, ótima pergunta. Eu não tenho certeza. Experimente em um repositório de teste simplificado?
Patrick James McDougle
15

Se você adicionou .gitignoretarde demais, o git continuará rastreando os arquivos já confirmados, independentemente. Para corrigir isso, você sempre pode remover todas as instâncias em cache dos arquivos indesejados.

Primeiro, para verificar quais arquivos você realmente está rastreando, você pode executar:

git ls-tree --name-only --full-tree -r HEAD

Digamos que você encontrou arquivos indesejados em um diretório como cache/esse, é mais seguro segmentar esse diretório em vez de todos os seus arquivos.

Então, em vez de:

git rm -r --cached .

É mais seguro direcionar para o arquivo ou diretório indesejado:

git rm -r --cached cache/

Em seguida, prossiga para adicionar todas as alterações,

git add .

e comprometer ...

git commit -m ".gitignore is now working"

Referência: https://amyetheredge.com/code/13.html

Eli Nunez
fonte
Essa é a resposta melhor e mais limpa, se você deseja remover apenas alguns arquivos, não o repositório inteiro. Eu dou meus polegares para cima.
Apuig 13/05/19
2

Aqui está uma maneira de "rastrear" todos os arquivos que seriam ignorados no conjunto atual de padrões de exclusão:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

Isso deixa os arquivos no seu diretório de trabalho, mas os remove do índice.

O truque usado aqui é fornecer um arquivo de índice inexistente para o git ls-files, para que ele pense que não há arquivos rastreados. O código do shell acima solicita todos os arquivos que seriam ignorados se o índice estivesse vazio e os remove do índice real com git rm.

Após os arquivos serem "não rastreados", use o status git para verificar se nada de importante foi removido (se houver, ajuste seus padrões de exclusão e use git reset - path para restaurar a entrada de índice removida). Em seguida, faça um novo commit que deixe de fora o "grosseiro".

O "crud" ainda estará em qualquer commit antigo. Você pode usar o git filter-branch para produzir versões limpas dos commits antigos, se você realmente precisar de um histórico limpo (nb, usando git filter-branch irá "reescrever o histórico", portanto, isso não deve ser feito de ânimo leve se houver algum colaborador que tenha puxado qualquer um dos seus históricos confirma após a introdução do "crud").


fonte
soa como uma solução sólida :) Presumo que seja para shell Linux, certo? infelizmente eu sou um usuário Win7. De alguma forma eu posso fazer isso no Windows?
Tohid 29/10
0

Remova arquivos da área de preparação

git reset HEAD .

Adicione todas as alterações

git add .

Comprometa-o:

git commit -m ".gitignore is now working"
Mahdi Ben Selimene
fonte
-1

Eu acho que essa é uma maneira fácil de adicionar um arquivo .gitignore a um repositório existente.

Pré - requisito :

Você precisa de um navegador para acessar sua conta do github.

Passos

  1. Crie um novo arquivo no seu projeto (existente) necessário e nomeie-o .gitignore . Você receberá uma solicitação sugestiva para modelos .gitignore assim que nomear o arquivo como .gitignore . Use esses modelos ou gitignore.io para gerar o conteúdo do seu arquivo gitignore .
  2. Confirme as alterações.
  3. Agora clone este repositório.

Diverta-se!

Roshan Poudyal
fonte
-3

Use git clean
Obtenha ajuda para esta execução

git clean -h

Se você deseja ver o que aconteceria primeiro, certifique-se de passar a opção -n para uma execução a seco:

git clean -xn

Para remover o lixo com gitingnored

git clean -xdf

Cuidado: você pode estar ignorando arquivos de configuração locais como database.yml, que também seriam removidos. Use por sua conta e risco.

Então

git add .
git commit -m ".gitignore is now working"
git push
Nedudi
fonte