Article image
Walter Pinto
Walter Pinto15/09/2023 14:10
Compartilhe

馃 Automatizando Git workflow com bash script

  • #Git

image

Todo mundo que utiliza o Git para controle de vers茫o de c贸digo precisa executar comandos repetitivos e 脿s vezes ma莽antes. Isso pode ser resolvido (ou amenizado) de algumas formas, como por exemplo utilizando aliases do pr贸prio Git ou configurando bibliotecas como Commitlint, Husky e Commitizen.

Outra forma de agilizar esse processo 茅 utilizando um bash script que seja capaz de automatizar um fluxo simples poupando comandos repetitivos.

Essa foi a proposta desta聽postagem聽que encontrei no dev.to dia desses. A ideia de criar um git workflow com algumas linhas de shell script 茅 贸tima, mas ao testar encontrei um problema: o famigerado聽git add .. N茫o vi uma forma de selecionar uma unstaged change espec铆fica para commit caso houvesse mais de um arquivo pendente.

Com isso, refatorei o c贸digo, deixei os textos echo em portugu锚s, pedi ajuda de IA generativa para adicionar valida莽玫es de reposit贸rio remoto e聽voil谩.

馃鈥嶐煉 O que faz este script

Automatiza quatro a莽玫es principais do Git:

  1. Alterna para uma branch especificada (git checkout);
  2. Verifica se existe altera莽茫o no c贸digo (git status) ;
  3. Confirma as altera莽玫es com uma mensagem fornecida pelo usu谩rio (git commit);
  4. Envia para a branch definida (git push).

馃敧 Destrinchando o c贸digo

Explicando os trechos do script:

#!/bin/bash

if [ "$#" -lt 2 ]; then
echo "Dica: Use o script no seguinte formato => $0 <branch_name> <commit_message>"
exit 1
fi

branch_name="$1"
commit_message="${2:-Commit autom谩tico}"

Nesta parte inicial do c贸digo, ele verifica se o usu谩rio forneceu pelo menos dois argumentos ao chamar o script: o nome da branch e a mensagem de commit. Se n茫o forem fornecidos os argumentos necess谩rios, o script exibe uma mensagem de dica de uso e sai com um c贸digo de erro 1.

if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo "Erro: Reposit贸rio atual n茫o 茅 um reposit贸rio Git."
exit 1
fi

if ! git ls-remote --exit-code origin; then
echo "Erro: Reposit贸rio remoto 'origin' n茫o encontrado."
exit 1
fi

Esta parte do script acima verifica se o diret贸rio atual 茅 um reposit贸rio Git, usando o comando聽git rev-parse. Se n茫o for um reposit贸rio Git, o script exibe uma mensagem de erro e sai. Logo em seguida verifica se o reposit贸rio remoto chamado聽origin聽existe usando o comando `git ls-remote``. Se n茫o existir, 茅 exibida uma mensagem de erro e o fluxo 茅 encerrado.

git checkout "$branch_name" || exit 1

git status --short

read -p "Digite os n煤meros dos arquivos que deseja commitar (separados por espa莽os): " file_indices

Esta parte do c贸digo muda para a branch especificada pelo usu谩rio usando o comando聽git checkout. Se a mudan莽a falhar, o script sai com um c贸digo de erro 1. Em seguida exibe a lista de arquivos modificados no formato curto usando o comando聽git status --short. Isso exibe uma lista de arquivos que foram modificados no reposit贸rio. Logo em seguida 茅 solicitado ao usu谩rio que insira os n煤meros correspondentes 脿 ordem dos arquivos que deseja commitar, separados por espa莽os.

if [ -n "$file_indices" ]; then
selected_files=()
while read -ra indices; do
  for index in "${indices[@]}"; do
    selected_files+=($(git status --short | sed -n "${index}p" | awk '{print $2}'))
  done
done <<< "$file_indices"

if [ "${#selected_files[@]}" -gt 0 ]; then
  git add "${selected_files[@]}"
  git commit -m "$commit_message"
  git push origin "$branch_name"
  echo
  echo "鉁笍As mudan莽as foram confirmadas e enviadas com sucesso para a branch $branch_name!!鉁笍"
  echo
else
  echo "Nenhum arquivo selecionado para commit. Opera莽茫o cancelada."
fi
else
echo "Nenhum arquivo selecionado para commit. Opera莽茫o cancelada."
fi

Por fim, o script processa os n煤meros dos arquivos inseridos pelo usu谩rio e adiciona, confirma e faz push apenas dos arquivos selecionados. Se nenhum arquivo v谩lido for selecionado para commit, ele exibe uma mensagem informando. Se os arquivos forem selecionados e commitados com sucesso, ele exibir谩 uma mensagem de sucesso.

鈱笍 Reposit贸rio Github

https://github.com/walterowisk/git-add-commit-push

馃憦 Refer锚ncia

Automate Your Git Workflow with this Simple Bash Scripts

脡 fineza deixar uma 猸 no repo caso goste da postagem.

Compartilhe
Coment谩rios (2)
Lucas Silva
Lucas Silva - 15/09/2023 16:15

Interessante, obrigado pela pub

Rafael Santana
Rafael Santana - 27/09/2023 14:29

Que material bom, meus parabens e muito obrigado!