![]() |
AW: GIT-Submodul version auslesen
Zitat:
Aber irgendwann könnte bash zumindest gleichziehen und dann ist man plötzlich auf zwei Welten zu Hause. Kann ich jedem bisher reinem Windowser nur empfehlen. Sherlock |
AW: GIT-Submodul version auslesen
Liste der Anhänge anzeigen (Anzahl: 2)
So, ich hab mir nun erstmal paar Test-Subbranches erstellt.
Und das eigentliche (kaputte) Repository wurde heute nochmal neu aufgebaut. (SVN Develop-Branch jetzt readonly und abschließend neue Übernahme aus SVN nach GIT) Im Grunde gibt es jetzt nur noch ein "Problemchen" mit
Delphi-Quellcode:
, nach einem
git rev-parse --abbrev-ref HEAD
Delphi-Quellcode:
ohne
git checkout
Delphi-Quellcode:
.
-b
Nach einem Switch/Checkout eines Branches ohne einen lokalen Branch anzulegen. Jetzt kann ich dann mal anfangen das Batch/Bash-Script zu überarbeiten. Und im Notfall muss ich mir eben den Wert aus der passenden Zeile im
Delphi-Quellcode:
rausparsen.
git submodules | find %branch%
Code:
[edit]
Test-SubRepository aus "git submodule" was ist es aus "git rev-parse/describe/show" .......
" master, aktuell 32206ec heads/master origin/master master 32206ec 2020-05-28 11:07:25 master, aktuell mit Änderung im Stash 32206ec heads/master origin/master master 32206ec 2020-05-28 11:07:25 master, aktuell mit Änderung ohne Commit 32206ec heads/master origin/master ** master 32206ec* 2020-05-28 11:07:25 master, alter Stand, kein Pull und Fetch 827c575 heads/master origin/master master 827c575 2020-05-28 10:47:50 master, aktuell mit Änderung als Commit 9ebdf83 heads/master origin/master master 9ebdf83 2020-05-28 11:13:16 master, aktuell mit Änderung als Commit in neuem Branch 1f61fb5 heads/dev/neuer_branch dev/neuer_branch dev/neuer_branch 1f61fb5 2020-05-28 11:15:22 master, alter Revision - Reset Soft +827c575 heads/master origin/master master 827c575* 2020-05-28 10:47:50 master, alter Revision - Reset Mixed +827c575 heads/master origin/master master 827c575* 2020-05-28 10:47:50 master, alter Revision - Reset Hard +827c575 heads/master origin/master master 827c575 2020-05-28 10:47:50 branch, checkout 8b98ef9 remotes/origin/dev/testbranch origin/dev/testbranch HEAD 8b98ef9 2020-05-27 17:41:44 branch, checkout (Switch nach Commit im Master) +8b98ef9 remotes/origin/dev/testbranch origin/dev/testbranch HEAD 8b98ef9 2020-05-27 17:41:44 branch, checkout -b (als neuer Branch) 8b98ef9 heads/dev/testbranch dev/testbranch dev/testbranch 8b98ef9 2020-05-27 17:41:44 Alles Einzel-Clone, nicht als SubModul verpackt, da kommt das fast gleiche raus. (MyRepo.ohneSub.zip) * bei den beiden Checkouts ohne -b nur "HEAD" * und beim "master, alter Stand, kein Pull und Fetch" liefert
Delphi-Quellcode:
keinen Hash/Version, obwohl es ja eigentlich das "Selbe" ist, wie "master, aktuell", aber vermutlich nur ein Fehler durch mich
git describe
|
AW: GIT-Submodul version auslesen
Moin, :cheer:
im Batch-Script (git-info.cmd) sieht es so aus
Code:
und im Bash-Script (git-info.sh) kommt sowas vor
chcp 1252
bash git-info.sh %1
Code:
Nun wird aber bei einem Ümlaut im Pfad gemeckert
gitdir=$1
if [ -n "$gitdir" ]; then gitdir="$(cygpath -u "$gitdir")"; fi cd "$gitdir"
Code:
Also entweder stimmt irgendwo die Codierung nicht (UTF-8/ANSI)
S:\MyRepo\git-info.sh: line 12: cd: $'"S:/MyRepo//master, aktuell mit □\204nderung im Stash"': No such file or directory
oder cygpath mag mich micht. Ach ja, im Großen und Ganzen läuft es und auch wenn ich "aktuell" mit Umlauten nicht in Berührung komme, wie könnte ich das Problemchen dennoch lösen?
Code:
Bash kann einem aber schon ein bissl abschrecken und für alles gibt es tausende Wege, wo man die Vorschläge/Tutorials im Internet oft nur schwer versteht.
#!/bin/bash
##### Input :: bash git-info.sh DIR DEST [|branch|version|log] gitdir=$1 dest=$2 mode=$3 if [ -n "$gitdir" ]; then gitdir="$(cygpath -u "$gitdir")"; fi if [ -n "$dest" ]; then dest="$(cygpath -u "$dest")"; fi ## hier oder angegebenen Verzeichnis if [ -n "$gitdir" ]; then cd "$gitdir" fi if [ "$mode" == "log" ]; then # Branch-References # Autor, Relative, CommitDate # Subject ## Message-Body ## HEAD -> master, origin/master, origin/HEAD ## geo, 3 days ago, 2020-04-17 22:46:58 +0200 ## Formular 'DB / SQL-Stataments durchsuchen' anpassungen (#194) ## ... result=$(git show -s --format=format:"%D %n%an, %ar, %ci %n%s %n%n%b" | sed "s#\\n#\\r\\n#g") else ##### Behandlung für Submodul wenn Branch nicht "richtig" auslesbar (z.B. wenn GIT SHOW nur "HEAD" ausgibt) if [ -f ".git" ] && [ -d "../.git" ]; then dirname=${gitdir##*/} dirname=${dirname#(/[(]} dirname=${dirname#)/[)]} branch=$(git -C .. submodule | grep ".[0-9a-f]+ $dirname \\(.*\\)$") fi ##### Branch, Version, CommitDatum und CommitLog if [ -z "$branch" ]; then branch=$(git show -s --pretty=format:"%D"); fi version=$(git describe --tags --always "--dirty=*") cdate=$(git show -s --format=format:"%ci") ##### Formate konvertieren ## BranchName exrahieren :: xxx | aaa -> xxx | aaa -> xxx, yyy, zzz ==> xxx ## Hash und Version+Offset trennen :: vvv-i-gxxxxxxxx ==> yyy+i xxxxxxxx ## Datum lesbarer :: 2019-11-05T09:27:17+01:00 ==> 2019-11-05 09:27 branch=$(echo "$branch" | awk '{ print gensub(".* ?-> ?", "", "g") }') branch=$(echo "$branch" | awk '{ print gensub("^HEAD, ?", "", "g") }') branch=$(echo "$branch" | awk '{ print gensub(" ?,.*$", "\\1", "g") }') version=$(echo "$version" | awk '{ print gensub("-([0-9]+)-g([0-9a-f]{8})", "+\\1 \\2", "g") }') cdate=$(echo "$cdate" | awk '{ print gensub("([0-9]{4}-[0-9]{2}-[0-9]{2})[T ]([0-9]{2}:[0-9]{2}):[0-9]{2}([ ]?[+-][0-9]{2}:?[0-9]{2})?", "\\1 \\2", "g") }') ##### Zusatzinfo über geänderte oder neue Dateien (nicht commited) #if [ $(git diff --stat) != '' ]; then dirty="*"; fi # modified files exists #if [ -z $(git status -s) ]; then dirty="**"; fi # modified or untracked files exists ##### Ausgabe if [ "$mode" == "branch" ]; then result="$branch" elif [ "$mode" == "version" ]; then if [[ "$version" =~ "+" ]]; then # 19.10.02+37 7c8c3e76* result="$version" else # 7c8c3e76* 2019-11-05 09:27 result="$version $cdate" fi else # master 7c8c3e76 2019-11-05 09:27 (ohne Version-Tag) # master 19.10.02+37 7c8c3e76* 2019-11-05 09:27 (Version-Tag vorhanden) result="$branch $version $cdate" fi fi #clear echo $result if [ -n "$dest" ]; then echo -n "$result" > $dest fi Und die Hilfe kann einen auch manchmal erschrecken, so dass man gleich wegrennen will. Zitat:
![]() Klingt schon ein bisschen nach: bash ist bissl davon und ein bissl davon, aber von nichts was richtiges. :duck: Ich will jetzt aber kein bashing betreiben. :lol: |
AW: GIT-Submodul version auslesen
Probier mal die Language beim Start des Scripts auf Deutsch bzw. UTF-8 umzustellen.
Code:
export LANG="de_DE.UTF-8"
export LC_ALL="de_DE.UTF-8" |
AW: GIT-Submodul version auslesen
Schade, dann wird es mit Umlauten wohl nichts mehr.
Na gut, Hauptsachte der Rest läuft jetzt erstmal. :thumb: Scheinbar hat cygpath ein Problemchen. Zumindestens die Fehlermeldung stimmt jetzt (da steht nun richtig "Ä"), nur übersetzt wird der Pfad falsch, aber er wird übersetzt, denn die \ werden zu /. aus
Delphi-Quellcode:
S:\Test\Täst
wird
Delphi-Quellcode:
S:/Testo/Täst
anstatt
Delphi-Quellcode:
/s/Test/Täst
Die armen Russen, Chinesen und Franzosen muss das doch ankotzen. Minimalbeispiel: a.cmd
Code:
a.sh
chcp 1252
cd /d "%~dp0" md "Täst" bash a.sh "%~dp0Täst" pause
Code:
CodePage 1252 = ANSI statt OEM, damit das Ä nicht OEM-codiert gespeichert werden muß, aber im Bash kommt es scheinbar richtig als UTF-8 an, was Batch/CMD hier als Unicode ans BASH übergeben hat.
#!/bin/bash
export LANG="de_DE.UTF-8" export LC_ALL="de_DE.UTF-8" dir=$1 echo "IN: $dir" dir="$(cygpath -u "$dir")" echo "OUT: $dir" cd "$dir" |
AW: GIT-Submodul version auslesen
Öhm, ich halte mich mal mit Kritik gediegen zurück. Scheinst ja noch feucht hinter den Ohren zu sein in Sachen Bash :P
Zitat:
Im Gegensatz zu diversen Werkzeugen wie cut oder tr oder cat, soll eine Shell ja auch mehr können. Außerdem hat Bash dann bspw. "let" für arithmetische Zuweisungen und $(()) sowie (())-Bedingungen. Da läßt sich auch einiges mit anstellen wenn auch leider nicht mit Gleitkommazahlen (die kann man wiederum mit expr verarbeiten). $() sollte man den Backticks vorziehen, weil Backticks zum Alptraum werden, wenn man sie schachtelt. Bei $() ist dies kein Problem. Alles in allem würde ich dir empfehlen dir das Bash Cookbook - welches frei als PDF verfügbar ist (und ja, legal!) - durchzuarbeiten. Traditionell werden Variablen in Großbuchstaben gehalten um sie bspw. von Befehlen zu unterscheiden, aber ist Geschmackssache. Hat aber Vorteile sich an etablierte Konventionen zu halten. Da hier:
Code:
... wäre so besser:
#!/bin/bash
##### Input :: bash git-info.sh DIR DEST [|branch|version|log] gitdir=$1 dest=$2 mode=$3 if [ -n "$gitdir" ]; then gitdir="$(cygpath -u "$gitdir")"; fi if [ -n "$dest" ]; then dest="$(cygpath -u "$dest")"; fi
Code:
... oder halt für die letzten beiden Zeilen:
#!/usr/bin/env bash
##### Input :: bash git-info.sh DIR DEST [|branch|version|log] gitdir=$1 dest=$2 mode=$3 [[ -z "$gitdir" ]] || gitdir="$(cygpath -u "$gitdir")" [[ -z "$dest" ]] || dest="$(cygpath -u "$dest")"
Code:
... und den drei Variablen könntest du jeweils auch Standardwerte zuordnen.
[[ -n "$gitdir" ]] && gitdir="$(cygpath -u "$gitdir")"
[[ -n "$dest" ]] && dest="$(cygpath -u "$dest")" Kurzer Exkurs: die Hashbang oben ist die portabelste die du bekommen kannst. Funktioniert auf Linux, macOS, BSDs, AIX usw. gleichermaßen, weil env in all diesem Betriebssystemen am selben Ort liegt. Man kann sich also auf den Pfad zu env verlassen und mit dessen Hilfe den zu Bash ermitteln. Für Skripte die als Superuser laufen, würde ich dennoch den Pfad hartkodieren um möglichen Rechteausweitungen vorzugreifen. Bspw. "log" für den dritten:
Code:
Und wenn du ein frisches Skript beginnst, bietet sich
mode=${3:-log}
Code:
... an. Damit werden alle ungeprüften Rückgabewerte die nicht 0 sind, zum Beenden des Skripts führen. Fördert manchmal die Disziplin.
set -e
|
AW: GIT-Submodul version auslesen
Eine Konstellation hab ich noch entdeckt, wo es nicht funktioniert. :cry:
Im ToroiseGit ein Commit in einen neuen noch nicht existierenden Branch. Bei allem Anderen steht im Log was für einem Consolen-Befehl das Ausgeführte entspricht, aber hier natürlich nicht. Ob es nach einem Push ginge, hatte ich vergessen zu prüfen, aber sollte ja eigentlich keinen Unterschied machen. Hatte den Branch schon wieder gewechselt und ein erneuter Checkout auf den Branch, da ging es dann. (egal ob auf branch oder origin/branch) Das mit dem
Delphi-Quellcode:
steht überall im Internet so, da denkt man doch das sei richtig so. .stupid:
#!/bin/bash
Gut, hier wird es erstmal immer nur im Windows aufgerufen, vom FinalBuilder aus, weil dessen Git-Integration total unbrauchbar ist. (SVN war ja noch benutzbar) Was mit
Delphi-Quellcode:
ist, hab ich nicht so ganz verstanden.
mode=${3:-log}
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz