Ignorando o conteúdo de um diretório já com check-in?

227

Eu tenho um repositório git que é usado apenas para armazenar arquivos de som e gráficos usados ​​em vários projetos. Eles estão todos em um diretório sem subdiretórios. Agora, acabei de criar um script para copiar esses ativos de outro diretório estruturado, com vários níveis de subdiretórios.

Agora, só quero que a estrutura hierárquica do arquivo (origem) seja rastreada pelo git, e o diretório simples (destino) (com todos os arquivos em uma pilha) deve ser ignorado.

Adicionei o diretório de destino ao .gitignore, mas o git ainda está rastreando alterações nele. Eu pensei que se eu confirmar a exclusão do arquivo antigo no diretório de destino, o git pode parar de rastrear o novo conteúdo (copiado pelo script), mas não o faz.

Como faço para o git esquecer o diretório de destino?

Felixyz
fonte
Qual é o nome do diretório eo que você colocar em .gitignore
mmmmmm
1
O nome é DirNameIrrelevant e em .gitignore Eu tentei colocar "DirNameIrrelevant", "DirNameIrrelevant /" e "DirNameIrrelevant / *"
Felixyz

Respostas:

524

Este comando fará com que o git rastreie seu diretório e todos os arquivos nele sem excluí-los:

git rm -r --cached <your directory>

A -ropção causa a remoção de todos os arquivos no seu diretório.

A --cachedopção faz com que os arquivos sejam removidos apenas do índice do git, não da sua cópia de trabalho. Por padrão git rm <file>, excluiria <file>.

Gordon Wilson
fonte
Ah obrigada. Muito útil, embora não perceba por que isso seja necessário (por que não basta adicionar o diretório no .gitignore?). Você poderia me dizer para que serve o --cached?
Felixyz 25/08/09
certo. Alterei minha resposta para descrever as duas opções.
Gordon Wilson
Quanto ao porquê disso ser necessário, só posso especular. Eu acho que os criadores queriam que o rastreamento de arquivos fosse explícito, a fim de diminuir os riscos de rastrear por engano partes importantes do seu projeto. Eu imagino que também há razões técnicas.
Gordon Wilson
15
O gitignore é usado para determinar quais arquivos não rastreados o git estará ciente; não tem influência nos arquivos que já estão sendo rastreados. Se o usuário quiser rastrear arquivos ignorados, o git permite. Isso pode ser feito usando add -fou seja a sua situação. Como Gordon disse, isso evita que você acidentalmente elimine vários arquivos - o repositório é a lista principal, não o gitignore. Isso também permite que você rastreie manualmente algumas coisas que seriam ignoradas por uma regra curinga, algo que eu achei útil.
Cascabel
a -ropção não é "causar a remoção de todos os arquivos no seu diretório", mas sim recursar pelos subdiretórios.
MRE
78

Se você precisa ter um arquivo rastreado (com check-in), mas não deseja rastrear outras alterações de um arquivo enquanto o mantém no repositório local e no repositório remoto, isso pode ser feito com:

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

Depois disso, qualquer alteração nesse arquivo não será mais exibida git status.

jone
fonte
1
Embora o OP tenha solicitado um diretório, é exatamente isso que eu estava procurando - ignorando outras alterações em um único arquivo com check-in; obrigado!
Sdaau # 13/14
1
para ignorar um diretório, use 'git update-index --assume-inalterado dirName / *'. Levei algum tempo para encontrar a sintaxe, '*' é necessário aqui
J-Dizzle
1
Como alguém reverteria isso?
Rhys
3
@Rhys para inverter:git update-index --no-assume-unchanged dirname/**/*
JobJob 25/17
3

Para um subdiretório chamado blah/adicionado ao git, os seguintes itens parecem funcionar para ignorar novos arquivos no blah/. Adicionado ao .gitignore:

blah 
blah/*
Stef
fonte
1

TL; DR para limpar seu repositório git e garantir que TODOS os seus itens ignorados sejam realmente ignorados:

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

Nota: você não precisa especificar um diretório, assim você está limpando todo o repositório remoto .

Para ir além, leia isto

Ced
fonte
0

Não tenho certeza se isso conta ou me faz uma pessoa ruim, mas aqui vai.

  1. Eu adicionei *Generated*ao arquivo .gitignore raiz
  2. Enviei os arquivos que desejo manter como GeneratedFile.Whatever.ext. CheckedIn
  3. Eu fiz um gancho git no pós-checkout para chamar um script do PowerShell fazendo o seguinte:

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

Eu me sinto um pouco mal comigo mesma ... mas de fato funciona.

Steve
fonte
-2

Ok, parece que você deve primeiro fazer um check-in com o diretório completamente vazio (nem os arquivos antigos nem os novos), e os arquivos adicionados posteriormente serão ignorados. Se você remover os arquivos antigos adicionar e novos antes de confirmar, os novos serão adicionados ao repositório, embora devam ser ignorados.

Pelo menos, isso funcionou para mim nessa situação. Ainda seria ótimo se alguém pudesse fornecer mais informações sobre o que está acontecendo.

Felixyz
fonte
1
Versão curta do que dissemos em outro lugar - o gitignore afeta quais dados não rastreados o git estará ciente. Isso não afeta o que será feito com os dados sobre os quais você falou (por exemplo, instruiu-o a adicionar ao repositório).
Cascabel
Portanto, faz sentido que os arquivos rastreados e agora excluídos sejam rastreados como tal, mas ainda não faz sentido para mim que os arquivos adicionados (se feitos antes da próxima confirmação) sejam rastreados, enquanto que se eu 1) ignorar, 2) excluir arquivos, 3) confirmar, 4) adicionar novo arquivo, os novos arquivos não são rastreados.
Felixyz 25/08/2009