Como sincronizar um diretório local com o servidor usando o Git?

0

Como posso usar o Git para simplesmente sincronizar um diretório local com um diretório do servidor?

Estou acostumado a FTP, mas é lento e propenso a erros.

Eu tenho acesso SSH ao servidor. Eu posso rodar o Git no servidor.

Eu também quero evitar um serviço de hospedagem Git de terceiros, como Github ou Bitbucket. Eu quero ser capaz de fazer o upload diretamente para o meu servidor.

    
por laggingreflex 23.04.2018 / 01:02

1 resposta

2

Na máquina local :

  1. Inicialize o diretório a ser sincronizado como um repositório Git

    git init
    

    Confirme qualquer código existente

    git add -A
    git commit -am "initial commit"
    
  2. Defina seu controle remoto para o servidor

    git remote set-url origin user@server:/path/to/dir/on/server
    

    Onde

    • user é o nome de usuário que você usa para o SSH no seu server . Por exemplo. [email protected]

    • /path/to/dir/on/server é o diretório no servidor para o qual você deseja sincronizar suas alterações

    Nota: é aconselhável ir sem senha para logins do SSH

Na máquina remota :

  1. Inicialize um diretório vazio no servidor

    mkdir /path/to/dir/on/server
    cd /path/to/dir/on/server
    git init
    
  2. Defina sua configuração para ignorar as atualizações da ramificação de check-out

    git config receive.denyCurrentBranch ignore
    

    Isso é necessário porque (citando o erro exato que você obterá se você não fizer isso) " atualizar o ramo atual em um repositório não-nu é negado, porque ele fará o índice e a árvore de trabalho inconsistente com o que você empurrou, e vai exigir 'git reset --hard' para coincidir com a árvore de trabalho para HEAD. "(vamos realmente fazer exatamente isso na próxima etapa).

  3. Configure um post-receive git hook :

    Crie um arquivo post-receive no diretório .git/hooks e abra-o em um editor:

    vim .git/hooks/post-receive
    

    Coloque o seguinte:

    #!/bin/sh
    git --git-dir=. --work-tree=.. checkout -f
    

    Defina seu modo como executável:

    chmod +x .git/hooks/post-receive
    

    Isso fará o checkout de suas últimas alterações no diretório do servidor sempre que você pressionar qualquer.

  • One-liner para todos acima:

    dir=<dir>; mkdir $dir && cd $dir && git init && git config receive.denyCurrentBranch ignore && printf '#!/bin/sh\ngit --git-dir=. --work-tree=.. checkout -f' > .git/hooks/post-receive && chmod +x .git/hooks/post-receive
    

Agora, na máquina local, você pode fazer isso:

git commit -am "Some changes"
git push

e seu diretório local será sincronizado com o diretório do servidor.

Uma receita adicional que eu uso com frequência: Na máquina local, mantenho o nome origin remoto do Github / Bitbucket que é a "casa" do projeto, e um nome especial server remoto que é onde ele fica implantado. Eu também criei uma ramificação git (que também é chamada) server e configurei para sempre enviar para o server remote:

git config branch.server.remote server
git config remote.server.push server:master

Dessa forma, sempre que estou no branch master, ele envia para o origin (Github / Bitbucket etc) e quando estou no branch server ele envia para o servidor.

    
por 23.04.2018 / 01:02

Tags