Deploy com git bare
Tags: git, gitbare, deploy
Published: 2023-03-23 23:46:15

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?


> A bare repository created with git init --bare is for… sharing.
> Jon Saints - 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

```sh
ssh iago@server.com
```

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

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

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

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

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

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

![Listagem da pasta do repositório](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tn2cxp16gncnu2s3qgqs.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

```sh
#!/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

```sh
chmod +x post-receive
```

## Adicionar o repositório remoto localmente

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

```sh
git remote add prod iago@servidor.com.br:/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

```sh
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

---

**Fontes**

https://pt.stackoverflow.com/a/80188/31086
https://www.blopig.com/blog/2017/06/using-bare-git-repos/
http://www.saintsjd.com/2011/01/what-is-a-bare-git-repository/
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