Eu criei uma versão padrão de um arquivo incluído em um repositório git. É importante que quando alguém clona o repositório, ele recebe uma cópia desse arquivo. No entanto, gostaria de definir o git para que ele ignore as alterações nesse arquivo posteriormente. .gitignore
funciona apenas em arquivos não rastreados.
Minha motivação é que este arquivo contenha informações específicas da máquina. Gostaria de fornecer valores padrão, permitindo que as pessoas façam alterações locais que não serão enviadas de volta ao repositório de origem, criando conflitos de mesclagem quando obtemos novas alterações.
Geralmente somos muito preguiçosos e usamos git add .
muito, por isso tenho certeza de que, se não posso dizer ao git para ignorar esse arquivo, as alterações nele acabarão sendo comprometidas e enviadas por push.
Para resumir,
- Gostaria de criar um arquivo, chamá-lo
default_values.txt
que é adicionado ao meu repositório git e é incluído quando alguém clona esse repositório. git add .
não deve adicionardefault_values.txt
ao commit.- Esse comportamento deve ser passado para qualquer clone do repositório.
fonte
Respostas:
Como muitos outros mencionaram, uma boa solução moderna é:
Isso ignorará as alterações nesse arquivo, local e upstream, até que você decida permitir novamente com:
Você pode obter uma lista de arquivos marcados como ignorados:
Observe que
--skip-worktree
, diferentemente , o--assume-unchanged
status será perdido assim que uma alteração a montante for realizada.fonte
--no-skip-worktree
para adicionar suas alterações.--skip-worktree
status de um arquivo antes de poder alternar ramificações, se esse mesmo arquivo for rastreado na outra ramificação.git status
, mas quando tentei checkout para diferentes ramo, eu tenhoerror: Your local changes to the following files would be overwritten by checkout:
, mesmo -f não ajudaerror: Entry 'wix-stores-merchant-app/demo/credentials.js' not uptodate. Cannot merge.
git ignore
egit unignore
.O que você está procurando é
git update-index --assume-unchanged default_values.txt
.Consulte os documentos para obter mais detalhes: http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html
fonte
skip-worktree
vez deassume-unchanged
mais informações stackoverflow.com/questions/13630849/…A abordagem que eu geralmente vi é criar um arquivo com um nome diferente, por exemplo: default_values_template.txt e colocar default_values.txt no seu .gitignore. Instrua as pessoas a copiar default_values_template.txt para default_values.txt em seus espaços de trabalho locais e faça as alterações necessárias.
fonte
.sample
sufixo. Então, no seu casodefault_values.txt.sample
Dê uma olhada em smudge / clean scripting. Dessa forma, você pode controlar o arquivo da versão, mas quando o check-out for feito, será "borrado", substituindo os dados genéricos / de marcador de lugar por dados específicos da máquina no arquivo.
Quando você o confirma, você o "limpa" substituindo as informações específicas da máquina por informações genéricas ou de espaço reservado.
Os scripts smudge / clean devem ser determinísticos, pois, aplicando-os várias vezes, em ordens diferentes, será o equivalente a apenas executar o último na sequência.
O mesmo pode ser aplicado com senhas se você precisar expor seu repositório, mas o conteúdo pode conter informações confidenciais.
fonte
user.json
que precise ser substituído pelos creds de cada desenvolvedor, mas não quero que o desenvolvedor verifique acidentalmente seus creds.Eu resolvi isso definindo o filtro "limpo" para simplesmente classificar o conteúdo do arquivo no índice.
git show :path/to/myfile
deve apenas imprimir o conteúdo do índice para o arquivo especificado, para que possamos usá-lo em um script para substituir a cópia de trabalho pela cópia intocada no índice:Defina isso como o filtro "limpo" para o arquivo em questão (supondo que você o tenha colocado em "discard_changes"):
Infelizmente, não consigo encontrar uma maneira de tornar isso generalizável para vários arquivos, pois não há como saber qual arquivo estamos processando dentro do script limpo. Obviamente, não há nada que o impeça de adicionar uma regra de filtro diferente para cada arquivo, mas é um pouco desajeitado.
fonte
Encontrei uma solução que funciona para minha equipe. Compartilhamos nossos githooks por meio de links simbólicos e, após adicionar um arquivo de modelo ao git, adicionei um gancho de pré-confirmação que verifica se o arquivo de modelo foi modificado e, em caso afirmativo, eu
git reset -- templatefile.txt
. Se for o único arquivo alterado, eu também aboro a confirmação.fonte
Sugiro olhar para submódulos. Se você colocar os arquivos específicos da máquina em um submódulo, o git add deve ignorá-lo.
fonte