diff --git a/git-auto-push.sh b/git-auto-push.sh new file mode 100755 index 0000000..24e0608 --- /dev/null +++ b/git-auto-push.sh @@ -0,0 +1,91 @@ +#!/bin/bash +set -e + +echo "=== Git Auto Push Script with Safe Pull and Error Handling ===" + +# Hàm kiểm tra lỗi và thoát +handle_error() { + echo "❌ Lỗi: $1" + # Nếu có stash, hiển thị thông báo để người dùng biết cách xử lý + if [ "$stashed" = true ]; then + echo "⚠️ Có stash được lưu, hãy kiểm tra bằng 'git stash list' và xử lý thủ công nếu cần." + fi + exit 1 +} + +# Kiểm tra xem có trong Git repository không +if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then + handle_error "Thư mục hiện tại không phải là Git repository!" +fi + +# Lấy nhánh hiện tại +current_branch=$(git branch --show-current) +if [ -z "$current_branch" ]; then + handle_error "Không thể xác định nhánh hiện tại!" +fi +echo "👉 Bạn đang ở nhánh: $current_branch" + +# Hỏi nhánh chính, mặc định là 'main' nếu người dùng không nhập +read -p "Nhập tên nhánh chính (mặc định: main): " target_branch +target_branch=${target_branch:-main} + +# Kiểm tra xem nhánh chính có tồn tại trên remote không +if ! git ls-remote --heads origin "$target_branch" >/dev/null 2>&1; then + handle_error "Nhánh $target_branch không tồn tại trên remote!" +fi + +# --- Bước 1: Stash nếu có thay đổi chưa commit --- +stashed=false +if [[ -n $(git status --porcelain) ]]; then + echo "💾 Có thay đổi chưa commit -> stash lại..." + git stash push -m "auto-stash-before-pull-$(date +%s)" || handle_error "Lỗi khi stash code!" + stashed=true +fi + +# --- Bước 2: Đồng bộ code từ nhánh chính về nhánh hiện tại --- +echo "🔄 Đồng bộ code từ $target_branch về $current_branch..." +git fetch origin "$target_branch" || handle_error "Lỗi khi fetch $target_branch!" +git merge origin/"$target_branch" --no-edit || { + handle_error "Merge từ $target_branch về $current_branch bị conflict, hãy xử lý thủ công rồi chạy lại." +} + +# --- Bước 3: Nếu có stash thì pop lại --- +if [ "$stashed" = true ]; then + echo "📥 Pop lại code đã stash..." + git stash pop || handle_error "Stash pop bị conflict, hãy xử lý thủ công bằng 'git stash list' và 'git stash apply'!" +fi + +# --- Bước 4: Commit & Push nhánh hiện tại --- +if [[ -n $(git status --porcelain) ]]; then + git add . || handle_error "Lỗi khi add files!" + read -p "Nhập commit message (mặc định: 'Update from $current_branch'): " commit_message + commit_message=${commit_message:-"Update from $current_branch"} + git commit -m "$commit_message" || handle_error "Lỗi khi commit!" +else + echo "⚠️ Không có thay đổi để commit." +fi + +git push origin "$current_branch" || handle_error "Push nhánh $current_branch thất bại!" + +# --- Bước 5: Checkout sang nhánh chính --- +echo "🔄 Chuyển sang nhánh $target_branch..." +git checkout "$target_branch" || handle_error "Checkout sang $target_branch thất bại!" + +# --- Bước 6: Pull nhánh chính --- +echo "🔄 Pull code mới nhất từ remote $target_branch..." +git pull origin "$target_branch" --no-rebase || handle_error "Pull $target_branch thất bại!" + +# --- Bước 7: Merge nhánh hiện tại vào nhánh chính --- +echo "🔀 Merge $current_branch vào $target_branch..." +git merge "$current_branch" --no-edit || { + handle_error "Merge từ $current_branch vào $target_branch bị conflict, hãy xử lý thủ công rồi chạy lại." +} + +# --- Bước 8: Push nhánh chính --- +git push origin "$target_branch" || handle_error "Push $target_branch thất bại!" + +# --- Quay lại nhánh hiện tại --- +echo "🔄 Quay lại nhánh $current_branch..." +git checkout "$current_branch" || handle_error "Checkout về $current_branch thất bại!" + +echo "✅ Hoàn tất! Code từ $current_branch đã được merge vào $target_branch và đẩy lên remote." \ No newline at end of file