para - ignorar commits git




Git-Diferença entre 'assumir-inalterado' e 'ignorar-trabalho' (2)

Eu tenho alterações locais em um arquivo que não quero confirmar no meu repositório. É um arquivo de configuração para construir o aplicativo em um servidor, mas eu quero construir localmente com configurações diferentes. Naturalmente, o arquivo sempre aparece quando eu faço 'git status' como algo a ser encenado. Eu gostaria de esconder essa mudança específica e não cometer isso. Eu não farei nenhuma outra alteração no arquivo.

Depois de algumas pesquisas, vejo duas opções: 'assumir-inalterado' e 'ignorar-trabalho'. Uma pergunta anterior here fala sobre eles, mas não explica suas diferenças. Minha pergunta é: como os dois comandos são diferentes? Por que alguém usaria um ou outro?


Nota: fallengamer fez alguns testes em 2011 (então eles podem estar desatualizados), e aqui estão suas http://fallengamer.livejournal.com/93321.html :

Operações

  • O arquivo é alterado no repositório local e no upstream
    git pull :
    O Git preserva as mudanças locais de qualquer maneira.
    Assim, você não perderia acidentalmente nenhum dado marcado com nenhum dos sinalizadores.
    • Arquivo com sinalizador assume-unchanged : o Git não sobrescreveria o arquivo local. Em vez disso, produziria conflitos e aconselharia como resolvê-los
    • Arquivo com o sinalizador skip-worktree : o Git não sobrescreveria o arquivo local. Em vez disso, produziria conflitos e aconselharia como resolvê-los

.

  • O arquivo é alterado no repositório local e no upstream, tentando ser puxado de qualquer maneira
    git stash
    git pull
    Usar skip-worktree resulta em algum trabalho manual extra, mas pelo menos você não perderia nenhum dado se você tivesse alguma alteração local.
    • Arquivo com sinalizador assume-unchanged : Descarta todas as alterações locais sem a possibilidade de restaurá-las. O efeito é como ' git reset --hard '. chamada ' git pull ' terá sucesso
    • Arquivo com o sinalizador skip-worktree : o Stash não funciona nos arquivos skip-worktree . ' git pull ' falhará com o mesmo erro acima. O desenvolvedor é forçado a redefinir manualmente o sinalizador skip-worktree para poder skip-worktree e concluir a pull falha.

.

  • Sem alterações locais, o arquivo upstream foi alterado
    git pull
    Ambos os sinalizadores não impediriam que você recebesse alterações de envio. O Git detecta que você quebrou assume-unchanged promessa assumida assume-unchanged e escolhe refletir a realidade, redefinindo a bandeira.
    • Arquivo com sinalizador assume-unchanged : o conteúdo é atualizado, o sinalizador é perdido.
      ' git ls-files -v ' mostraria que o sinalizador é modificado para H (de h ).
    • Arquivo com sinalizador skip-worktree : o conteúdo é atualizado, o sinalizador é preservado.
      ' git ls-files -v ' mostraria o mesmo sinalizador S antes do pull .

.

  • Com o arquivo local alterado
    git reset --hard
    O Git não toca skip-worktree arquivo skip-worktree e reflete a realidade (o arquivo prometido para ser inalterado na verdade foi alterado) para arquivo assume-unchanged .
    • Arquivo com sinalizador assume-unchanged : o conteúdo do arquivo é revertido. O sinalizador é redefinido para H (de h ).
    • Arquivo com sinalizador skip-worktree : o conteúdo do arquivo está intacto. A bandeira continua a mesma.

Ele adiciona a seguinte análise:

  • Parece que o skip-worktree está se esforçando muito para preservar seus dados locais . Mas isso não impede que você receba alterações a montante se for seguro. Além disso, o git não redefine o sinalizador no pull .
    Mas ignorar o comando ' reset --hard ' pode se tornar uma surpresa desagradável para um desenvolvedor.

  • Assume-unchanged sinalizador " Assume-unchanged pode ser perdido na operação pull e as mudanças locais dentro de tais arquivos não parecem ser importantes para o git.

Vejo:

Ele conclui:

Na verdade, nenhuma das bandeiras é intuitiva o suficiente .

  • assume-unchanged assume que um desenvolvedor não deve alterar um arquivo. Se um arquivo foi alterado - que essa mudança não é importante. Este sinalizador serve para melhorar o desempenho de pastas que não mudam, como os SDKs.
    Mas se a promessa for quebrada e um arquivo for realmente alterado, o git reverte a bandeira para refletir a realidade. Provavelmente está tudo bem em ter alguns sinalizadores inconsistentes em pastas geralmente não-feitas-para-serem-alteradas.

  • Por outro lado, skip-worktree é útil quando você instrui o git para não tocar em um arquivo específico. Isso é útil para um arquivo de configuração já rastreado.
    O repositório principal do Upstream hospeda algumas configurações prontas para produção, mas você gostaria de alterar algumas configurações na configuração para poder fazer alguns testes locais. E você não quer verificar acidentalmente as alterações em tal arquivo para afetar a configuração de produção. Nesse caso, skip-worktree faz cena perfeita.


Você quer skip-worktree .

assume-unchanged é projetado para casos em que é caro verificar se um grupo de arquivos foi modificado; quando você define o bit, git (é claro) assume que os arquivos correspondentes a essa parte do índice não foram modificados na cópia de trabalho. Por isso, evita uma confusão de chamadas de stat . Esse bit é perdido sempre que a entrada do arquivo no índice é alterada (assim, quando o arquivo é alterado para upstream).

skip-worktree é mais do que isso: mesmo onde git sabe que o arquivo foi modificado (ou precisa ser modificado por um reset --hard ou algo assim), ele reset --hard que não foi, usando a versão do índice . Isso persiste até que o índice seja descartado.

Há um bom resumo das ramificações desta diferença e os casos típicos de uso aqui: http://fallengamer.livejournal.com/93321.html .

A partir desse artigo:

  • --assume-unchanged assume que um desenvolvedor não deve alterar um arquivo. Este sinalizador serve para melhorar o desempenho de pastas que não mudam, como os SDKs.
  • --skip-worktree é útil quando você instrui o git a não tocar em um arquivo específico, pois os desenvolvedores devem alterá-lo. Por exemplo, se o repositório principal hospeda alguns arquivos de configuração prontos para produção e você não quer cometer alterações acidentalmente nesses arquivos, o --skip-worktree é exatamente o que você deseja.






git-index