Eu tenho um repositório central do CENTRAL que tem três repositórios de desenvolvedor puxando e empurrando para ele normalmente.
Eu também tenho dois outros repositórios extraídos do repositório bare CENTRAL: um é o servidor ativo e o outro é um servidor de teste / estágio - cada um extraído de sua própria ramificação.
O cenário é o seguinte: eu tenho um post-update
script de gancho no repositório CENTRAL que acessa automaticamente os repositórios de teste e ao vivo e executa um comando pull em cada um. Isso atualiza os servidores de teste e ativos, tudo dependendo de qual filial possui novas confirmações. Tudo isso funciona muito bem.
O problema é o seguinte: pode haver momentos em uma emergência em que os arquivos possam ser atualizados diretamente no servidor (via ftp ou qualquer outra coisa) e o script de pós-atualização do CENTRAL falhará, pois ocorrerão conflitos de mesclagem / substituição. Não há como evitar esse cenário, e é inevitável.
O que eu gostaria que acontecesse é o seguinte: quero que o pull dos sites ao vivo e de teste sempre sobrescreva / mescle no pull. Sempre. Esses repositórios serão apenas de atração, pois não são para desenvolvimento.
Em todas as minhas pesquisas, não consigo encontrar uma boa solução para que uma solicitação sempre force uma substituição dos arquivos locais. Tudo isso é possível? Seria um ótimo cenário de desenvolvimento, se sim.
Respostas:
Realmente a maneira ideal de fazer isso é não usar
pull
em tudo, mas em vez dissofetch
ereset
:(Alterando
master
para qualquer ramo que você deseja seguir.)pull
foi desenvolvido para mesclar as alterações de alguma forma, enquanto parareset
a cópia local corresponder a uma confirmação específica.Você pode considerar opções ligeiramente diferentes,
clean
dependendo das necessidades do seu sistema.fonte
reset --hard
é um comando usado para forçar o estado do diretório de trabalho (e a ramificação atual) a um estado correspondente ao de uma confirmação específica.FETCH_HEAD
é uma referência criada automaticamentefetch
para representar a referência buscada. Não é mesclado, apenas sobrescrito diretamente sempre que você faz uma busca.clean
é um comando que remove arquivos que não são rastreadosgit
, os-df
sinalizadores indicam para remover os diretórios (-d
) e, na verdade, fazem a remoção (-f
).git clean -dn
antes de usar,git clean -df
para ver quais arquivos / pastas serão excluídos.git clean -df
só pode ser revertida se você tivesse um backupgit clean -df
em remover arquivos com gitignor também, mas acontece que não.git clean --help
diz "Normalmente, apenas os arquivos desconhecidos pelo Git são removidos, mas se a opção -x for especificada, os arquivos ignorados também serão removidos. Isso pode, por exemplo, ser útil para remover todos os produtos de construção".Você pode tentar o seguinte:
(em Como forçar o "git pull" para substituir arquivos locais? )
Outra idéia seria excluir todo o git e criar um novo clone.
fonte
Não sei como fazê-lo em um comando, mas você pode fazer algo como:
ou mesmo
fonte
git reset --hard && git pull
. Alternativamente, mas não melhorgit reset --hard; git pull
. Usar&&
apenas executará o segundo comando se o primeiro comando tiver sido bem-sucedido.;
irá executá-lo independentemente do código de saída do primeiro comando.Para obter uma cópia da ramificação e forçar a substituição de arquivos locais da origem, use:
Todo o trabalho atual será perdido e será o mesmo que o ramo de origem
fonte
fonte
Você pode mudar o gancho para limpar tudo.
fonte
git clean
já é "Remover arquivos não rastreados da árvore de trabalho" (parte superior da página). Normalmente, isso não inclui arquivos ignorados, mas-x
dizgit clean
para incluir também arquivos ignorados (exceto que isso não afeta os arquivos ignorados pela-e
opção).Se você ainda não confirmou as alterações locais desde o último pull / clone, você pode usar:
checkout
limpará suas alterações locais com a última confirmação local epull
a sincronizará com o repositório remotofonte