TDC2018SP | Trilha NoSQL - Git muito alem do controle de versao, uma alternativa para armazenamento de dados
1. Git muito além do
controle de versão
Alex Porcelli
Business Automation Architect, Red Hat
uma alternativa para armazenamento de dados
twitter.com/porcelli
github.com/porcelli
2.
3.
4. Git is the dominant choice for
version control for developers
today, with almost 90% of developers
checking in their code via Git
https://insights.stackoverflow.com/survey/2018
Disclaimer: assim como todo nosql, não é todas as aplicações que se adequam ao uso do git como storage!
SE FOR O SEU CASO, no mínimo vc vai sair daqui entendendo um pouco como Git funciona internamente! Então não tem como não sair daqui sem adicionar alguma coisa no seu dia a dia de desenvolvedor!
Quem usa GIT aqui?
StackOverflow insights 2018 87.2% (insights.stackoverflow.com)
GitHub community reached 24 million developers working across 67 million repositories (https://octoverse.github.com)
Agora… quem já se enrolou, principalmente no começo, com Git?
Pensou que perdeu código…
E depois descobriu que vc na vdd não perdeu... e procurando descobriyu coisas como reflog ou outras magias negras para recuperar suas alterações?!
Git como armazenamento de dados
Armazenamento de Arquivos, porém com recursos de versionamento, etc
Exemplos: Content Management System, Document Management, Portal, etc
Chave/valor
Estrutura flexível para armazenamento de chave/valor, com recursos de versionamento
Outras opções serão variações sobre essas opções
Praticamente para todas as linguagens.
Eu uso JGit para Java, que é mais que uma lib, é uma implementação complete do git em java.
Libgit2, e binds para várias linguagens.
Transação:
commit forward only, se falhar, `rollback`
-> Muitas alterações, usa uma branch, faz todas as alterações, e tenta fazer merge, se falhar: rollback.
Réplica:
Git post-commit hook
Performance:
tome cuidado com muito conteúdo em uma única árvore, e repos grandes são mais lentos. Commits por Segundo também não é muito rápido, toda operação vai no disco
Utilizamos o git como forma de armazenamento de dados (6+ anos)
- Primeiro
Resultado:
- Basta escrever tudo em arquivos
- Teste unitário vc pode escrever no disco mesmo
- Mapeamento quase completo em relação as funcionalidades do Git
- Padrão, ninguém precisa aprender nada
- E de graça…. Ainda resolvemos…
Vc já se perguntou como Git funciona por baixo dos panos?
Bom vamos começar por aqui, pois antes de eu falar sobre como vc pode usar e como eu uso Git como meu NOSQL nos últimos 6 anos, eh fundamenta vc entender como ele funciona
Para os antigos usuários de Subversion, usar Git mudou a vida, pois branches e etc, passaram a ser utilizáveis… o Git era quase mágico de tão rápido para mudar branches.
Early days do subversion armazenava reverse deltas, e tinha que computar os diffs. (Isso já mudou um bocado, mas talvez tarde demais).
Git é diferente, é mais ou menos assim que os dados são armazenados.
Então vamos começar pelo começo… o Repositório.
Primeira coisa para entender:
Bare e Working Tree
Working Tree é a forma de você interagir com o Git de modo facilitado
Bare: Bare é um repositório que você não tem o working tree
Pq isso é importante? Pq se você quiser usar o git como nosql, vc provavelmente irá manipular diretamente as estruturas de dados, sem usar um Working Tree
(retirado da documentação official)
Ótimo! Mas o que isso significa? Significa que o core do Git é simplesmente um banco de dados chave-valor.
Os dados no Git são armazenados como objetos.
Para interagir diretamente com os objetos, vamos usar os commandos chamados plumbing!!
Sim… existem dois tipos de comandos no Git: Porcelain e Plumbing.
Porcelains são os que usamos inicialmente no 101: git add, git commit, git checkout, git branch
echo 'hello' | git hash-object –stdin (não escreve)
Cria um 40-character checksum hash do conteúdo, neste caso a palavra “hello”
(write)
Read content!
E COM ISSO: Você já conhece o suficiente para pode usar Git como um K/V Store
Ainda tem mais… vamos agora entender um pouco sobre tipos de objetos.
Este commando retorna o tipo do Objeto!
Sim, existe mais de um objeto… o que manipulamos até agora é o
BLOB!
100644: arquivo normal
100755: arquivo executável
120000: link simbólico
Essa estrutura fque estamos montando, é armazenada temporáriamente no index
Interessante: path/ile.txt
Mostrar dados que estão no index
find objects -type f
git cat-file {hash} -t
Criando um commit
Criando um commit seguido de outro commit!
Visualizando um commit
ERROR!!!
fatal: your current branch 'master' does not have any commits yet
WTF?!
master branch é default, mas como é um repositório bare… e estamos manipulando ele diretamente…precisamos setar para onde o refs/head/master está apontado (commit hash)