Como posso atualizar (puxar) um projeto git com segurança, mantendo arquivos específicos intocados, mesmo se houver alterações no upstream?
myrepo / config / config.php
Existe uma maneira, mesmo que esse arquivo esteja sendo alterado no controle remoto, quando eu git pull, todo o resto é atualizado, mas esse arquivo é inalterado (nem mesclado)?
PS. Preciso fazer o que estou pedindo, porque só estou escrevendo scripts de implantação baseados em git. Não consigo alterar os arquivos de configuração para modelos.
portanto, preciso escrever scripts de atualização que não percam o que foi alterado localmente. Eu esperava algo tão simples como:
git assume-remote-unchanged file1
git assume-remote-unchanged file2
então git pull
config.php
confirmadas?Respostas:
Existe uma solução simples baseada no Git stash. Esconda tudo o que você mudou, puxe todas as coisas novas, aplique sua quantidade.
No stash pop, pode haver conflitos. No caso que você descreve, de fato haveria um conflito
config.php
. Mas, resolver o conflito é fácil porque você sabe que o que você coloca no estoque é o que deseja. Então faça o seguinte:fonte
git merge
'nosso' é o que está atualmente no diretório de trabalho. Mas para umgit rebase
(ougit rebase -onto
) o significado pode ser trocado.git stash , git pull , git stash apply
Você pode soltar o esconderijo com:git stash drop
Uma vez que você mesclar as alterações com sucessogit stash
.Se você tiver um arquivo em seu repositório que deve ser personalizado pela maioria dos extratores, renomeie o arquivo para algo como
config.php.template
e adicioneconfig.php
ao seu.gitignore
.fonte
.gitattributes
para manter sempre suas alterações durante a mesclagem.Atualização: isso literalmente responde à pergunta, mas acho que a resposta do KurzedMetal é realmente o que você deseja.
Assumindo que:
master
master
emorigin
.... você poderia fazer:
Você pode criar um alias para isso se precisar fazer isso com frequência. Observe que, se você tiver alterações não confirmadas
config/config.php
, isso as descartará.fonte
Também podemos tentar o git pull com rebase
fonte
Para responder à pergunta: se você deseja excluir determinados arquivos de um checkout, pode usar a finalização esparsa
1) Em
.git/info/sparse-checkout
, defina o que você deseja manter. Aqui, queremos tudo (*), mas (observe o ponto de exclamação) config.php:2) Diga ao git que você deseja levar em consideração a compra esparsa
3) Se você já possui esse arquivo localmente, faça o que o git faz em um checkout esparso (diga que ele deve excluir esse arquivo, definindo o sinalizador "skip-worktree")
4) Desfrute de um repositório onde seu arquivo config.php é seu - quaisquer que sejam as alterações no repositório.
Observe que, depois que um arquivo é assumido pelo git, o .gitignore não terá nenhum efeito.
Dado que, uma vez que o arquivo está sob controle de origem, você só tem duas opções (): - rebase todo o seu histórico para remover o arquivo (com
git filter-branch
) - crie uma confirmação que remova o arquivo. É como travar uma batalha perdida, mas, às vezes, você precisa conviver com isso.fonte
Encaixe suas alterações locais não confirmadas e evite conflitos de mesclagem ao puxar.
refer - https://happygitwithr.com/pull-tricky.html
fonte