git_commit_push.sh 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  4. cd "$SCRIPT_DIR"
  5. REMOTE="${GIT_REMOTE:-origin}"
  6. BRANCH="${GIT_BRANCH:-$(git branch --show-current)}"
  7. if [ -z "$BRANCH" ]; then
  8. echo "ERROR: 当前不是普通分支,不能在 detached HEAD 状态下提交。" >&2
  9. exit 1
  10. fi
  11. if [ -d .git/rebase-merge ] || [ -d .git/rebase-apply ] || [ -f .git/MERGE_HEAD ]; then
  12. echo "ERROR: 当前仓库存在未完成的 merge/rebase,请先处理后再执行。" >&2
  13. exit 1
  14. fi
  15. MESSAGE="${*:-}"
  16. if [ -z "$MESSAGE" ]; then
  17. MESSAGE="chore: update code $(date '+%Y-%m-%d %H:%M:%S')"
  18. fi
  19. echo "Repo: $(git rev-parse --show-toplevel)"
  20. echo "Branch: $BRANCH"
  21. echo "Remote: $REMOTE"
  22. echo "Msg: $MESSAGE"
  23. git add -A
  24. if git diff --cached --quiet; then
  25. echo "没有需要提交的修改。"
  26. exit 0
  27. fi
  28. git commit -m "$MESSAGE"
  29. if git ls-remote --exit-code --heads "$REMOTE" "$BRANCH" >/dev/null 2>&1; then
  30. git fetch "$REMOTE" "$BRANCH"
  31. REMOTE_REF="refs/remotes/$REMOTE/$BRANCH"
  32. if git show-ref --verify --quiet "$REMOTE_REF"; then
  33. if ! git merge-base --is-ancestor "$REMOTE_REF" HEAD; then
  34. echo "远端 $REMOTE/$BRANCH 有本地没有的提交,开始 rebase。"
  35. git pull --rebase "$REMOTE" "$BRANCH"
  36. fi
  37. fi
  38. fi
  39. git push "$REMOTE" "HEAD:$BRANCH"
  40. echo "提交并推送完成:$(git rev-parse --short HEAD)"