Compare commits

...

2 Commits

Author SHA1 Message Date
alf
9180d0f564 README.md aktualisiert 2025-06-25 10:51:00 +00:00
8e6b57abc3 Neu nach Konsultation von chatGPT 2025-06-25 12:47:19 +02:00
6 changed files with 149 additions and 160 deletions

View File

@ -20,12 +20,10 @@ chmod +x .git/hooks/pre-commit
~~~
### Die Scripte ###
> Bei Nutzung der Scripte ist der pre-commit-Hook eigentlich nicht erforderlich; er dient als Schutzschicht, falls die Scripte fehlerhaft sein sollten.
> Beide Scripte verfügen nicht über einen _push_.
#### Das Cron-Script einrichten ####
Um automatisiert Dateien dem WORM-Speicher zuzuführen, werden sie im Verzeichnis "Neu" gespeichert (auch Unterverzeichnisse). Cron sorgt für die Übertragung der Dateien von "Neu" nach "Archiv", die noch nicht im WORM-Speicher vorhanden sind (sync_archive.sh). Übertragene Dateien werden gelöscht, nicht übertragene Dateien verbleiben im Verzeichnis "Neu".
#### Script mit Umbenennung ####
Beim Aufruf des Scriptes "interactive_archive_sync.sh" werden alle neuen Dateien von "Neu" nach "Archiv" verschoben. Im "Archiv" bereits vorhandene Dateien können auf Wunsch mit einer Versionsnummer versehen werden und __dann__ dem Archiv zugeführt werden.
N. N.

98
commit-wrapper.sh Normal file
View File

@ -0,0 +1,98 @@
#!/bin/bash
set -euo pipefail
cd "$(dirname "$0")"
LOGFILE="archiv.log"
TIMESTAMP() { date '+%Y-%m-%d %H:%M:%S'; }
log() {
echo "[$(TIMESTAMP)] $1" | tee -a "$LOGFILE"
}
RESTORE_SCRIPT="./restore-archiv.sh"
log "➡️ Starte Archivierungslauf..."
# 1. Dateien aus Neu/ prüfen und nach Archiv/ kopieren
for file in Neu/*; do
[ -e "$file" ] || continue
base=$(basename "$file")
target="Archiv/$base"
if [ -e "$target" ]; then
log "⚠️ Datei '$base' existiert bereits im Archiv. Archivierung abgebrochen."
echo "⚠️ Datei '$base' existiert bereits im Archiv! Bitte umbenennen oder löschen."
exit 1
fi
done
# Kopieren & Löschen
for file in Neu/*; do
[ -e "$file" ] || continue
base=$(basename "$file")
target="Archiv/$base"
cp "$file" "$target"
log "✅ '$base' nach Archiv kopiert."
done
for file in Neu/*; do
[ -e "$file" ] || continue
base=$(basename "$file")
rm "$file"
log "🧹 '$base' aus Neu gelöscht."
done
# 2. Änderungen vormerken (inkl. Löschungen)
# Änderungen vollständig vormerken (auch neue Dateien)
git add --all
log "📝 Alle Änderungen vorgemerkt (git add --all)."
# Prüfen, ob es Änderungen gibt (gestaged oder nicht)
if git status --porcelain | grep . >/dev/null; then
# es gibt Änderungen, Commit starten
if git commit -m "Archivierung von Dateien aus Neu am $(TIMESTAMP)"; then
log "✅ Commit erfolgreich."
else
# Commit fehlgeschlagen: Restore ausführen ...
log "❌ Commit fehlgeschlagen. Versuche Archiv wiederherzustellen..."
echo "⚠️ Commit abgebrochen, da Änderungen im Archiv blockiert wurden."
if [ -x "$RESTORE_SCRIPT" ]; then
"$RESTORE_SCRIPT"
log "♻️ Archiv wurde automatisch wiederhergestellt."
echo " Archiv wurde auf den letzten Commit zurückgesetzt."
else
log "❌ Restore-Skript '$RESTORE_SCRIPT' nicht gefunden oder nicht ausführbar!"
echo "⚠️ Restore-Skript nicht gefunden oder nicht ausführbar!"
fi
exit 1
fi
else
log "📭 Keine Änderungen zum Committen."
echo "Keine Änderungen zum Committen."
exit 0
fi
# 3. Commit versuchen
if git diff --cached --quiet; then
log "📭 Keine Änderungen zum Committen."
echo "Keine Änderungen zum Committen."
exit 0
else
if git commit -m "Archivierung von Dateien aus Neu am $(TIMESTAMP)"; then
log "✅ Commit erfolgreich."
exit 0
else
log "❌ Commit fehlgeschlagen. Versuche Archiv wiederherzustellen..."
echo "⚠️ Commit abgebrochen, da Änderungen im Archiv blockiert wurden."
if [ -x "$RESTORE_SCRIPT" ]; then
"$RESTORE_SCRIPT"
log "♻️ Archiv wurde automatisch wiederhergestellt."
echo " Archiv wurde auf den letzten Commit zurückgesetzt."
else
log "❌ Restore-Skript '$RESTORE_SCRIPT' nicht gefunden oder nicht ausführbar!"
echo "⚠️ Restore-Skript nicht gefunden oder nicht ausführbar!"
fi
exit 1
fi
fi

View File

@ -1,92 +0,0 @@
#!/bin/bash
## Anpassen !!! ##
GIT_REPO_PATH="/home/alf/MEINWORM"
NEW_FILES_DIR="Neu"
ARCHIVE_TARGET_DIR="Archiv"
LOG_FILE="/home/alf/archive_sync_interactive.log" # Pfad anpassen
## Ende des Anpassen-Blocks ##
log_message() { echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE"; }
get_next_version_number() {
local base_name="$1"
local extension="$2"
local max_version=0
local found_files=()
readarray -t found_files < <(find "$ARCHIVE_TARGET_DIR" -type f -name "${base_name}_v*.${extension}")
for existing_version_file in "${found_files[@]}"; do
local part_without_ext=$(basename "$existing_version_file" ".${extension}")
local current_version_str="${part_without_ext##*_v}"
if [[ -n "$current_version_str" && "$current_version_str" =~ ^[0-9]+$ ]]; then
if (( current_version_str > max_version )); then max_version=$current_version_str; fi
fi
done
echo $((max_version + 1))
}
log_message "--- Interactive Archive Sync Script Started ---"
cd "$GIT_REPO_PATH" || { log_message "ERROR: Could not change to Git repository directory. Exiting."; exit 1; }
mkdir -p "$ARCHIVE_TARGET_DIR"
readarray -t FILES_TO_PROCESS < <(find "$NEW_FILES_DIR" -type f)
for FILE_PATH_IN_NEW in "${FILES_TO_PROCESS[@]}"; do
FILE_FULL_NAME=$(basename "$FILE_PATH_IN_NEW")
FILE_NAME_NO_EXT="${FILE_FULL_NAME%.*}"
FILE_EXTENSION="${FILE_FULL_NAME##*.}"
TARGET_FILE_PATH_ORIG="$ARCHIVE_TARGET_DIR/$FILE_FULL_NAME"
log_message "Processing file: $FILE_PATH_IN_NEW"
if git ls-files --error-unmatch -- "$TARGET_FILE_PATH_ORIG" &>/dev/null; then
log_message " File '$FILE_FULL_NAME' already exists in '$ARCHIVE_TARGET_DIR/'."
echo ""
echo "Die Datei '$FILE_FULL_NAME' existiert bereits im Archiv."
echo "Möchten Sie diese Datei als neue Version (z.B. '${FILE_NAME_NO_EXT}_vX.${FILE_EXTENSION}') hinzufügen?"
read -p "[j/n/a (ja/nein/abbrechen)] " choice
echo ""
case "$choice" in
j|J )
NEXT_VERSION=$(get_next_version_number "$FILE_NAME_NO_EXT" "$FILE_EXTENSION")
NEW_VERSIONED_FILE_NAME="${FILE_NAME_NO_EXT}_v${NEXT_VERSION}.${FILE_EXTENSION}"
TARGET_FILE_PATH_VERSIONED="$ARCHIVE_TARGET_DIR/$NEW_VERSIONED_FILE_NAME"
log_message " Adding '$FILE_FULL_NAME' as versioned file: '$NEW_VERSIONED_FILE_NAME'."
cp "$FILE_PATH_IN_NEW" "$TARGET_FILE_PATH_VERSIONED"
git add "$TARGET_FILE_PATH_VERSIONED"
if ! git diff --cached --quiet --exit-code; then
git commit -m "Add versioned file: $NEW_VERSIONED_FILE_NAME" "$TARGET_FILE_PATH_VERSIONED" || {
log_message " ERROR: Commit for '$NEW_VERSIONED_FILE_NAME' failed. Restoring."
git restore --staged "$TARGET_FILE_PATH_VERSIONED"; git restore "$TARGET_FILE_PATH_VERSIONED"
}
if [ $? -eq 0 ]; then log_message " Successfully committed '$NEW_VERSIONED_FILE_NAME'."; fi
else log_message " WARNING: No changes staged for '$NEW_VERSIONED_FILE_NAME'. Skipping commit."; fi
;;
n|N ) log_message " Skipping '$FILE_FULL_NAME'. File remains in '$NEW_FILES_DIR'.";;
a|A ) log_message " User chose to abort. Exiting."; exit 0;;
* ) log_message " Invalid input for '$FILE_FULL_NAME'. Skipping and continuing.";;
esac
else
log_message " File '$FILE_FULL_NAME' is new to '$ARCHIVE_TARGET_DIR/'. Adding..."
cp "$FILE_PATH_IN_NEW" "$TARGET_FILE_PATH_ORIG"
git add "$TARGET_FILE_PATH_ORIG"
if ! git diff --cached --quiet --exit-code; then
git commit -m "Add new file: $FILE_FULL_NAME to archive" "$TARGET_FILE_PATH_ORIG" || {
log_message " ERROR: Commit for '$FILE_FULL_NAME' failed. (Possible pre-commit hook issue?)"
git restore --staged "$TARGET_FILE_PATH_ORIG"; git restore "$TARGET_FILE_PATH_ORIG"
}
if [ $? -eq 0 ]; then log_message " Successfully committed '$FILE_FULL_NAME'."; fi
else log_message " WARNING: No changes staged for '$FILE_FULL_NAME'. Skipping commit."; fi
fi
done
log_message "--- Summary ---"
log_message "Total files processed from '$NEW_FILES_DIR'."
log_message "Files committed: $COMMITTED_COUNT"
log_message "Files skipped: $SKIP_COUNT"
log_message "No new files committed. Skipping push." # Da kein Remote genutzt wird
log_message "--- Interactive Archive Sync Script Finished ---"
exit 0

29
pre-commit Normal file → Executable file
View File

@ -1,25 +1,18 @@
#!/bin/bash
LOGFILE="archiv.log"
ARCHIVE_DIR="Archiv"
log() {
local TIMESTAMP
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$TIMESTAMP] $1" >> "$LOGFILE"
}
git diff --cached --name-only | while read FILE
do
if [[ "$FILE" =~ ^"$ARCHIVE_DIR"/ ]]; then
if git rev-parse --verify --quiet HEAD:"$FILE" > /dev/null; then
echo ""
echo "----------------------------------------------------------------------"
echo "FEHLER: Die Datei '$FILE' existiert bereits im Git-Archiv."
echo "Es ist nicht erlaubt, vorhandene Dateien im '$ARCHIVE_DIR/'-Verzeichnis zu ändern oder neu hinzuzufügen."
echo "Die Änderungen an '$FILE' werden nun verworfen."
echo "----------------------------------------------------------------------"
echo ""
git restore --staged "$FILE"
git restore "$FILE"
# Überprüfe auf Löschungen oder Modifikationen in Archiv
problem=$(git diff --cached --name-status | grep -E '^[MD]\s+Archiv/' || true)
if [[ -n "$problem" ]]; then
log "⛔️ Commit blockiert: Änderung oder Löschung in Archiv: $problem"
echo "⛔️ Fehler: Dateien im Archiv dürfen nicht gelöscht oder verändert werden!"
exit 1
fi
fi
done
exit 0

37
restore-archiv.sh Executable file
View File

@ -0,0 +1,37 @@
#!/bin/bash
cd "$(dirname "$0")"
LOGFILE="archiv.log"
log() {
local TIMESTAMP
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$TIMESTAMP] $1" | tee -a "$LOGFILE"
}
log "🔄 Starte Wiederherstellung von Archiv-Dateien..."
# Alle geänderten oder gelöschten Dateien (im Arbeitsverzeichnis oder Index)
changed_files=$(git diff --name-only Archiv)
staged_files=$(git diff --cached --name-only Archiv)
all_files=$(echo -e "$changed_files\n$staged_files" | sort -u)
if [[ -z "$all_files" ]]; then
log " Keine Änderungen an Archiv-Dateien gefunden."
else
for file in $all_files; do
if [[ ! -f "$file" ]]; then
# Datei wurde gelöscht -> Wiederherstellen
log "⏪ Stelle gelöschte Datei '$file' wieder her"
git restore --staged "$file"
git restore "$file"
else
# Datei existiert (modifiziert) -> zurücksetzen
log "⏪ Setze geänderte Datei '$file' zurück"
git restore --staged "$file"
git restore "$file"
fi
done
log "✅ Alle Änderungen an Archiv-Dateien wurden rückgängig gemacht."
fi

View File

@ -1,45 +0,0 @@
#!/bin/bash
## anpassen!!!!!! ##
GIT_REPO_PATH="/home/alf/MEINWORM"
NEW_FILES_DIR="Neu"
ARCHIVE_TARGET_DIR="Archiv"
LOG_FILE="/home/alf/archive_sync.log" # Pfad anpassen
## Ende des Anpassen-Blocks
log_message() { echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE"; }
log_message "--- Archive Sync Script Started ---"
cd "$GIT_REPO_PATH" || { log_message "ERROR: Could not change to Git repository directory. Exiting."; exit 1; }
mkdir -p "$ARCHIVE_TARGET_DIR"
find "$NEW_FILES_DIR" -type f | while read FILE_PATH_IN_NEW
do
FILE_FULL_NAME=$(basename "$FILE_PATH_IN_NEW")
TARGET_FILE_PATH="$ARCHIVE_TARGET_DIR/$FILE_FULL_NAME"
if git ls-files --error-unmatch -- "$TARGET_FILE_PATH" &>/dev/null; then
log_message " File '$FILE_FULL_NAME' already exists in '$ARCHIVE_TARGET_DIR/'. Skipping."
else
log_message " File '$FILE_FULL_NAME' is new to '$ARCHIVE_TARGET_DIR/'. Adding..."
cp "$FILE_PATH_IN_NEW" "$TARGET_FILE_PATH"
git add "$TARGET_FILE_PATH"
if ! git diff --cached --quiet --exit-code; then
git commit -m "Add new file: $FILE_FULL_NAME to archive" "$TARGET_FILE_PATH" || {
log_message " WARNING: Commit for '$FILE_FULL_NAME' failed. (Pre-commit hook active?)"
git restore --staged "$TARGET_FILE_PATH"
git restore "$TARGET_FILE_PATH"
}
if [ $? -eq 0 ]; then
log_message " Successfully committed '$FILE_FULL_NAME'."
# rm "$FILE_PATH_IN_NEW" # Optional: Originaldatei aus Neu/ löschen
fi
else
log_message " No changes staged for $FILE_FULL_NAME. Skipping commit for this file."
fi
fi
done
log_message "No new files committed. Skipping push." # Da kein Remote genutzt wird
log_message "--- Archive Sync Script Finished ---"
exit 0