# Deploy utilizando git bare

> Já faz um tempo que estou achando muito interessante e útil automatizar certas ações repetitivas que eu tomo no meu dia a dia, como, por exemplo, dar...

- URL: https://iagofrota.com.br/blog/deploy-utilizando-git-bare/
- Data: 2020-04-14
- Tags: deploy, git, git-bare, projeto-pessoal

Já faz um tempo que estou achando muito interessante e **útil** automatizar certas ações repetitivas que eu tomo no meu dia a dia, como, por exemplo, dar _deploy_ nas aplicações que fiz e sou responsável tanto no meu trabalho como em meus projetos pessoais.

## Introdução

Basicamente, um repositório criado com o comando `git init --bare`, irá criar um repositório sem os _commits_ ou histórico de _commits_. Outro ponto, interessante é que você só envia os seus _commits_ para esse repositório.

Irei citar um trecho muito esclarecedor

> Well, a working repository created with `git init` is for… **working**.
> 
> [Jon Saints - What is a bare git repository?](http://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/)

  
  

> A bare repository created with `git init --bare` is for… **sharing**.
> 
> [Jon Saints - What is a bare git repository?](http://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/)

## Tutorial

### Pré-requisito

1. Ter o GIT instalado na sua máquina local
2. Ter o GIT instalado na sua VPS
3. Ter acesso a sua VPS via SSH

### Criar o repositório _bare_ no servidor de produção

Acesso o seu servidor via _ssh_

```
$ ssh iago@server.com
```

Acessado com sucesso, vamos criar a pasta e inicializar o repositório _bare_:

```
$ mkdir ~/git-deploy/meu-projeto-sensacional
```

Com esse comando, criei a pasta `git-deploy` que irá abrigar os outros repositórios e criei o a pasta `meu-projeto-sensacional`, que será meu repositório bare.

Dentro da pasta meu-repositorio-sensacional, dê o seguinte comando

```
$ git init --bare
```

Se você listar os itens desta pasta, verá algo parecido com isso

![](https://iagofrota.com.br/images/blog/2020/04/SharedScreenshot.jpg)

### Hooks

De maneira bem sucinta, os hooks seriam gatilhos que disparam ações. Na pasta hooks, você verá vários scripts de exemplo. Os mais comuns, são:

1. _pre-receive_: é executado assim que recebe a mudança
2. _post-receive_: é executado depois que é recebido a mudança
3. _update_: é muito parecido com o _1\. pre-receive_, mas só é executado uma vez

Esse [artigo](https://www.digitalocean.com/community/tutorials/how-to-use-git-hooks-to-automate-development-and-deployment-tasks) explica os outros scripts. Vale a pena dar uma lida.

Para o nosso caso, iremos criar um arquivo chamado `post-receive` e terá o seguinte conteúdo

```
#!/bin/bash

GIT_WORK_TREE=/var/www/html/meu-projeto-sensacional git checkout -f
```

O valor da variável `GIT_WORK_TREE`, é o caminho do seu projeto em produção

Salve e feche o arquivo.

Agora, precisamos dar permissão de execução desse script

```
$ chmod +x post-receive
```

### Adicionar o repositório remoto localmente

Entre no seu repositório local e adicione um novo repositório remoto

```
$ git remote add prod iago@servidor.com.br:/home/iago/git-deploy/meu-projeto-sensacional
```

ou ...

```
$ git remote add prod iago@[ip do servidor]:/home/iago/git-deploy/meu-projeto-sensacional
```

Você poder dar o nome que quiser para o remoto.

Enfim, para enviar os seu trabalho para o repositório _bare_, faça um _push_ no remoto prod

```
$ git push prod
```

## Conclusão

Enfim, eu utilizo repositório criados com o comando `git init` na minha máquina para desenvolver, fazer _merge_ ou _rebase_ e consultar _diff_. Já para projetos em produção, utilizo repositórios criados com o comando `git init --bare`, pois não irei precisar trabalhar diretamente nesse repositório. Lá, só existe o trabalho "final".

> Utilizo repositório criados com o comando git ini na minha máquina para desenvolver, fazer _merge_ ou _rebase_ e consultar _diff_
> 
> Sobre repositórios simples

  
  

> Lá, só existe o trabalho "final"
> 
> Sobre repositórios _bare_

  
  

Espero sinceramente que o conteúdo deste artigo seja útil para você, assim como foi e está sendo para mim.

  

Acredito que este artigo será útil também

[](https://iagofrota.com.br/blog/entendendo-os-estagios-do-git/)


* * *

  

#### Fontes

[https://pt.stackoverflow.com/a/80188/31086](https://pt.stackoverflow.com/a/80188/31086)

[https://www.blopig.com/blog/2017/06/using-bare-git-repos/](https://www.blopig.com/blog/2017/06/using-bare-git-repos/)

[http://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/](http://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/)

[https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks)

[https://www.digitalocean.com/community/tutorials/how-to-use-git-hooks-to-automate-development-and-deployment-tasks](https://www.digitalocean.com/community/tutorials/how-to-use-git-hooks-to-automate-development-and-deployment-tasks)
