usando gitignore para ignorar (mas não excluir) arquivos

98

Eu tenho um diretório tmp em meu repo git que gostaria que ainda existisse, mas ser ignorado. Eu o adicionei .gitignore, mas git statusainda me informa sobre as alterações nos arquivos desse diretório. Tentei git rm -r --cached, mas isso o remove do repositório remoto. Como posso interromper o rastreamento de alterações neste diretório, mas ainda permitir que ele exista? Também preciso fazer isso para 1 arquivo, mas as alterações também aparecem git statusdepois de .gitignorecarregá-los. O que devo fazer?

21312312
fonte
1
escreva exatamente como é o seu arquivo .gitignore?
kdehairy

Respostas:

183

Em vez de .gitignore, você pode atualizar o repositório git local executando o seguinte comando:

git update-index --assume-unchanged <file>

Nesse caso, um arquivo está sendo rastreado no repositório de origem. Você pode modificá-lo em seu repositório local e o git nunca o marcará como alterado. Leia mais em:

Ducin
fonte
22
Meu amor por git pode ter apenas dobrado.
Mark Fox
2
Esta deve ser a resposta aceita. Obrigado por criar um link para isso.
Gowiem
4
Existe uma maneira de enviar isso para o repo remoto?
Brian Ortiz,
2
hmm, prefiro marcar um arquivo como "não é um arquivo git, nunca sincronize com o git, mesmo em outro repo de alguém"
fantastory
11
Você pode reverter com git update-index --no-assume-unchanged <file>. Se você quiser listá-los git ls-files -v | grep '^h'.
Sanghyun Lee de
12

Ignorar as alterações feitas nos arquivos ao permitir que existam é o objetivo exato de .gitignore. Portanto, adicionar os arquivos (ou diretórios) .gitignoreé a única coisa que você precisa fazer.

Mas o seu problema é que o git já está rastreando os arquivos que você deseja ignorar e .gitignorenão se aplica aos arquivos rastreados. A única maneira de parar esse rastreamento é dizer ao git para removê-los. Ao usar git rm --cached, você evita que o git exclua seus arquivos locais, mas qualquer outro repositório que obtenha suas alterações aplicará a remoção. Não acho que haja uma maneira de evitar isso em seu próprio repositório. Você deve fazer algo nos outros repositórios ou aceitar que os arquivos serão removidos.

Para evitar a remoção de outro repositório, você pode:

  • (obviamente) faça backup dos arquivos em algum lugar, extraia as alterações e restaure os arquivos,
  • ou também git rm --cachedos arquivos e commit antes de puxar suas alterações. O Git mesclará agradavelmente as duas remoções sem tocar nos arquivos já não rastreados.
Michaël Witrant
fonte
6
Isso não precisa ser verdade ("parar de rastrear = remover arquivo"). Você ainda pode ter um arquivo monitorado em um repo e não para ver todas as mudanças feitas, usando: git update-index --assume-unchanged <file>. Dê uma olhada em: blog.pagebakers.nl/2009/01/29/…
ducin
isso resolveu meu problema porque eu preciso remover o arquivo do repositório enviado no git, git rm --cached <filename> -r e depois disso, o envio muda para o repositório novamente para que o arquivo seja removido
Vinicius Cardoso
7

Coloque um /no final do nome do diretório em seu .gitignorearquivo, ou seja,

tmp/

Se você rastreou arquivos dentro desse diretório, você precisa dizer ao git para esquecê-los primeiro (antes de adicionar o dir à lista de ignorados). Supondo que você não tenha nada de vital lá (ou seja, que você pode arranhá-lo):

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

Novos arquivos nesse diretório não serão rastreados.

A --cachedopção de git rmfunciona apenas no índice (alterações pendentes mais ou menos). Não tem efeito na árvore de trabalho ou no status do que foi rastreado ou não.

Esteira
fonte
Eu tenho isso. Ambos the/dir/ethe/dir/*
21312312
Ei, Mat, se eu tiver algo como / Media em pastas diferentes que gostaria de ignorar, isso é possível? Assim como / 1 / Media, / 2 / Media, até 99?
Nic de
1

Parece que você está tentando rastrear um arquivo (por exemplo index.php), adicioná-lo a um repositório remoto e, em seguida, parar de assistir ao rastreá-lo, enquanto mantém o arquivo no remoto (ou seja, mantém index.phpinalterado no repositório remoto enquanto o altera localmente).

Pelo que entendi, o git não pode fazer isso. Você pode acompanhar um arquivo ou não. Se você rastreia um arquivo, ele existe no repositório remoto e muda quando você efetua as mudanças nele. Se você não controla um arquivo, ele não existe no repositório remoto.

Como não é possível fazer exatamente o que você deseja com o git, existem potencialmente outras soluções, dependendo da sua situação exata. Por exemplo, por que você não deseja index.phpalterar no controle remoto quando você altera localmente? Existem configurações específicas do usuário no arquivo? Se for esse o caso, você pode fazer:

cp index.php index_template.php
git rm --cached index.php

Agora edite index_template.php para que fique como você deseja que apareça no repositório remoto. Adicione algo ao seu README para dizer às pessoas que usam seu repositório que, uma vez que o clonem, devem copiar index_template.php para index.php e editá-lo para atender às suas necessidades.

git add index_template.php
git add README
git commit -m 'added template index.php file'
git push

Quando alguém clona seu repo, ela deve criar o seu próprio index.php. Você fez mais fácil para eles: simplesmente copiar index_template.phppara index.phpe revisá-lo com as configurações específicas do computador.

Cypress Frankenfeld
fonte