Como ignorar um arquivo rastreado no git sem excluí-lo?

2

Minha equipe usa sourcetree como nosso cliente git. Existe um plugin de terceiros em nosso projeto. Precisa de vários arquivos de configuração. Esses arquivos não podem ser gerados automaticamente. Eles armazenam o nome da conta, os tokens de login e algumas opções temporárias, que não devem ser compartilhadas. Mas todo mundo ainda precisa desse arquivo, senão ele reportará o erro. Então agora eles sempre ficam na nossa seção de "mudanças não confirmadas" que é irritante.

Eu tenho 2 opções:

  1. Remova esses arquivos do repositório git. Adicione-os ao .gitignore. Peça a todos os membros da minha equipe para adicionar esses arquivos de volta ao seu projeto local com suas próprias configurações.

  2. Veja se existem truques como "ignorar um arquivo rastreado sem excluí-lo".

(Basicamente eu sinto que se a opção 2 fosse possível, o git deveria ter alguma lógica como "Se o local não tiver esse arquivo, use a versão remota. Se local tiver esse arquivo, ignore". A lógica é ruim, fácil de gerar bugs.)

Liz
fonte

Respostas:

1

tl; dr

  • Tecnicamente, sua exigência é contraditória.

  • Em um nível mais filosófico, parece ser um choque entre o código aberto e a filosofia corporativa.

  • De qualquer forma ... vou sugerir algumas coisas que me vêm à mente

Tecnicamente

git rastreia ou ignora um arquivo.

  • O rastreamento é easi (est). Apenas não faça nada ... além de usar o git! E qualquer arquivo é rastreado.
  • Ignorar é quase tão fácil - apenas certifique-se de que ele corresponda a algo em seu arquivo gitignore.
  • Mas você não pode fazer as duas coisas!
  • Principal ressalva: Mover um arquivo de rastreado para ignorado é algo não trivial - simplesmente adicionando o padrão adequado ao gitignore não o cortará uma vez rastreado. O relevante

Melhor pratica

Não inicie um projeto git sem criar um bom

  • gitignore
    Também relacionado
  • gitattributes

Então, o primeiro (e um pouco irrealista)

Sugestão 1

  • Comece um novo projeto git
  • Faça arquivos gitignore e gitattribute apropriados
  • Depurar se necessário com git-check-ignore
  • Copiar, adicionar, confirmar seus arquivos normais
  • Copie, adicione, status os arquivos não rastreados. Status deve estar limpo

Mas como eu disse isso parece não ser exatamente o que você quer, porque você quer algum tipo de arquivos compartilhados, mas não rastreados. Então você precisa

Untrack arquivos rastreados

Você realmente quer um idiota

Gancho pós-clone

Isso é tentado aqui

Mas é uma má ideia como explicado aqui

O que me leva ao

Diferença filosófica

  • Um incorporador corporativo justificadamente quer controlar o que / como seus programadores de funcionários funcionam. O que implica vários tipos de controle de máquina
  • Um software aleatório de código-fonte aberto instalado no github que controla o computador de outra pessoa aleatória é antiético e ilegal.

Portanto, se você fosse um grande jogador da Fortune 500, a opção natural seria usar o próprio git e adicionar um recurso de gancho pós-clone no seu garfo.

Um mais razoável e apenas um pouco mais inconveniente

Solução 2

  • Escreva seu próprio script de pós-clone, mas manualmente chamado
  • … Que faz a exigência da cópia se ausente saem sozinho se atual
  • E adicione um passo (manual) ao seu time: (1) clone (2) call script
  • E não esqueça o gitignore !!

Se esta solução faz sentido você pode realmente preferir

Solução 3

Inverta o script-dentro-git para git-inside-script

ou seja, peça à sua equipe para apenas baixar / copiar e executar um script que

  • Corre git clone
  • Verifica a existência / propriedade desses outros arquivos
  • Cria / baixa-los se necessário (talvez de uma fonte independente do seu repo principal)
Rusi
fonte
1
  1. Remova esses arquivos do repositório git. Adicione-os ao .gitignore. Peça a todos os membros da minha equipe para adicionar esses arquivos de volta ao seu projeto local com suas próprias configurações.

Se eu estou lendo sua pergunta corretamente, e os arquivos em questão contêm coisas como credenciais de autenticação e configurações específicas do site ou do desenvolvedor, então este é o caminho a ser seguido.

  • Se houver alguma chance de que seu repositório do git seja disponibilizado para entidades externas ou não confiáveis, seus detalhes de autenticação não deverão ser incluídos, pois serão divulgados a qualquer pessoa que clonar o projeto. Mesmo que as credenciais tenham sido removidas em algum momento futuro, elas ainda estarão disponíveis no histórico.

  • As configurações específicas do site / desenvolvedor não levantam os problemas de segurança que as informações de autenticação causam, mas ainda causam problemas se vários sites ou desenvolvedores estiverem envolvidos porque, mesmo se você tiver uma política contra confirmar / enviar alterações a esses arquivos, é apenas uma questão de tempo até que alguém os cometa e faça com que as configurações de todos os outros sejam alteradas (ou conflitos espúrios sejam gerados) na próxima vez que eles forem acionados. Eu tenho experiência pessoal com este, e é um incômodo importante e contínuo para lidar com isso. No nosso caso, algumas das diferenças foram configurações de desenvolvimento versus produção, bem como configurações específicas do local, e isso causou repetidos efeitos adversos em nossos sistemas de produção.

Uma solução hacky que eu já vi vários projetos usam é fazer uma cópia higienizado de foo.cfgchamada foo.cfg.default, pista foo.cfg.defaultno git, gitignore foo.cfg, e confiar em que o usuário copie foo.cfg.defaultpara foo.cfgdepois clonagem e personalizá-lo (a adição de credenciais de autenticação, configurações personalizadas, etc.) . No seu caso, como os arquivos de configuração são para um plug-in de terceiros, isso pode funcionar, já que eles provavelmente são bastante estáveis. É menos eficaz em cenários em foo.cfg.defaultque a alteração é frequente, uma vez que cabe ao utilizador detectar quaisquer alterações e fundi-las manualmente no local foo.cfg.

Dave Sherohman
fonte
0

Não há solução fácil para isso. Mas você pode experimentar o seguinte:

A) Coloque foo.cfgem .gitignoree empurre. Peça a todos para manter uma cópia de salvaguarda foo.cfgfora do seu repositório local. Deixe-os empurrar e copiar o arquivo excluído de foo.cfgvolta ao lugar.

B) Renomeie foo.cfgpara foo.default.cfgcolocar foo.cfgem gitignore, empurre e peça a todos os membros de sua equipe para puxar, então localmente renomeando foo.default.cfgpara foo.cfg. Depois disso, você precisa excluir foo.default.cfg, empurrar e todos precisam puxar novamente.

C) Colocar foo.cfgem .gitignoree empurrar. Peça a todos para puxar. Agora, para todos, o foo.cfgé excluído. Eles podem restabelecer isso git checkout HEAD^ foo.cfg. Agora o arquivo ainda está em fase, então eles precisam ligar git reset HEAD. Agora funciona.

Adão
fonte
0

Isto é o que você quer fazer:

  1. Adicione todos os arquivos, individualmente ou em uma pasta, que você deseja remover do repositório, mas mantenha-os localmente em .gitignore .
  2. Execute git rm - coloque em cache / here / your / file.ext para cada arquivo ou git rm - pasta em cache / \ * se eles estiverem em uma pasta. (É / \ * porque você precisa escapar do *)
  3. Confirme suas alterações.
  4. Empurre para o controle remoto.

Depois de fazer isso, você efetivamente "ignorará os arquivos rastreados sem excluí-los" , removendo-os do repositório e mantendo todos eles intocados no sistema. Então, quando sua equipe puxar as alterações, elas puxarão o arquivo .gitignore e seus arquivos de configuração individuais não serão sobrescritos pelos arquivos do repositório porque você os ignorou e os excluiu. Além disso, porque agora o novo .gitignore está ignorando esses arquivos, todos terão sua própria versão não mostrando nas "mudanças não confirmadas".

m4l490n
fonte