![]() |
GIT-Submodul version auslesen
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,
mit
Delphi-Quellcode:
lässt sich Einiges auslesen, auch wenn in den 80.000 Format-Parametern die Zwei für Branchname und Tag fehlen, also wird auch noch
git show
Delphi-Quellcode:
und
git rev-parse
Delphi-Quellcode:
benutzt.
git describe
> BranchName, Commit-Hash, Commit-Date und Author-Name
Code:
Dann noch bissl RegexStringReplace und raus kommt sowas
cd /d my-dir
git rev-parse --abbrev-ref HEAD > my.txt git describe --tags --always --dirty=* >> my.txt git show -s --format=format:"%%ci" >> my.txt
Delphi-Quellcode:
master e06ff3b02* 2020-04-10 08:15
bzw.
Delphi-Quellcode:
.
master 1.1.0 +15 e06ff3b02* 2020-04-10 08:15
Beim Hauptverzeichnis eines GIT-Submodule bekomme ich aber die Daten vom Push/Commit des leeren Verzeichnis im übergeordneten GIT-Repo, anstatt die des eingebundenen Repositories. Wie kann man hier nun die "richtigen" Daten des Submodule bekommen?
Delphi-Quellcode:
im Hauptverzeichnis des übergeordneten GIT-Repos, liefert mir zwar eine Liste,
git submodule status --recursive
aber muß ich hier nun das Gewünschte aus der Liste raus parsen, mich damit dann an github wenden und dort vom gewünschten Repo mir zum Hash die AbbreviatedHash, CommitDatum und den Tag holen? Windows (TortoiseGit) kann es doch auch irgendwie.
Delphi-Quellcode:
geben mir das Linke, aber ich möchte gern rechts haben. (HEAD als BranchName ist sonst auch sehr ähhhh "informativ")
git show/rev-parse/describe
|
AW: GIT-Submodul version auslesen
:cat:
|
AW: GIT-Submodul version auslesen
Hilft dir
![]() |
AW: GIT-Submodul version auslesen
Leider hilft das auch nicht und ich sehe da garkeinen Unterschied. :cry:
Es kommen immernoch die Daten vom übergeordneten Repository raus, also Revision und Datum, als das Submodule hinzugefügt wurde, anstatt Revision und Datum der letzten Änderung im Submodul.
Code:
Neben dem --git-dir stand in der Doku auch ein --work-tree, aber auch wenn ich zusätzlich
@echo off
setlocal EnableDelayedExpansion REM cd /d %1 set gitdir= if not exist ".git" goto 1 if exist ".git/config" goto 1 for /f "delims=" %%x in (.git) do ( set "temp=%%x" & goto 2 ) :2 set temp=%temp:/=\% if "%temp:~0,8%" == "gitdir: " if exist "%temp:~8%" set gitdir=--git-dir=%temp:~8% :1 echo %gitdir% echo ################## git rev-parse --abbrev-ref HEAD git describe --tags --always --dirty=* git show -s --format=format:"%%ci" echo ################## git %gitdir% rev-parse --abbrev-ref HEAD git %gitdir% describe --tags --always --dirty=* git %gitdir% show -s --format=format:"%%ci" if not "%gitdir%" == "" ( echo ################## echo -- & REM git rev-parse --submodule --abbrev-ref HEAD echo -- & REM git describe --submodule --tags --always --dirty=* git show --submodule=short -s --format=format:"%%ci" echo ################## echo -- & REM git %gitdir% rev-parse --submodule --abbrev-ref HEAD echo -- & REM git %gitdir% describe --submodule --tags --always --dirty=* git %gitdir% show --submodule=short -s --format=format:"%%ci" ) echo ################## pause
Delphi-Quellcode:
anhänge, kommt das Selbe raus.
--work-tree=.
Vom Hauptverzeichnis des Submodule auf eine drinliegende Datei angewendet, also
Delphi-Quellcode:
angehängt, ergibt "not in workingtree"
-- .svn
Delphi-Quellcode:
angehängt, ergibt keine Fehlermeldung, aber dafür eine leere Ausgabe (nichts) und für einen allgemeinen Code muss ich dann auch erst eine Datei im Verzeichnis suchen lassen.
-- eineda.tei
Selbst wenn ich erstmal komplett raus springe und beide Pfade explizit angebe, wird die Info des übergeordneten Repository genommen.
Delphi-Quellcode:
cd /d C:\
Delphi-Quellcode:
git --git-dir=D:\RootDir\.git\modules\MySubmodule --work-tree=D:\RootDir\MySubmodule show
Aber wenn ich hier das übergeordnete Repository zerstöre, indem ich das .git-Verzeichnis umbennene, dann funktioniert es.
Delphi-Quellcode:
git --git-dir=D:\RootDir\__.git\modules\MySubmodule --work-tree=D:\RootDir\MySubmodule show
bzw.
Delphi-Quellcode:
ohne vorheriges CD
git --git-dir=..\__.git\modules\MySubmodule
Nur ich glaub das ist keine super Lösung, falls was schief geht und anschließend das Verzeichnis nicht wieder zurück umbenannt wird. :? Oder wenn z.B. Tortoise-Git noch offen ist und das Verzeichnis sich nicht umbenennen lässt. [Info] Mit dem DelayedExpansion und SubStrings in der ( ) des FOR gab es Probleme (die Variablen mit ! wurden nicht aufgelöst, wenn ein ~ drin ist, und mit % sind sie nicht delayed), aber zum Glück gibt es ja noch as gute alte GOTO. :angle2: |
AW: GIT-Submodul version auslesen
Zitat:
|
AW: GIT-Submodul version auslesen
Außer beim Erstellen eines Repository (wo es eine externe git.exe haben will), nutzt Tortoise eine eigene LibGit2-DLL und (meistens) nicht die Consolenversion.
Die Consolenanwendung verwendet intern ja ebenfalls die gleiche selben Funktionen. Und da die Linuxjünger doch ALLES nur mit Console machen, sollten dort doch auch sämptliche Funktionen verfügbar sein. :stupid: |
AW: GIT-Submodul version auslesen
![]() ![]() Okay, Scherz beiseite. It's funny because it's true, wie der gemeine Amerikaner sagt. Das in NT-Skript/Batch zu machen halte ich jedoch ernsthaft für einen Fehler. Git for Windows liefert Bash mit und das kann und sollte man auch nutzen. Dort hättest du auch noch sed und awk, sowie die eingebaute ![]() Das was du willst geht mit -C <Verzeichnis>, meine ich (habe es soeben mal mit git -C submod_dir show -s --format=format:"%ci" getestet, getestet auf Version: git version 2.26.2.windows.1). Es sei denn ich habe nicht begriffen was du eigentlich willst. Ich vermute mal ganz stark, daß du über einen Defekt gestolpert bist, denn im Grunde muß ja der Pfad bei Angabe von --git-dir "berechnet" werden. Also mal lieber ![]() Zitat:
Zitat:
|
AW: GIT-Submodul version auslesen
ohh man, SVN ist da aber viel einfacher und besser :lol:
Wer hat denn Zeit für Bash? bin ja noch ausgelastet überlastet PowerShell zu lernen. Das Ding liegt auf Github und ich glaub das wurde normal mit
Delphi-Quellcode:
erstellt.
git submodules add
rootdir/.gitmodules hat mehrere solche Einträge
Code:
zusätzlich sind im Hauptrepo jeweils diese Verzeichnisse (die schon da, selbst wenn man das Rekursive beim Clone vergessen hat)
[submodule "SMODUL"]
path = SMODUL url = git@github.com:meine/smodul.git rootdir/SMODUL/ im rootdir/SMODUL/.git steht nur
Delphi-Quellcode:
drin.
gitdir: ../.git/modules/SMODUL
die Dateien aus dem eigentlichen .git-Verzeichnis liegen unter rootdir/.git/modules/SMODUL und ich hatte nur versucht von rootdir/SMODUL die Infos zu bekommen. Nja, mal sehn was ich da aus der zu großen Doku zusammenbekomm. |
AW: GIT-Submodul version auslesen
PowerShell ist doch gerade auf dem Weg das zeitliche zu segnen, sei Avantgardist und lerne bash, das in Windows 10
![]() Außerdem soll es doch ein Qualitätsmerkmal eines guten Entwicklers sein, auf 100 Hochzeiten zu tanzen...sagt man mir immer wieder, dann nicke ich weise und mach weiter nur meine zwei bis drei Hochzeiten auf Delphi/Win und Python/Linux.:stupid: Sherlock |
AW: GIT-Submodul version auslesen
Zitat:
|
AW: GIT-Submodul version auslesen
Mit einem
Delphi-Quellcode:
, da hat sich nicht geändert.
git -C S:\rootdir\SMODUL show ...
Ansonsten war ich ja anfangs davon ausgegangen, dass bei den Befehlen/Parametern für GIT es zwischen Batch/Windows und Bash/Linux keine Unterschiede, außer den Pfaden Bei einem anderen -C vom Wochenende, da gab es ja auch keine großen Unterschiede.
Code:
ssh-keygen -q -N "" -f "%USERPROFILE%\.ssh\id_rsa"
bzw. ssh-keygen -q -N "" -f "C:\Users\%USERNAME%\.ssh\id_rsa" "C:\Program Files\Git\bin\sh" -c 'ssh-keygen -q -N "" -f "/c/Users/%USERNAME%/.ssh/id_rsa"' |
AW: GIT-Submodul version auslesen
Zitat:
Zitat:
Zitat:
Also, folgende Themen sollten wir erstmal abklären: du benutzt Git von der offiziellen Git-Seite oder du benutzt Git for Windows von gitforwindows.org? Und dann die obige Frage mit S:. Kannst du das Ganze bitte einmal in der Bash for Git durchexerzieren?! Also ob das einen Unterschied zu cmd.exe macht? Beim Installieren hat man übrigens die Auswahl ob man den Git-Wrapper auch für cmd.exe usw. aktivieren will oder ausschließlich von Bash aus nutzt. |
AW: GIT-Submodul version auslesen
Ist ein SUBST auf ein anderes lokales Laufwerk. (im Prinzip auf H:\USERS\%USERNAME%)
War mir nur eingefallen, weil als du gestern von -C geredet hattest, ich zuerst wieder daran dachte, vor allem da es ja auch mit der Bash war. :stupid: |
AW: GIT-Submodul version auslesen
Zitat:
![]() Aber jetzt laß doch mal die Details rüberwachsen! Welche Version von Git? Und teste bitte mal in "Git Bash" (unter dem Namen landet es im Startmenü). Ich habe es bei mir lokal mal in cmd.exe durchexerziert (also mit Windowspfadnamen) und es ging problemlos, sowohl mit relativem als auch mit absolutem Pfad und sowohl innerhalb des Worktrees vom Supermodul als auch außerhalb. Und genau das würde man ja erwarten, da -C eben einen Verzeichniswechsel vollführt. |
AW: GIT-Submodul version auslesen
Im CMD und SH sagt es "git version 2.23.0.windows.1"
und Tortoise sagt TortoiseGit 2.10.0.2 (C:\Program Files\TortoiseGit\bin) git version 2.22.0.windows.1 (H:\git\bin; H:\git\mingw64\; H:\git\mingw64\etc\gitconfig; C:\ProgramData\Git\config) Microsoft Windows Server 2016 Standard, Version 10.0.14393 Build 14393 Intel Xeon E5-2620v4, 8 Kerne, 128 GB RAM Festplatten im RAID und eine SSD (wo H: bzw. S: drauf liegen) beim Login via RDP wird für den Benutzer jeweils das S: verbunden. Und im Guthub sind die Repos nicht öffentlich. |
AW: GIT-Submodul version auslesen
Liste der Anhänge anzeigen (Anzahl: 3)
Echt mal, hatte grade versucht ein Repository als Beispiel nachzubauen. (zwei Repos erstellt, Add-Submodule und dann den Branch gewechselt)
Es sieht im Prinzip gleich aufgebaut aus, (siehe Beschreibung in #8) aber hier funktioniert es plötzlich. Die Batch liefert das richtige Ergebnis (a.txt) und im Explorer zeigt Toroise es auch anders an. (siehe Post #1) |
AW: GIT-Submodul version auslesen
Zitat:
Ansonsten sind deine Versionen jeweils schon etwas betagter. Falls du - wie auch wir in der Firma - einen gewissen Grund haben solltest ein Upgrade zu scheuen, bspw. weil das Git-Wire-Protokoll unterstützt werden muß, dann hilft auch eine Aktualisierung. Die Version in TortoiseGit bezieht sich also auf libgit2 oder gibt's da echt noch ein weiteres installiertes Git? Da einige der Unterbefehle von Git ja als externe Binaries (und Skripte) implementiert sind, könnte das schon das Problem sein. Kannst du hilfsweise mal ein installiertes Git "ausschalten" indem du bspw. das Verzeichnis umbenennst? Ansonsten auch nochmal probieren Git zu aktualisieren. |
AW: GIT-Submodul version auslesen
Der Grund wird wohl eher sein "es läuft ... blos nix kaputt machen". :stupid:
Nachdem es im neuen Test-Repository ging (#16), hab ich nochmal bissl mit dem Repository selbst rumgespielt, anstatt weiter bei den Aufrufen der Git-Status-Funktionen rumzuprobieren. Ich glaub die größten Probleme stammen vom "falschen" Wechsel des Branches
Delphi-Quellcode:
git.exe checkout remotes/origin/dev/acj/14910-bde-stempeleung --
anstatt
Delphi-Quellcode:
git.exe checkout -b dev/acj/14910-bde-stempeleung remotes/origin/dev/acj/14910-bde-stempeleung --
Nach Ersterem das eigenartige Ergebnis und bei Zweitem scheint es nun zu klappen. Man soll wohl nicht alles glauben was die vielen Git Cheat Sheets einem sagen, sonst kommt Shitt raus. ![]() |
AW: GIT-Submodul version auslesen
Mit Bash versuch ich dann noch bissl rumzuspielen.
Nur nochmal zum Verstandnis. Wir hatten Subversion mit FinalBuilder drin, und versuchen das Ganze nun auf mehrere Git-Repos umzusiedeln. Der FB bietet für SVN standardmäßig eine Erweiterung, wo man direkt einige Statusinfos in Variablen schreiben lassen kann. z.B. der Branch (das Verzeichnis), die Revision, das CommitDatum und von wem ![]() In Bezug auf Git gibt es soeine Status-Auslesefunktion nicht. Das Einzige was es gibt ist "Git Repository Status", was man eine Exception werfen lassen kann, wenn es etwas zu Commiten gibt. Auch alles andere, wie z.B. "Git Show Commit Logs" bietet keine Rückgaben, die man dann im FB-Script auswerten kann. Zusätzlich gibt es intelligenter Weise zwar ein "Git Generic" und "Subversion Generic", aber da war man so intelligent, dann man dort zwar Befehl und Parameter "frei" definieren kann, aber auch da gibt es keine Möglichkeit die Ausgabe in eine Variable oder eine Datei umzuleiten (um sie anschließend in eine Variable einzulesen). ![]() Da es die Möglichkeit git "DOS"-Komandos auszuführen, ![]() ![]() hatte ich nun einfach versucht in einem Batch-Script ein/paar Aufrufe der git.exe zu verwenden, um mir dort die gewünschten Infos in eine Textdatei schreiben zu lassen. branchname commithash* commitdate oder, wenn Tag vorhanden branchname version commithash* commitdate > version = tag+commits > * = dirty also z.B.
Delphi-Quellcode:
oder
master 7c8c3e76 2019-11-05 09:27
Delphi-Quellcode:
.
master 19.10.02+37 7c8c3e76* 2019-11-05 09:27
Genommen wird das dann, um beim Build-Prozess im FinalBuilder nochmal anzeigen zu lassen was grade kompiliert wird, sowie in der VersionsRessource der EXE/DLLs und im SlashScreen/InfoDialog des Programms für die Supporter (menschenverständlich) die Version des Programms und für den Entwickler die Quellen/Versionen der einzelnen Repositories anzuzeigen. Da war dann bissl stümperhaft, nach etwas rumprobieren, eine Batch entstanden, der man ein Git-Verzeichnis und eine Ziel-Textdatei gibt. Die funktionierte dann erstmal (beim Testen und Rumspielen), wurde noch bissl kommentiert usw., aber nachdem es im FinalBuilder eingebaut war und nun auf alle Repositories und dessen Submodule losgelassen wurde, da stimmte nichts mehr. :wall: die aktuellen Commit-Daten ... Datum, Name, Kommentar (%root%\fb-git-ver.cmd)
Code:
die Versionsinfo (%root%\fb-git-id.cmd)
rem ################################################
rem fb-git-ver.cmd DIR DEST (für Versionsanzeige im FinalBuilder) rem # Branch # Branch-References # Autor, Relative, CommitDate # Subject ## Message-Body rem ## geo, 3 days ago, 2020-04-17 22:46:58 +0200 rem ## HEAD -> master, origin/master, origin/HEAD rem ## Formular 'DB / SQL-Stataments durchsuchen' anpassungen (#194) rem ## ... cd /d %1 git rev-parse --abbrev-ref HEAD>%~2 if errorlevel 1 exit 1 git show -s --format=format:"%%D %%n%%an, %%ar, %%ci %%n%%s %%n%%n%%b">>%2 rem "%~dp0_bpl\fart" --c-style %2 \n \r\n -- FART setzt den ErrorLevel (Anzahl der Ersetzungen) ... daher Replace anschließend im FinalBuilder
Code:
und die eigentliche Arbeit (%root%\fb-work.cmd)
rem ################################################
rem fb-git-id.cmd DIR DEST [name/short] (für Version.inc und VersionInfo.rc:FileDescription) rem # master 19.10.02-37-g7c8c3e76* 2019-11-05T09:27:17+01:00 rem ## master 7c8c3e76 2019-11-05 09:27 (ohne Version-Tag) rem ## master 19.10.02+37 7c8c3e76* 2019-11-05 09:27 (Version-Tag vorhanden, Short=ohne CommitDate) cd /d %1 set mode=%~3 if "%mode%"=="short" ( git describe --tags --always --dirty=*>%~2 find - %2 >nul if errorlevel 1 set mode= ) git rev-parse --abbrev-ref HEAD>%~2 if errorlevel 1 exit 1 if "%mode%"=="branch" exit /b 0 git describe --tags --always --dirty=*>>%~2 if not "%mode%"=="short" git show -s --format=format:"%%ci">>%~2 rem "%~dp0_bpl\fart" --c-style %2 \n " " -- FART setzt den ErrorLevel (Anzahl der Ersetzungen) ... daher Replace anschließend im FinalBuilder rem RegexReplace im FB: "-(\d+)-g([0-9a-f]{8})" -> "+$1 $2" rem RegexReplace im FB: "(\d\d\d\d-\d\d-\d\d)[T ](\d\d:\d\d):\d\d([ ]?[+-]\d\d:\d\d)" -> "$1 $2"
Code:
rem Variable: GitCommit, GitBranch, GitVersion
call %root%\fb-git-ver.cmd "%root%\MAIN" "%root%\fb-ver-commit.txt" call %root%\fb-git-id.cmd "%root%\MAIN" "%root%\fb-ver-branch.txt" branch call %root%\fb-git-id.cmd "%root%\MAIN" "%root%\fb-ver-short.txt" short rem Variable: Temp1 bis Temp4 call %root%\fb-git-id.cmd "%root%\MAIN" "%root%\fb-ver-main.txt" call %root%\fb-git-id.cmd "%root%\ExternKomponenten" "%root%\fb-ver-extern.txt" call %root%\fb-git-id.cmd "%root%" "%root%\fb-ver-root.txt" call %root%\fb-git-id.cmd "%root%\PSQL" "%root%\fb-ver-psql.txt" |
AW: GIT-Submodul version auslesen
Zitat:
Mir scheint es eher so, dass Microsoft alles auf PowerShell auslegt, zudem aber immer mehr Unterstützung für andere Betriebssysteme bieten will. Siehe .NET Core und PowerShell 6 bzw. PowerShell 7. |
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 22:45 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