Created
August 22, 2025 14:15
-
-
Save wellington1993/81bf3bebad30dd3d6ee27657d1989116 to your computer and use it in GitHub Desktop.
Prevent code lost in merge
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Identifica o branch atual | |
current_branch=$(git rev-parse --abbrev-ref HEAD) | |
# Evita executar o hook no próprio branch pai (ex.: main ou develop) | |
if [ "$current_branch" = "main" ] || [ "$current_branch" = "develop" ]; then | |
echo "ℹ️ Hook ignorado: você está no branch $current_branch, que não é derivado." | |
exit 0 | |
fi | |
# Faz fetch do origin para atualizar referências | |
git fetch origin --quiet | |
# Encontra o branch pai (o branch remoto mais próximo no histórico) | |
parent_branch=$(git for-each-ref --format='%(refname:short)' refs/remotes/origin | while read -r branch; do | |
if git merge-base $current_branch $branch >/dev/null 2>&1; then | |
echo $branch | |
break | |
fi | |
done) | |
if [ -z "$parent_branch" ]; then | |
echo "⚠️ Não foi possível determinar o branch pai. Prosseguindo sem validação..." | |
exit 0 | |
fi | |
# Remove o prefixo 'origin/' do nome do branch pai | |
parent_branch_name=${parent_branch#origin/} | |
# Verifica se o branch local está atrás do branch pai no origin | |
behind=$(git rev-list --count $current_branch..$parent_branch 2>/dev/null) | |
if [ $? -ne 0 ]; then | |
echo "⚠️ Erro ao verificar o status do branch. Verifique sua conexão ou configuração do Git." | |
exit 0 # Não bloqueia o commit | |
fi | |
if [ $behind -gt 0 ]; then | |
echo "🔔 Atenção, Wellington! Seu branch está $behind commits atrás de $parent_branch." | |
echo "Simulando merge para verificar conflitos..." | |
# Simula o merge sem commitar | |
git merge --no-commit --no-ff $parent_branch > /dev/null 2>&1 | |
merge_status=$? | |
# Desfaz a simulação | |
git merge --abort > /dev/null 2>&1 | |
if [ $merge_status -ne 0 ]; then | |
echo "🚨 Conflitos detectados ao simular o merge com $parent_branch!" | |
echo "Recomendamos rodar 'git merge $parent_branch' e resolver conflitos antes de prosseguir." | |
else | |
echo "✅ Simulação de merge bem-sucedida. Nenhum conflito detectado." | |
fi | |
echo "Você pode commitar, mas lembre-se de sincronizar com: git merge $parent_branch" | |
else | |
echo "✅ Branch $current_branch está atualizado com $parent_branch." | |
fi | |
# Permite o commit, mesmo com conflitos potenciais | |
exit 0 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Identifica o branch atual | |
current_branch=$(git rev-parse --abbrev-ref HEAD) | |
# Evita executar o hook no próprio branch pai | |
if [ "$current_branch" = "main" ] || [ "$current_branch" = "develop" ]; then | |
echo "ℹ️ Hook ignorado: você está no branch $current_branch, que não é derivado." | |
exit 0 | |
fi | |
# Faz fetch do origin para atualizar referências | |
git fetch origin --quiet | |
# Encontra o branch pai | |
parent_branch=$(git for-each-ref --format='%(refname:short)' refs/remotes/origin | while read -r branch; do | |
if git merge-base $current_branch $branch >/dev/null 2>&1; then | |
echo $branch | |
break | |
fi | |
done) | |
if [ -z "$parent_branch" ]; then | |
echo "⚠️ Não foi possível determinar o branch pai. Prosseguindo sem validação..." | |
exit 0 | |
fi | |
# Remove o prefixo 'origin/' do nome do branch pai | |
parent_branch_name=${parent_branch#origin/} | |
# Verifica se o branch pai remoto mudou | |
remote_hash=$(git rev-parse $parent_branch 2>/dev/null) | |
local_parent_hash=$(git merge-base $current_branch $parent_branch 2>/dev/null) | |
if [ $? -ne 0 ]; then | |
echo "⚠️ Erro ao verificar o status do branch pai. Verifique sua conexão ou configuração do Git." | |
exit 1 | |
fi | |
if [ "$remote_hash" != "$local_parent_hash" ]; then | |
echo "🚨 O branch $parent_branch foi atualizado por outros commits!" | |
echo "Faça o merge com: git merge $parent_branch" | |
exit 1 | |
fi | |
echo "✅ Branch $current_branch está sincronizado com $parent_branch. Prosseguindo com o push..." | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment