Marque o arquivo como "incompatível" com o Git

41

Quero mostrar alguns dos meus trabalhos, enviando-os para minha conta do GitHub. No entanto, existem alguns arquivos que contêm senhas, como conexões com o banco de dados.

Existe uma maneira de marcar um arquivo como incompatível com o Git para que ele não possa aparecer no GitHub?

Adam Carter
fonte
1
Sugestão tangencial: isso pode não ser aplicável em todas as plataformas, pois algumas são muito casadas com arquivos de configuração, mas você pode considerar seguir a abordagem de 12 fatores de manter esses parâmetros no ambiente: 12factor.net/config . Ou seja, faça com que o código do aplicativo nunca assuma a presença de um arquivo de configuração. (Ao contrário de um script de inicialização privada que define estes, mas nunca deixa sua máquina local.)
millimoose
1
Se você acidentalmente enviá-los, certifique-se de removê-los do histórico completo do git (outras perguntas explicarão como), porque mesmo se você excluí-lo e ignorá-lo, a antiga versão comprometida permanecerá no histórico e ficará visível no Github.
Curiousdannii 26/10/2015
3
Observe que todas as respostas realmente não respondem à sua pergunta. Eles não tornam o arquivo incompatível, eles simplesmente configuram o git para que ele o ignore por padrão. Mas se você acidentalmente inserir esse nome de arquivo em uma linha de comando git, poderá acabar comprometendo-o, mesmo que ele corresponda a um padrão .gitignore. AFAIK, não há uma maneira 100% completa de informar gitpara evitar o comprometimento de um arquivo específico em todos os casos. Embora isso possa ser visto como um recurso ... permite que comandos explícitos substituam configurações genéricas.
Bakuriu 26/10/2015
Você pode remover as senhas codificadas e mudar para uma alternativa mais segura. Depois disso, você pode mudar as senhas do banco de dados. As senhas antigas ainda estão dentro das confirmações, mas estão desatualizadas quando alguém é capaz de lê-las. Tenho certeza de que você não pode alterar um commit, uma vez que ele já foi construído.
BlueWizard
3
Além do que @curiousdannii disse, o GitHub tem uma página inteira discutindo como remover dados confidenciais que você acidentalmente confirmou. Entre outras coisas, esta página diz para alterar as senhas e chaves que você publicou acidentalmente. help.github.com/articles/remove-sensitive-data
Kevin - Reinstate Monica

Respostas:

67

Existe uma maneira de marcar um arquivo como incompatível com o Git para que ele não possa aparecer no GitHub?

Primeiro, não há como ter alguns arquivos e confirmações visíveis no seu repositório Git local, mas de alguma forma não visível no GitHub; se você tiver um arquivo confirmado no Git, ele aparecerá no GitHub.

Segundo, não existe uma maneira simples e prática de marcar um arquivo individual como "inconstante". Mas há definitivamente uma maneira de ignorar um arquivo em um repositório Git: adicionando o (s) arquivo (s) - incluindo seu caminho relativo, se necessário - para um .gitignorearquivo :

Um .gitignorearquivo especifica arquivos não rastreados intencionalmente que o Git deve ignorar. Arquivos já rastreados pelo Git não são afetados; veja as NOTAS abaixo para detalhes.

Criar um básico .gitignoreé bastante fácil, pois é apenas um arquivo de texto simples. Então, por exemplo, se eu tivesse um config.phparquivo na sua raiz, você faria isso; supondo que você esteja usando PHP, mas o conceito se aplica a qualquer configuração. Também estou usando o Nano como meu editor de texto neste exemplo, mas fique à vontade para usar o editor de texto que você normalmente usa para isso:

nano .gitignore

E basta adicionar esse nome de arquivo ao arquivo:

config.php

Salve-o e agora o Git simplesmente ignorará esse arquivo.

Dito isto, o que eu gosto de fazer em configurações como essa é manter uma configuração de exemplo / exemplo neutralizada de detalhes sensíveis no repositório, para que eu tenha alguma referência sobre o formato do arquivo de configuração como um arquivo chamado algo como isto:

config.SAMPLE.php

Dessa forma, você sabe exatamente como o config.phparquivo deve ser configurado config.SAMPLE.phpe você pode garantir que o atual config.phpnunca seja tocado pelo Git.

Além disso, se você planeja exibir seu código, precisa esperar que alguém tente pegar esse código e implementá-lo em seu próprio sistema de alguma forma. Lembre-se de que não somos você e, sem um exemplo de arquivo de configuração no seu repositório, as pessoas realmente não entenderão como implementar o código por conta própria. Caramba, eles podem até achar que você não é competente porque não forneceu um exemplo básico de configuração.

JakeGould
fonte
11
+1 para a resposta correta e sugerindo um arquivo de configuração de amostra. Existem algumas bibliotecas como o Figaro para Ruby que o levam nessa direção. Você deve ter um arquivo de amostra confirmado com valores semelhantes aos valores reais, para que a pessoa que analisa seu código saiba como deve ser o ambiente. Algumas plataformas, como o Heroku, usam variáveis ​​de ambiente; portanto, você pode definir sua configuração para algo como database_url = Environment.DATABASE_URLe deixar um comentário acima como # postgres://username:password@localhost/dbname.
Chris Cirefice
@ChrisCirefice Thanks! Sempre me surpreende que surjam novas “ferramentas” que lembrem o óbvio: se esse código for lido por outras pessoas, não explicando como uma configuração funciona faz exatamente o que? Obrigado novamente.
JakeGould # 26/15
27

Você também pode adicionar um gancho de pré-confirmação para implementar verificações de sanidade. O diretório .git/hooksde todo repositório git possui alguns scripts de amostra.

O script chamado pre-commité executado se existir antes de cada confirmação e um valor de retorno diferente de zero anula a confirmação.

Por exemplo, você pode ter um script simples como este:

#! /bin/sh -e
git ls-files --cached | grep -qx 'filename' && { echo "Excluded file included in the commit" >&2; exit 1; }
exit 0

E se isso filenamecorresponder, a confirmação falhará.

Juho Östman
fonte
1
+1 é a resposta certa que realmente impede a adição e confirmação explícita do arquivo.
R ..
De fato, embora a prática recomendada não seja confiar nessa prevenção (por exemplo, use `.gitignore).
David Z
2
@R .. Sim e não. Enquanto a pergunta declara, “marcar um arquivo como inalterável”, o espírito está “impedindo que um arquivo seja comprometido”. A realidade que está criando .gitignoreé uma prática muito comum - e comumente entendida - para quem usa o Git. Mas um script de pré-confirmação não é realmente usado pela maioria dos usuários do Git. Isso requer algum conhecimento de configuração e um verdadeiro motivo pelo qual um método como esse seria preferível ao simples uso de um .gitignorearquivo. Mas isso é muito útil para alguns casos mais complexos, mas é definitivamente um conceito que você usaria quando realmente souber que precisa usá-lo.
JakeGould
2
Eu pude ver usando isso em situações em que você não confia 100% no .gitignore (você pode fazer algo tolo acidentalmente exigir que o git adicione o arquivo para confirmação). Ou talvez outra pessoa possa editar o arquivo .gitignore (afinal, ele está sob controle de versão). Se você realmente precisa de um processo testável, isso é algo em que você pode trabalhar nesse processo.
Cort Ammon
@CortAmmon nem sempre é sobre confiança. Você pode adicionar algumas informações de depuração temporárias e não públicas ao seu código-fonte que não deseja confirmar, mas não pode ignorar esse arquivo. Em vez disso, você deseja verificá-lo antes de confirmar se não contém nada de ilegal . Parece uma boa solução para este caso de uso. E, na verdade, foi assim que encontrei essa pergunta, porque é o meu caso de uso.
T3chb0t 28/10/19
12

O que @JakeGould disse. Em alguns casos, você também pode usar bits de arquivo especiais como skip-worktreeou assume-unchangedque podem ser configurados da seguinte maneira; para as diferenças entre os dois, consulte esta resposta de estouro de pilha :

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

O que ocultará alterações adicionais em um arquivo já existente e que você poderá usar se realmente desejar que um arquivo esteja lá após cada solicitação. Mas eu aconselho você a usá-lo apenas se realmente souber o que está fazendo.

phk
fonte
8

Use um .gitignorecomo @JakeGould disse. Além disso, algumas informações relacionadas:

  • .gitignoreimpede que os arquivos sejam rastreados; se eles já estiverem rastreados, use-os git rm --cachedpara removê-los
  • arquivos / padrões $GIT_DIR/info/excludetambém serão ignorados
  • arquivos / padrões no arquivo especificado por core.excludesFile no usuário ~/.gitconfigtambém são ignorados.

Veja a documentação oficial do Git para mais detalhes.

46and2
fonte
2

Para estender as respostas de Jake e 46: uma prática muito boa é ter uma extensão consistente usada para arquivos nos quais você inclui informações privadas e .gitignoresempre excluir arquivos com essa extensão globalmente (usando o .gitconfigarquivo conforme mencionado em outro lugar para sempre ignorá-lo) para o seu usuário).

Dessa forma, você pode ter, por exemplo:

/projectname/mypasswords.exc 

e se você excluiu *.excglobalmente, sabe que não será confirmado, mesmo se você esquecer de excluir individualmente esse arquivo específico.

Joe
fonte