diff --git a/README.md b/README.md index 24c4285..81827c4 100644 --- a/README.md +++ b/README.md @@ -84,9 +84,16 @@ git deploy gitea prod -m "ajout du bloc contact" 3. push de `prod` (dernière étape) ; 4. retour sur `master`. -> `git deploy` ne pousse **que les branches nommées**, jamais `master`. Ça évite -> qu'un bare repo serveur (dont le hook n'attend qu'une branche précise) rejette -> le push. Si tu veux sauvegarder `master` sur un remote central : `git push gitea master`. +> `git deploy` ne pousse **que les branches nommées**, jamais `master` implicitement. +> Ça évite qu'un bare repo serveur (dont le hook n'attend qu'une branche précise) +> rejette le push. +> +> Pour sauvegarder `master` sur un remote central, inclus-le explicitement dans la +> liste — il sera poussé tel quel (sans merge) : +> +> ```bash +> git deploy gitea master prod stage -m "message" +> ``` Plusieurs environnements en une commande (commit unique, merges enchaînés, **push atomique de toutes les branches nommées à la fin** — tout ou rien) : diff --git a/git-deploy b/git-deploy index f55806c..58477aa 100755 --- a/git-deploy +++ b/git-deploy @@ -40,10 +40,10 @@ git remote get-url "$REMOTE" >/dev/null 2>&1 || die "Remote inconnu : $REMOTE" seen="" for b in "${BRANCHES[@]}"; do git show-ref --verify --quiet "refs/heads/$b" || die "Branche locale inconnue : $b" - [ "$b" != "$SOURCE" ] || die "'$SOURCE' est la branche de dev, pas une branche de déploiement." case " $seen " in *" $b "*) die "Branche indiquée en double : $b" ;; esac seen="$seen $b" done +# '$SOURCE' est autorisée dans la liste : elle sera poussée telle quelle (pas de merge). current=$(git branch --show-current) [ "$current" = "$SOURCE" ] || die "Place-toi sur '$SOURCE' pour déployer (git switch $SOURCE)." assert_clean_git_state @@ -55,10 +55,15 @@ fi # ---- Confirmation ---------------------------------------------------------- list="${BRANCHES[*]}" +# branches réellement fusionnées = toutes sauf SOURCE (qui est poussée telle quelle) +merge_list="" +for b in "${BRANCHES[@]}"; do [ "$b" != "$SOURCE" ] && merge_list="$merge_list $b"; done +merge_list="${merge_list# }" if [ "$PUSH" = true ]; then push_line="OUI vers '$REMOTE' ($list, atomique)"; else push_line="NON (désactivé)"; fi [ "$dirty" = 1 ] && commit_line="commit sur '$SOURCE' : \"$MSG\"" || commit_line="aucun commit (arbre propre)" +[ -n "$merge_list" ] && merge_line="merge '$SOURCE' → $merge_list" || merge_line="aucun merge (push direct)" confirm " • $commit_line - • merge '$SOURCE' → $list + • $merge_line • push : $push_line" # ---- Sauvegarde de l'état pour rollback ------------------------------------ @@ -96,6 +101,10 @@ if [ "$dirty" = 1 ]; then fi for b in "${BRANCHES[@]}"; do + if [ "$b" = "$SOURCE" ]; then + echo "✓ '$b' (dev) incluse au push telle quelle." + continue + fi git switch -q "$b" || fail "Impossible de basculer sur '$b'." git merge --no-edit -q "$SOURCE" || fail "Conflit de merge sur '$b'." echo "✓ '$b' à jour depuis '$SOURCE'."