Update
This commit is contained in:
@@ -1,447 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# =====================================
|
|
||||||
# StackPulse Dev-Skript – Hauptmenü & Aktionen
|
|
||||||
# =====================================
|
|
||||||
|
|
||||||
show_menu() {
|
|
||||||
cat <<'MENU'
|
|
||||||
Bitte wähle eine Aktion:
|
|
||||||
|
|
||||||
1) Neues Feature anlegen
|
|
||||||
2) Feature-Branch in dev mergen
|
|
||||||
3) dev in master mergen
|
|
||||||
4) Änderungen committen & pushen
|
|
||||||
5) Docker-Release bauen & pushen
|
|
||||||
6) Dev-Umgebung starten
|
|
||||||
7) Git-Stashes verwalten
|
|
||||||
8) Branch wechseln
|
|
||||||
0) Beenden
|
|
||||||
MENU
|
|
||||||
}
|
|
||||||
|
|
||||||
pause_for_menu() {
|
|
||||||
echo ""
|
|
||||||
read -rp "Zurück zum Hauptmenü mit Enter... " _
|
|
||||||
}
|
|
||||||
|
|
||||||
create_new_feature() {
|
|
||||||
local master_branch="master"
|
|
||||||
local feature_name feature_branch base_commit
|
|
||||||
|
|
||||||
read -rp "Bitte den Namen des neuen Features eingeben: " feature_name
|
|
||||||
if [[ -z "$feature_name" ]]; then
|
|
||||||
echo "❌ Fehler: Kein Feature-Name angegeben."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$feature_name" =~ [^a-zA-Z0-9._-] ]]; then
|
|
||||||
echo "❌ Fehler: Ungültiger Branch-Name. Erlaubt sind Buchstaben, Zahlen, Punkt, Unterstrich oder Bindestrich."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
feature_branch="feature/$feature_name"
|
|
||||||
|
|
||||||
if ! git diff-index --quiet HEAD --; then
|
|
||||||
echo "⚠️ Es gibt noch uncommittete Änderungen. Bitte committen oder stashen, bevor ein neuer Branch erstellt wird."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if git show-ref --verify --quiet "refs/heads/$feature_branch"; then
|
|
||||||
echo "❌ Fehler: Der Branch '$feature_branch' existiert lokal bereits."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if git ls-remote --heads origin "$feature_branch" | grep -q "$feature_branch"; then
|
|
||||||
echo "❌ Fehler: Der Branch '$feature_branch' existiert bereits auf Remote."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
git checkout "$master_branch"
|
|
||||||
git pull origin "$master_branch"
|
|
||||||
|
|
||||||
git checkout -b "$feature_branch" "$master_branch"
|
|
||||||
git push -u origin "$feature_branch"
|
|
||||||
|
|
||||||
base_commit=$(git rev-parse --short HEAD)
|
|
||||||
|
|
||||||
echo "✅ Neuer Feature-Branch '$feature_branch' wurde erstellt und auf Remote gepusht."
|
|
||||||
echo " Basis: $master_branch@$base_commit"
|
|
||||||
}
|
|
||||||
|
|
||||||
merge_feature_into_dev() {
|
|
||||||
local dev_branch="dev"
|
|
||||||
local feature_branch
|
|
||||||
local -a branch_array
|
|
||||||
local choice index=1
|
|
||||||
|
|
||||||
echo "Verfügbare Feature-Branches:"
|
|
||||||
mapfile -t branch_array < <(git for-each-ref --format='%(refname:lstrip=2)' 'refs/remotes/origin/feature/*') || true
|
|
||||||
|
|
||||||
if [[ ${#branch_array[@]} -eq 0 ]]; then
|
|
||||||
echo "Keine Feature-Branches gefunden."
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
for feature_branch in "${branch_array[@]}"; do
|
|
||||||
echo " $index) $feature_branch"
|
|
||||||
((index++))
|
|
||||||
done
|
|
||||||
|
|
||||||
read -rp "Bitte Nummer wählen: " choice
|
|
||||||
if ! [[ "$choice" =~ ^[0-9]+$ ]] || (( choice < 1 || choice > ${#branch_array[@]} )); then
|
|
||||||
echo "Ungültige Auswahl."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
feature_branch=${branch_array[choice-1]}
|
|
||||||
echo "Ausgewählter Feature-Branch: $feature_branch"
|
|
||||||
|
|
||||||
git checkout "$dev_branch"
|
|
||||||
git pull origin "$dev_branch"
|
|
||||||
|
|
||||||
git checkout "$feature_branch"
|
|
||||||
git pull origin "$feature_branch"
|
|
||||||
|
|
||||||
git checkout "$dev_branch"
|
|
||||||
git merge --no-ff "$feature_branch" -m "Merge $feature_branch into $dev_branch"
|
|
||||||
|
|
||||||
git push origin "$dev_branch"
|
|
||||||
echo "Feature $feature_branch wurde erfolgreich in $dev_branch gemerged."
|
|
||||||
}
|
|
||||||
|
|
||||||
merge_dev_into_master() {
|
|
||||||
local dev_branch="dev"
|
|
||||||
local master_branch="master"
|
|
||||||
|
|
||||||
git checkout "$master_branch"
|
|
||||||
git pull origin "$master_branch"
|
|
||||||
|
|
||||||
git checkout "$dev_branch"
|
|
||||||
git pull origin "$dev_branch"
|
|
||||||
|
|
||||||
git checkout "$master_branch"
|
|
||||||
git merge --no-ff "$dev_branch" -m "Merge $dev_branch into $master_branch"
|
|
||||||
|
|
||||||
git push origin "$master_branch"
|
|
||||||
echo "Branch $dev_branch wurde in $master_branch gemerged."
|
|
||||||
}
|
|
||||||
|
|
||||||
push_changes() {
|
|
||||||
local branch commit_msg version_tag confirm
|
|
||||||
|
|
||||||
branch=$(git rev-parse --abbrev-ref HEAD)
|
|
||||||
read -rp "Aktueller Branch: $branch. Ist das korrekt? (y/n): " confirm
|
|
||||||
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
|
|
||||||
echo "Abgebrochen."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
read -rp "Bitte Commit-Nachricht eingeben (default: 'Update'): " commit_msg
|
|
||||||
commit_msg=${commit_msg:-Update}
|
|
||||||
|
|
||||||
echo "Änderungen werden gestaged..."
|
|
||||||
git add .
|
|
||||||
echo "Commit wird erstellt..."
|
|
||||||
git commit -m "$commit_msg" || echo "Nichts zu committen"
|
|
||||||
|
|
||||||
if [[ "$branch" == "master" ]]; then
|
|
||||||
while true; do
|
|
||||||
read -rp "Bitte Versionsnummer für Master-Release Tag eingeben (z.B. v0.2.0): " version_tag
|
|
||||||
if [[ -n "$version_tag" ]]; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
echo "Versionsnummer darf nicht leer sein."
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Push nach origin/$branch..."
|
|
||||||
git push origin "$branch"
|
|
||||||
|
|
||||||
if [[ "$branch" == "master" ]]; then
|
|
||||||
git tag -a "$version_tag" -m "Release $version_tag"
|
|
||||||
git push origin "$version_tag"
|
|
||||||
echo "Tag $version_tag gesetzt und gepusht."
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Push abgeschlossen."
|
|
||||||
}
|
|
||||||
|
|
||||||
docker_release() {
|
|
||||||
local ghcr_username="mboehmlaender"
|
|
||||||
local repo_name="stackpulse"
|
|
||||||
local branch version_tag
|
|
||||||
|
|
||||||
branch=$(git rev-parse --abbrev-ref HEAD)
|
|
||||||
if [[ "$branch" != "master" ]]; then
|
|
||||||
echo "Fehler: Du musst auf 'master' sein, um ein Release zu machen."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
while true; do
|
|
||||||
read -rp "Bitte Versionsnummer für das Docker-Image eingeben (z.B. v0.1): " version_tag
|
|
||||||
if [[ -n "$version_tag" ]]; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
echo "Versionsnummer darf nicht leer sein."
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ -z "$CR_PAT" ]]; then
|
|
||||||
echo "CR_PAT (GitHub Token) nicht gesetzt! Bitte export CR_PAT=<token>"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "$CR_PAT" | docker login ghcr.io -u "$ghcr_username" --password-stdin
|
|
||||||
docker build -t "ghcr.io/$ghcr_username/$repo_name:$version_tag" .
|
|
||||||
docker tag "ghcr.io/$ghcr_username/$repo_name:$version_tag" "ghcr.io/$ghcr_username/$repo_name:latest"
|
|
||||||
|
|
||||||
docker push "ghcr.io/$ghcr_username/$repo_name:$version_tag"
|
|
||||||
docker push "ghcr.io/$ghcr_username/$repo_name:latest"
|
|
||||||
|
|
||||||
echo "Docker-Release $version_tag erfolgreich gebaut und zu GHCR gepusht!"
|
|
||||||
}
|
|
||||||
|
|
||||||
start_dev_environment() {
|
|
||||||
local back_pid front_pid
|
|
||||||
|
|
||||||
echo "🚀 Starte StackPulse Dev-Umgebung..."
|
|
||||||
|
|
||||||
pushd backend >/dev/null
|
|
||||||
npm install
|
|
||||||
npm start &
|
|
||||||
back_pid=$!
|
|
||||||
popd >/dev/null
|
|
||||||
|
|
||||||
pushd frontend >/dev/null
|
|
||||||
npm install
|
|
||||||
npm run dev &
|
|
||||||
front_pid=$!
|
|
||||||
npm run build
|
|
||||||
popd >/dev/null
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "✅ StackPulse läuft lokal:"
|
|
||||||
echo "Frontend (Vite Dev): http://localhost:5173"
|
|
||||||
echo "Backend API: http://localhost:4001"
|
|
||||||
echo "Beenden mit STRG+C"
|
|
||||||
|
|
||||||
wait "$back_pid" "$front_pid"
|
|
||||||
}
|
|
||||||
|
|
||||||
manage_stash() {
|
|
||||||
local current_branch action user_input stash_name choice selected_stash
|
|
||||||
local -A stash_map
|
|
||||||
local -a stash_list
|
|
||||||
local i line stash_ref stash_msg
|
|
||||||
|
|
||||||
current_branch=$(git rev-parse --abbrev-ref HEAD)
|
|
||||||
|
|
||||||
echo "Aktueller Branch: $current_branch"
|
|
||||||
echo "Was möchtest du tun?"
|
|
||||||
echo "1) Neuen Stash anlegen"
|
|
||||||
echo "2) Vorhandenen Stash laden (apply)"
|
|
||||||
echo "3) Vorhandenen Stash löschen"
|
|
||||||
echo "4) Stash anwenden und löschen (pop)"
|
|
||||||
read -rp "Auswahl: " action
|
|
||||||
|
|
||||||
case $action in
|
|
||||||
1)
|
|
||||||
read -rp "Gib einen Namen für den Stash ein: " user_input
|
|
||||||
stash_name="$current_branch - $user_input"
|
|
||||||
|
|
||||||
if git stash list | grep -q "$stash_name"; then
|
|
||||||
while IFS= read -r line; do
|
|
||||||
stash_ref=$(echo "$line" | awk -F: '{print $1}')
|
|
||||||
echo "Lösche vorhandenen Stash: $stash_ref"
|
|
||||||
git stash drop "$stash_ref"
|
|
||||||
done < <(git stash list | grep "$stash_name")
|
|
||||||
fi
|
|
||||||
|
|
||||||
git stash push -u -m "$stash_name"
|
|
||||||
echo "Stash '$stash_name' wurde angelegt."
|
|
||||||
;;
|
|
||||||
|
|
||||||
2|3|4)
|
|
||||||
local action_text
|
|
||||||
case $action in
|
|
||||||
2) action_text="laden" ;;
|
|
||||||
3) action_text="löschen" ;;
|
|
||||||
4) action_text="anwenden & löschen" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo "Liste aller Stashes für Branch '$current_branch':"
|
|
||||||
mapfile -t stash_list < <(git stash list | grep "$current_branch") || true
|
|
||||||
|
|
||||||
if [[ ${#stash_list[@]} -eq 0 ]]; then
|
|
||||||
echo "Keine Stashes für diesen Branch vorhanden."
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
i=1
|
|
||||||
for line in "${stash_list[@]}"; do
|
|
||||||
stash_ref=$(echo "$line" | awk -F: '{print $1}')
|
|
||||||
stash_msg=$(echo "$line" | cut -d':' -f3- | sed 's/^ //')
|
|
||||||
echo " $i) $stash_ref -> $stash_msg"
|
|
||||||
stash_map[$i]=$stash_ref
|
|
||||||
((i++))
|
|
||||||
done
|
|
||||||
|
|
||||||
read -rp "Wähle einen Stash zum ${action_text} (Nummer): " choice
|
|
||||||
if [[ -z "${stash_map[$choice]}" ]]; then
|
|
||||||
echo "Ungültige Auswahl!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
selected_stash=${stash_map[$choice]}
|
|
||||||
|
|
||||||
case $action in
|
|
||||||
2)
|
|
||||||
echo "Wende Stash an: $selected_stash"
|
|
||||||
git stash apply "$selected_stash"
|
|
||||||
;;
|
|
||||||
3)
|
|
||||||
echo "Lösche Stash: $selected_stash"
|
|
||||||
git stash drop "$selected_stash"
|
|
||||||
;;
|
|
||||||
4)
|
|
||||||
echo "Wende Stash an und lösche ihn: $selected_stash"
|
|
||||||
git stash pop "$selected_stash"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "Ungültige Auswahl!"
|
|
||||||
return 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
switch_branch() {
|
|
||||||
local -a unversioned_files=("scripts/dev-script.sh")
|
|
||||||
local file
|
|
||||||
local local_branches remote_branches all_branches master_branch dev_branch feature_branches
|
|
||||||
local -a sorted_branches
|
|
||||||
local i=1 choice selected_branch
|
|
||||||
declare -A branch_map
|
|
||||||
|
|
||||||
for file in "${unversioned_files[@]}"; do
|
|
||||||
if [[ -f "$file" ]]; then
|
|
||||||
mkdir -p /tmp/git_safe_backup
|
|
||||||
cp "$file" "/tmp/git_safe_backup/$(basename "$file")"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
local_branches=$(git branch | sed 's/* //' | sed 's/^[[:space:]]*//')
|
|
||||||
remote_branches=$(git branch -r | grep -v 'HEAD' | sed 's|^[[:space:]]*origin/||' | sed 's/^[[:space:]]*//')
|
|
||||||
all_branches=$(printf "%s\n%s\n" "$local_branches" "$remote_branches" | sort -u)
|
|
||||||
|
|
||||||
master_branch=$(echo "$all_branches" | grep -x 'master' || true)
|
|
||||||
dev_branch=$(echo "$all_branches" | grep -x 'dev' || true)
|
|
||||||
feature_branches=$(echo "$all_branches" | grep '^feature/' | sort || true)
|
|
||||||
|
|
||||||
[[ -n "$master_branch" ]] && sorted_branches+=("$master_branch")
|
|
||||||
[[ -n "$dev_branch" ]] && sorted_branches+=("$dev_branch")
|
|
||||||
if [[ -n "$feature_branches" ]]; then
|
|
||||||
while IFS= read -r line; do
|
|
||||||
[[ -n "$line" ]] && sorted_branches+=("$line")
|
|
||||||
done <<< "$feature_branches"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${#sorted_branches[@]} -eq 0 ]]; then
|
|
||||||
echo "Keine Branches gefunden."
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Verfügbare Branches:"
|
|
||||||
for line in "${sorted_branches[@]}"; do
|
|
||||||
echo " $i) $line"
|
|
||||||
branch_map[$i]=$line
|
|
||||||
((i++))
|
|
||||||
done
|
|
||||||
|
|
||||||
read -rp "Wähle einen Branch (Nummer): " choice
|
|
||||||
if [[ -z "${branch_map[$choice]}" ]]; then
|
|
||||||
echo "Ungültige Auswahl!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
selected_branch=${branch_map[$choice]}
|
|
||||||
echo "Wechsle zu Branch: $selected_branch"
|
|
||||||
|
|
||||||
git fetch origin
|
|
||||||
|
|
||||||
if git show-ref --verify --quiet "refs/heads/$selected_branch"; then
|
|
||||||
git checkout "$selected_branch"
|
|
||||||
else
|
|
||||||
git checkout -b "$selected_branch" "origin/$selected_branch"
|
|
||||||
fi
|
|
||||||
|
|
||||||
git reset --hard "origin/$selected_branch"
|
|
||||||
git clean -fd
|
|
||||||
|
|
||||||
for file in "${unversioned_files[@]}"; do
|
|
||||||
if [[ -f "/tmp/git_safe_backup/$(basename "$file")" ]]; then
|
|
||||||
mkdir -p "$(dirname "$file")"
|
|
||||||
mv "/tmp/git_safe_backup/$(basename "$file")" "$file"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
rm -rf /tmp/git_safe_backup
|
|
||||||
|
|
||||||
echo "Branch '$selected_branch' ist nun aktiv. Arbeitsverzeichnis entspricht exakt dem Remote-Stand."
|
|
||||||
echo "Gesicherte Dateien wurden wiederhergestellt."
|
|
||||||
}
|
|
||||||
|
|
||||||
main() {
|
|
||||||
local selection
|
|
||||||
while true; do
|
|
||||||
echo ""
|
|
||||||
show_menu
|
|
||||||
read -rp "Auswahl: " selection
|
|
||||||
echo ""
|
|
||||||
case $selection in
|
|
||||||
1)
|
|
||||||
create_new_feature
|
|
||||||
pause_for_menu
|
|
||||||
;;
|
|
||||||
2)
|
|
||||||
merge_feature_into_dev
|
|
||||||
pause_for_menu
|
|
||||||
;;
|
|
||||||
3)
|
|
||||||
merge_dev_into_master
|
|
||||||
pause_for_menu
|
|
||||||
;;
|
|
||||||
4)
|
|
||||||
push_changes
|
|
||||||
pause_for_menu
|
|
||||||
;;
|
|
||||||
5)
|
|
||||||
docker_release
|
|
||||||
pause_for_menu
|
|
||||||
;;
|
|
||||||
6)
|
|
||||||
start_dev_environment
|
|
||||||
pause_for_menu
|
|
||||||
;;
|
|
||||||
7)
|
|
||||||
manage_stash
|
|
||||||
pause_for_menu
|
|
||||||
;;
|
|
||||||
8)
|
|
||||||
switch_branch
|
|
||||||
pause_for_menu
|
|
||||||
;;
|
|
||||||
0)
|
|
||||||
echo "Auf Wiedersehen!"
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "❌ Ungültige Auswahl."
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
main "$@"
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# --- Konfiguration ---
|
|
||||||
GHCR_USERNAME="mboehmlaender"
|
|
||||||
REPO_NAME="stackpulse"
|
|
||||||
|
|
||||||
# --- Branch prüfen ---
|
|
||||||
BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
||||||
if [[ "$BRANCH" != "master" ]]; then
|
|
||||||
echo "Fehler: Du musst auf 'master' sein, um ein Release zu machen."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --- Versionsnummer abfragen ---
|
|
||||||
while true; do
|
|
||||||
read -p "Bitte Versionsnummer für das Docker-Image eingeben (z.B. v0.1): " VERSION_TAG
|
|
||||||
if [[ -n "$VERSION_TAG" ]]; then break; else echo "Versionsnummer darf nicht leer sein."; fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# --- Docker: Login ---
|
|
||||||
if [ -z "$CR_PAT" ]; then
|
|
||||||
echo "CR_PAT (GitHub Token) nicht gesetzt! Bitte export CR_PAT=<token>"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo $CR_PAT | docker login ghcr.io -u $GHCR_USERNAME --password-stdin
|
|
||||||
|
|
||||||
# --- Docker: Build & Tag ---
|
|
||||||
docker build -t ghcr.io/$GHCR_USERNAME/$REPO_NAME:$VERSION_TAG .
|
|
||||||
docker tag ghcr.io/$GHCR_USERNAME/$REPO_NAME:$VERSION_TAG ghcr.io/$GHCR_USERNAME/$REPO_NAME:latest
|
|
||||||
|
|
||||||
# --- Docker: Push ---
|
|
||||||
docker push ghcr.io/$GHCR_USERNAME/$REPO_NAME:$VERSION_TAG
|
|
||||||
docker push ghcr.io/$GHCR_USERNAME/$REPO_NAME:latest
|
|
||||||
|
|
||||||
echo "Docker-Release $VERSION_TAG erfolgreich gebaut und zu GHCR gepusht!"
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Aktuellen Branch herausfinden
|
|
||||||
BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
||||||
|
|
||||||
# Branch bestätigen
|
|
||||||
read -p "Aktueller Branch: $BRANCH. Ist das korrekt? (y/n): " CONFIRM
|
|
||||||
if [[ "$CONFIRM" != "y" && "$CONFIRM" != "Y" ]]; then
|
|
||||||
echo "Abgebrochen."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Commit-Nachricht
|
|
||||||
read -p "Bitte Commit-Nachricht eingeben (default: 'Update'): " COMMIT_MSG
|
|
||||||
COMMIT_MSG=${COMMIT_MSG:-Update}
|
|
||||||
|
|
||||||
# Änderungen stagen und committen
|
|
||||||
echo "Änderungen werden gestaged..."
|
|
||||||
git add .
|
|
||||||
echo "Commit wird erstellt..."
|
|
||||||
git commit -m "$COMMIT_MSG" || echo "Nichts zu committen"
|
|
||||||
|
|
||||||
# Prüfen, ob Branch master ist
|
|
||||||
if [[ "$BRANCH" == "master" ]]; then
|
|
||||||
# Versionsnummer verpflichtend abfragen
|
|
||||||
while true; do
|
|
||||||
read -p "Bitte Versionsnummer für Master-Release Tag eingeben (z.B. v0.2.0): " VERSION_TAG
|
|
||||||
if [[ -n "$VERSION_TAG" ]]; then
|
|
||||||
break
|
|
||||||
else
|
|
||||||
echo "Versionsnummer darf nicht leer sein. Bitte eingeben."
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Push Branch
|
|
||||||
echo "Push nach origin/$BRANCH..."
|
|
||||||
git push origin "$BRANCH"
|
|
||||||
|
|
||||||
# Tag setzen und pushen, nur bei master
|
|
||||||
if [[ "$BRANCH" == "master" ]]; then
|
|
||||||
git tag -a "$VERSION_TAG" -m "Release $VERSION_TAG"
|
|
||||||
git push origin "$VERSION_TAG"
|
|
||||||
echo "Tag $VERSION_TAG gesetzt und gepusht."
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Push abgeschlossen."
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Skript: Dev in Master mergen
|
|
||||||
|
|
||||||
DEV_BRANCH="dev"
|
|
||||||
MASTER_BRANCH="master"
|
|
||||||
|
|
||||||
# Auf master wechseln und aktuell holen
|
|
||||||
git checkout $MASTER_BRANCH
|
|
||||||
git pull origin $MASTER_BRANCH
|
|
||||||
|
|
||||||
# Dev aktuell holen
|
|
||||||
git checkout $DEV_BRANCH
|
|
||||||
git pull origin $DEV_BRANCH
|
|
||||||
|
|
||||||
# Merge Dev in Master
|
|
||||||
git checkout $MASTER_BRANCH
|
|
||||||
git merge --no-ff $DEV_BRANCH -m "Merge $DEV_BRANCH into $MASTER_BRANCH"
|
|
||||||
|
|
||||||
# Push Master auf Remote
|
|
||||||
git push origin $MASTER_BRANCH
|
|
||||||
|
|
||||||
echo "Branch $DEV_BRANCH wurde in $MASTER_BRANCH gemerged."
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Skript: Feature in Dev mergen mit Auswahl der Feature-Branches
|
|
||||||
|
|
||||||
DEV_BRANCH="dev"
|
|
||||||
|
|
||||||
# Auflisten aller Feature-Branches (lokal und remote)
|
|
||||||
echo "Verfügbare Feature-Branches:"
|
|
||||||
FEATURE_BRANCHES=$(git branch -r | grep 'origin/feature/' | sed 's|origin/||')
|
|
||||||
PS3="Bitte wähle einen Feature-Branch zum Mergen: "
|
|
||||||
|
|
||||||
# in ein Array konvertieren
|
|
||||||
BRANCH_ARRAY=($FEATURE_BRANCHES)
|
|
||||||
|
|
||||||
# Auswahlmenü anzeigen
|
|
||||||
select CHOSEN_BRANCH in "${BRANCH_ARRAY[@]}"; do
|
|
||||||
if [[ -n "$CHOSEN_BRANCH" ]]; then
|
|
||||||
FEATURE_BRANCH=$CHOSEN_BRANCH
|
|
||||||
break
|
|
||||||
else
|
|
||||||
echo "Ungültige Auswahl. Bitte erneut versuchen."
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "Ausgewählter Feature-Branch: $FEATURE_BRANCH"
|
|
||||||
|
|
||||||
# Dev aktuell holen
|
|
||||||
git checkout $DEV_BRANCH
|
|
||||||
git pull origin $DEV_BRANCH
|
|
||||||
|
|
||||||
# Feature-Branch aktuell holen
|
|
||||||
git checkout $FEATURE_BRANCH
|
|
||||||
git pull origin $FEATURE_BRANCH
|
|
||||||
|
|
||||||
# Merge Feature in Dev
|
|
||||||
git checkout $DEV_BRANCH
|
|
||||||
git merge --no-ff $FEATURE_BRANCH -m "Merge $FEATURE_BRANCH into $DEV_BRANCH"
|
|
||||||
|
|
||||||
# Push Dev auf Remote
|
|
||||||
git push origin $DEV_BRANCH
|
|
||||||
|
|
||||||
echo "Feature $FEATURE_BRANCH wurde erfolgreich in $DEV_BRANCH gemerged."
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Skript: Neues Feature erstellen
|
|
||||||
|
|
||||||
MASTER_BRANCH="master"
|
|
||||||
|
|
||||||
# Abfrage Feature-Name
|
|
||||||
read -p "Bitte den Namen des neuen Features eingeben: " FEATURE_NAME
|
|
||||||
|
|
||||||
# Falls nichts eingegeben wurde, Skript abbrechen
|
|
||||||
if [ -z "$FEATURE_NAME" ]; then
|
|
||||||
echo "❌ Fehler: Kein Feature-Name angegeben."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Validierung: nur erlaubte Zeichen
|
|
||||||
if [[ "$FEATURE_NAME" =~ [^a-zA-Z0-9._-] ]]; then
|
|
||||||
echo "❌ Fehler: Ungültiger Branch-Name. Bitte nur Buchstaben, Zahlen, Punkt, Unterstrich oder Bindestrich verwenden."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
FEATURE_BRANCH="feature/$FEATURE_NAME"
|
|
||||||
|
|
||||||
# Check auf uncommittete Änderungen
|
|
||||||
if ! git diff-index --quiet HEAD --; then
|
|
||||||
echo "⚠️ Es gibt noch uncommittete Änderungen. Bitte committen oder stashen, bevor ein neuer Branch erstellt wird."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Prüfen, ob Branch lokal schon existiert
|
|
||||||
if git show-ref --verify --quiet refs/heads/$FEATURE_BRANCH; then
|
|
||||||
echo "❌ Fehler: Der Branch '$FEATURE_BRANCH' existiert lokal bereits."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Prüfen, ob Branch remote schon existiert
|
|
||||||
if git ls-remote --heads origin $FEATURE_BRANCH | grep -q $FEATURE_BRANCH; then
|
|
||||||
echo "❌ Fehler: Der Branch '$FEATURE_BRANCH' existiert bereits auf Remote."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Auf master wechseln und aktualisieren
|
|
||||||
git checkout $MASTER_BRANCH
|
|
||||||
git pull origin $MASTER_BRANCH
|
|
||||||
|
|
||||||
# Neuen Feature-Branch erstellen und auschecken
|
|
||||||
git checkout -b $FEATURE_BRANCH $MASTER_BRANCH
|
|
||||||
|
|
||||||
# Branch auf Remote pushen
|
|
||||||
git push -u origin $FEATURE_BRANCH
|
|
||||||
|
|
||||||
# Commit-Hash der Basis holen
|
|
||||||
BASE_COMMIT=$(git rev-parse --short HEAD)
|
|
||||||
|
|
||||||
echo "✅ Neuer Feature-Branch '$FEATURE_BRANCH' wurde erstellt und auf Remote gepusht."
|
|
||||||
echo " Basis: $MASTER_BRANCH@$BASE_COMMIT"
|
|
||||||
@@ -1,138 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# ===============================
|
|
||||||
# Git Stash Manager mit Branch-Filter und Überschreiben
|
|
||||||
# ===============================
|
|
||||||
|
|
||||||
# Aktuellen Branch ermitteln
|
|
||||||
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
||||||
|
|
||||||
echo "Aktueller Branch: $CURRENT_BRANCH"
|
|
||||||
echo "Was möchtest du tun?"
|
|
||||||
echo "1) Neuen Stash anlegen"
|
|
||||||
echo "2) Vorhandenen Stash laden (apply)"
|
|
||||||
echo "3) Vorhandenen Stash löschen"
|
|
||||||
echo "4) Stash anwenden und löschen (pop)"
|
|
||||||
read -p "Auswahl: " action
|
|
||||||
|
|
||||||
case $action in
|
|
||||||
1)
|
|
||||||
# ========== Neuen Stash anlegen ==========
|
|
||||||
read -p "Gib einen Namen für den Stash ein: " USER_INPUT
|
|
||||||
STASH_NAME="$CURRENT_BRANCH - $USER_INPUT"
|
|
||||||
|
|
||||||
# Prüfen, ob Stash-Name schon existiert
|
|
||||||
EXISTING=$(git stash list | grep "$STASH_NAME")
|
|
||||||
if [[ -n "$EXISTING" ]]; then
|
|
||||||
echo "Ein Stash mit dem Namen '$STASH_NAME' existiert bereits."
|
|
||||||
# Alle passenden Stashes löschen
|
|
||||||
while IFS= read -r line; do
|
|
||||||
STASH_REF=$(echo "$line" | awk -F: '{print $1}')
|
|
||||||
echo "Lösche vorhandenen Stash: $STASH_REF"
|
|
||||||
git stash drop "$STASH_REF"
|
|
||||||
done <<< "$EXISTING"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Neuen Stash anlegen (inkl. untracked Dateien)
|
|
||||||
git stash push -u -m "$STASH_NAME"
|
|
||||||
echo "Stash '$STASH_NAME' wurde angelegt."
|
|
||||||
;;
|
|
||||||
|
|
||||||
2)
|
|
||||||
# ========== Stash anwenden ==========
|
|
||||||
echo "Liste aller Stashes für Branch '$CURRENT_BRANCH':"
|
|
||||||
STASHES=$(git stash list | grep "$CURRENT_BRANCH")
|
|
||||||
|
|
||||||
if [[ -z "$STASHES" ]]; then
|
|
||||||
echo "Keine Stashes für diesen Branch vorhanden."
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
i=1
|
|
||||||
declare -A STASH_MAP
|
|
||||||
while IFS= read -r line; do
|
|
||||||
STASH_REF=$(echo "$line" | awk -F: '{print $1}')
|
|
||||||
STASH_MSG=$(echo "$line" | cut -d':' -f3- | sed 's/^ //')
|
|
||||||
echo "$i) $STASH_REF -> $STASH_MSG"
|
|
||||||
STASH_MAP[$i]=$STASH_REF
|
|
||||||
((i++))
|
|
||||||
done <<< "$STASHES"
|
|
||||||
|
|
||||||
read -p "Wähle einen Stash (Nummer): " choice
|
|
||||||
if [[ -z "${STASH_MAP[$choice]}" ]]; then
|
|
||||||
echo "Ungültige Auswahl!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
SELECTED_STASH=${STASH_MAP[$choice]}
|
|
||||||
echo "Wende Stash an: $SELECTED_STASH"
|
|
||||||
git stash apply "$SELECTED_STASH"
|
|
||||||
;;
|
|
||||||
|
|
||||||
3)
|
|
||||||
# ========== Stash löschen ==========
|
|
||||||
echo "Liste aller Stashes für Branch '$CURRENT_BRANCH':"
|
|
||||||
STASHES=$(git stash list | grep "$CURRENT_BRANCH")
|
|
||||||
|
|
||||||
if [[ -z "$STASHES" ]]; then
|
|
||||||
echo "Keine Stashes für diesen Branch vorhanden."
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
i=1
|
|
||||||
declare -A STASH_MAP
|
|
||||||
while IFS= read -r line; do
|
|
||||||
STASH_REF=$(echo "$line" | awk -F: '{print $1}')
|
|
||||||
STASH_MSG=$(echo "$line" | cut -d':' -f3- | sed 's/^ //')
|
|
||||||
echo "$i) $STASH_REF -> $STASH_MSG"
|
|
||||||
STASH_MAP[$i]=$STASH_REF
|
|
||||||
((i++))
|
|
||||||
done <<< "$STASHES"
|
|
||||||
|
|
||||||
read -p "Wähle einen Stash zum Löschen (Nummer): " choice
|
|
||||||
if [[ -z "${STASH_MAP[$choice]}" ]]; then
|
|
||||||
echo "Ungültige Auswahl!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
SELECTED_STASH=${STASH_MAP[$choice]}
|
|
||||||
echo "Lösche Stash: $SELECTED_STASH"
|
|
||||||
git stash drop "$SELECTED_STASH"
|
|
||||||
;;
|
|
||||||
|
|
||||||
4)
|
|
||||||
# ========== Stash anwenden und löschen (pop) ==========
|
|
||||||
echo "Liste aller Stashes für Branch '$CURRENT_BRANCH':"
|
|
||||||
STASHES=$(git stash list | grep "$CURRENT_BRANCH")
|
|
||||||
|
|
||||||
if [[ -z "$STASHES" ]]; then
|
|
||||||
echo "Keine Stashes für diesen Branch vorhanden."
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
i=1
|
|
||||||
declare -A STASH_MAP
|
|
||||||
while IFS= read -r line; do
|
|
||||||
STASH_REF=$(echo "$line" | awk -F: '{print $1}')
|
|
||||||
STASH_MSG=$(echo "$line" | cut -d':' -f3- | sed 's/^ //')
|
|
||||||
echo "$i) $STASH_REF -> $STASH_MSG"
|
|
||||||
STASH_MAP[$i]=$STASH_REF
|
|
||||||
((i++))
|
|
||||||
done <<< "$STASHES"
|
|
||||||
|
|
||||||
read -p "Wähle einen Stash zum Anwenden & Löschen (Nummer): " choice
|
|
||||||
if [[ -z "${STASH_MAP[$choice]}" ]]; then
|
|
||||||
echo "Ungültige Auswahl!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
SELECTED_STASH=${STASH_MAP[$choice]}
|
|
||||||
echo "Wende Stash an und lösche ihn: $SELECTED_STASH"
|
|
||||||
git stash pop "$SELECTED_STASH"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "Ungültige Auswahl!"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# ===============================
|
|
||||||
# Dateien sichern, die nicht gepusht werden
|
|
||||||
# ===============================
|
|
||||||
UNVERSIONED_FILES=("scripts/docker-release.sh")
|
|
||||||
for f in "${UNVERSIONED_FILES[@]}"; do
|
|
||||||
if [[ -f $f ]]; then
|
|
||||||
mkdir -p /tmp/git_safe_backup
|
|
||||||
cp "$f" "/tmp/git_safe_backup/$(basename "$f")"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# ===============================
|
|
||||||
# Alle Branches sammeln
|
|
||||||
# ===============================
|
|
||||||
# Alle lokalen Branches holen, führende Sternchen und Leerzeichen entfernen
|
|
||||||
LOCAL_BRANCHES=$(git branch | sed 's/* //' | sed 's/^[[:space:]]*//')
|
|
||||||
|
|
||||||
# Alle Remote-Branches holen, 'origin/' entfernen, HEAD ignorieren, führende Leerzeichen entfernen
|
|
||||||
REMOTE_BRANCHES=$(git branch -r | grep -v 'HEAD' | sed 's|origin/||' | sed 's/^[[:space:]]*//')
|
|
||||||
|
|
||||||
# Beide Listen zusammenführen und Duplikate entfernen
|
|
||||||
ALL_BRANCHES=$(echo -e "$LOCAL_BRANCHES\n$REMOTE_BRANCHES" | sort -u)
|
|
||||||
|
|
||||||
# Master und dev extrahieren, restliche feature-Branches alphabetisch
|
|
||||||
MASTER_BRANCH=$(echo "$ALL_BRANCHES" | grep -x 'master')
|
|
||||||
DEV_BRANCH=$(echo "$ALL_BRANCHES" | grep -x 'dev')
|
|
||||||
FEATURE_BRANCHES=$(echo "$ALL_BRANCHES" | grep '^feature/' | sort)
|
|
||||||
|
|
||||||
# Zusammenführen
|
|
||||||
SORTED_BRANCHES=()
|
|
||||||
[[ -n "$MASTER_BRANCH" ]] && SORTED_BRANCHES+=("$MASTER_BRANCH")
|
|
||||||
[[ -n "$DEV_BRANCH" ]] && SORTED_BRANCHES+=("$DEV_BRANCH")
|
|
||||||
for branch in $FEATURE_BRANCHES; do
|
|
||||||
SORTED_BRANCHES+=("$branch")
|
|
||||||
done
|
|
||||||
|
|
||||||
# Branches nummerieren
|
|
||||||
echo "Verfügbare Branches:"
|
|
||||||
i=1
|
|
||||||
declare -A BRANCH_MAP
|
|
||||||
for branch in "${SORTED_BRANCHES[@]}"; do
|
|
||||||
echo "$i) $branch"
|
|
||||||
BRANCH_MAP[$i]=$branch
|
|
||||||
((i++))
|
|
||||||
done
|
|
||||||
|
|
||||||
# Auswahl abfragen
|
|
||||||
read -p "Wähle einen Branch (Nummer): " choice
|
|
||||||
|
|
||||||
# Validierung
|
|
||||||
if [[ -z "${BRANCH_MAP[$choice]}" ]]; then
|
|
||||||
echo "Ungültige Auswahl!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
SELECTED_BRANCH=${BRANCH_MAP[$choice]}
|
|
||||||
echo "Wechsle zu Branch: $SELECTED_BRANCH"
|
|
||||||
|
|
||||||
# Remote-Stand holen
|
|
||||||
git fetch origin
|
|
||||||
|
|
||||||
# Branch wechseln (lokal erstellen, falls nur remote vorhanden)
|
|
||||||
if git show-ref --verify --quiet refs/heads/$SELECTED_BRANCH; then
|
|
||||||
git checkout $SELECTED_BRANCH
|
|
||||||
else
|
|
||||||
git checkout -b $SELECTED_BRANCH origin/$SELECTED_BRANCH
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Arbeitsverzeichnis exakt auf Remote-Branch zurücksetzen
|
|
||||||
git reset --hard origin/$SELECTED_BRANCH
|
|
||||||
git clean -fd
|
|
||||||
|
|
||||||
# ===============================
|
|
||||||
# Gesicherte unversionierte Dateien zurückkopieren
|
|
||||||
# ===============================
|
|
||||||
for f in "${UNVERSIONED_FILES[@]}"; do
|
|
||||||
if [[ -f "/tmp/git_safe_backup/$(basename "$f")" ]]; then
|
|
||||||
mkdir -p "$(dirname "$f")"
|
|
||||||
mv "/tmp/git_safe_backup/$(basename "$f")" "$f"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
rm -rf /tmp/git_safe_backup
|
|
||||||
|
|
||||||
echo "Branch '$SELECTED_BRANCH' ist nun aktiv. Arbeitsverzeichnis entspricht exakt dem Remote-Stand."
|
|
||||||
echo "Unversionierte Dateien wurden wiederhergestellt."
|
|
||||||
Reference in New Issue
Block a user