Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   GIT-Submodul version auslesen (https://www.delphipraxis.net/204101-git-submodul-version-auslesen.html)

himitsu 23. Apr 2020 12:57


GIT-Submodul version auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,

mit
Delphi-Quellcode:
git show
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
Delphi-Quellcode:
git rev-parse
und
Delphi-Quellcode:
git describe
benutzt.
> BranchName, Commit-Hash, Commit-Date und Author-Name

Code:
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
Dann noch bissl RegexStringReplace und raus kommt sowas
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:
git submodule status --recursive
im Hauptverzeichnis des übergeordneten GIT-Repos, liefert mir zwar eine Liste,
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:
git show/rev-parse/describe
geben mir das Linke, aber ich möchte gern rechts haben. (HEAD als BranchName ist sonst auch sehr ähhhh "informativ")

himitsu 20. Mai 2020 14:25

AW: GIT-Submodul version auslesen
 
:cat:

Aviator 20. Mai 2020 18:33

AW: GIT-Submodul version auslesen
 
Hilft dir diese SO Antwort eventuell weiter?

himitsu 22. Mai 2020 13:18

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:
@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
Neben dem --git-dir stand in der Doku auch ein --work-tree, aber auch wenn ich zusätzlich
Delphi-Quellcode:
--work-tree=.
anhänge, kommt das Selbe raus.

Vom Hauptverzeichnis des Submodule auf eine drinliegende Datei angewendet, also
Delphi-Quellcode:
-- .svn
angehängt, ergibt "not in workingtree"
Delphi-Quellcode:
-- eineda.tei
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.

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:
git --git-dir=..\__.git\modules\MySubmodule
ohne vorheriges CD
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:

freimatz 25. Mai 2020 15:08

AW: GIT-Submodul version auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1462772)
Windows (TortoiseGit) kann es doch auch irgendwie.

procmon?

himitsu 25. Mai 2020 16:29

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:

Assarbad 25. Mai 2020 20:00

AW: GIT-Submodul version auslesen
 
Ich liebe Git! Es ist halt so ein einfaches Versionskontrollsystem eine einfache Objektablage. Die wunderbar lesbare Git-Dokumentation hat die Antwort: git-observe-ref mit dem Parameter --seduce-path ist dein Freund!

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 Parameter Expansion zur Verfügung.

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 melden wenn das reproduzierbar ist. Das kann schonmal schiefgehen. Ohnehin habe ich Submodule bisher in noch keinem VCS zufriedenstellend gelöst gesehen. Mit -C machst du das gleiche wie bei tar -C, also einen Wechsel ins angegebene Verzeichnis (change directory).

Zitat:

Zitat von himitsu (Beitrag 1465247)
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.

Eben. Und so machen es auch die ganzen IDEs. Und nebenbei werden noch allerlei redundante, rätselhafte und bescheuerte Konzepte hilfreich für den Benutzer ausgeblendet, so daß die wenigsten Nutzer wirklich Git benutzen, sondern vor allem ein Git-Repo mit einer halbwegs nutzbaren UI. Ja ja, der Siegeszug von "Git" ...

Zitat:

Zitat von himitsu (Beitrag 1465247)
Und da die Linuxjünger doch ALLES nur mit Console machen, sollten dort doch auch sämptliche Funktionen verfügbar sein. :stupid:

In den - ungelogen - knapp 150 Git-Befehlen (146 auf Ubuntu 20.04, ermittelt mit find /usr/share/man -type f -name 'git-*' |wc -l) findet sich garantiert was, gell? Zusammen mit den zwei Dutzend Optionen pro Befehl kann man das auch mal flott auswendig lernen.

himitsu 26. Mai 2020 08:54

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:
git submodules add
erstellt.

rootdir/.gitmodules hat mehrere solche Einträge
Code:
[submodule "SMODUL"]
   path = SMODUL
   url = git@github.com:meine/smodul.git
zusätzlich sind im Hauptrepo jeweils diese Verzeichnisse (die schon da, selbst wenn man das Rekursive beim Clone vergessen hat)
rootdir/SMODUL/

im rootdir/SMODUL/.git steht nur
Delphi-Quellcode:
gitdir: ../.git/modules/SMODUL
drin.

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.

Sherlock 26. Mai 2020 09:33

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 bereits da ist, und immer mehr Unterstützung erfahren wird.

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

Assarbad 26. Mai 2020 10:18

AW: GIT-Submodul version auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1465295)
Nja, mal sehn was ich da aus der zu großen Doku zusammenbekomm.

Wie, hat -C für dich nicht funktioniert? Das wäre ungewöhnlich. Dann würde ich an deiner Stelle nochmal ein frisches Git for Windows drüberbügeln. Da scheint ja dann mehr im Argen zu liegen.

himitsu 26. Mai 2020 10:55

AW: GIT-Submodul version auslesen
 
Mit einem
Delphi-Quellcode:
git -C S:\rootdir\SMODUL show ...
, da hat sich nicht geändert.


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"'

Assarbad 26. Mai 2020 11:06

AW: GIT-Submodul version auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1465326)
Mit einem
Delphi-Quellcode:
git -C S:\rootdir\SMODUL show ...
, da hat sich nicht geändert.

Sehr seltsam. Laufwerk S: ist lokal oder bspw. eine eingebundene Netzwerkfreigabe?

Zitat:

Zitat von himitsu (Beitrag 1465326)
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

Jupp, und die kannste mit cygpath hin- und herkonvertieren.

Zitat:

Zitat von himitsu (Beitrag 1465326)
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"'

Da fehlt mir jetzt irgendwie der Zusammenhang?! Das ist ja schon ein Unterschied ob ich ein kleines -c an die Bourne Shell (oder meinetwegen Bash) reiche oder an Git selber?!

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.

himitsu 26. Mai 2020 11:26

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:

Assarbad 26. Mai 2020 11:34

AW: GIT-Submodul version auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1465334)
Ist ein SUBST auf ein anderes lokales Laufwerk. (im Prinzip auf H:\USERS\%USERNAME%)

Alles klar, war ich auch mal ein Fan von. Jetzt stellt sich natürlich gleich die Frage was H: ist. Lokales Laufwerk oder? ...

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.

himitsu 26. Mai 2020 12:29

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.

himitsu 26. Mai 2020 12:59

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)

Assarbad 26. Mai 2020 13:02

AW: GIT-Submodul version auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1465344)
beim Login via RDP wird für den Benutzer jeweils das S: verbunden.

Hast du die Möglichkeit es mal testweise auf einem lokalen Laufwerk zu probieren?

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.

himitsu 26. Mai 2020 15:15

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.
https://www.reddit.com/r/git/comment...t_cheat_sheet/

himitsu 26. Mai 2020 16:52

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
http://help.finalbuilder.com/Index.h...rsion_info.htm

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).
http://help.finalbuilder.com/Index.h...ric_action.htm

Da es die Möglichkeit git "DOS"-Komandos auszuführen,
http://help.finalbuilder.com/Index.h...doscommand.htm
https://wiki.finalbuilder.com/displa...+Script+Action
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:
master 7c8c3e76 2019-11-05 09:27
oder
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:
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
die Versionsinfo (%root%\fb-git-id.cmd)
Code:
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"
und die eigentliche Arbeit (%root%\fb-work.cmd)
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"

Aviator 26. Mai 2020 19:30

AW: GIT-Submodul version auslesen
 
Zitat:

Zitat von Sherlock (Beitrag 1465306)
PowerShell ist doch gerade auf dem Weg das zeitliche zu segnen, sei Avantgardist und lerne bash [...]

Habe ich die Ironie in deinem Beitrag nicht erkannt oder meinst du das ernst? Falls ja, könntest du das, ggf. in einem anderen Thread, erläutern und auch mit vertrauenswürdigen Quellen belegen?

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.

Sherlock 27. Mai 2020 14:37

AW: GIT-Submodul version auslesen
 
Zitat:

Zitat von Aviator (Beitrag 1465389)
Zitat:

Zitat von Sherlock (Beitrag 1465306)
PowerShell ist doch gerade auf dem Weg das zeitliche zu segnen, sei Avantgardist und lerne bash [...]

Habe ich die Ironie in deinem Beitrag nicht erkannt oder meinst du das ernst? Falls ja, könntest du das, ggf. in einem anderen Thread, erläutern und auch mit vertrauenswürdigen Quellen belegen?

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.

@Aviator: Ironie 8-)
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

himitsu 28. Mai 2020 13:11

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:
git rev-parse --abbrev-ref HEAD
, nach einem
Delphi-Quellcode:
git checkout
ohne
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:
git submodules | find %branch%
rausparsen.

Code:
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
[edit]
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:
git describe
keinen Hash/Version, obwohl es ja eigentlich das "Selbe" ist, wie "master, aktuell", aber vermutlich nur ein Fehler durch mich

himitsu 29. Mai 2020 16:07

AW: GIT-Submodul version auslesen
 
Moin, :cheer:

im Batch-Script (git-info.cmd) sieht es so aus
Code:
chcp 1252
bash git-info.sh %1
und im Bash-Script (git-info.sh) kommt sowas vor
Code:
gitdir=$1
if [ -n "$gitdir" ]; then gitdir="$(cygpath -u "$gitdir")"; fi
cd "$gitdir"
Nun wird aber bei einem Ümlaut im Pfad gemeckert
Code:
S:\MyRepo\git-info.sh: line 12: cd: $'"S:/MyRepo//master, aktuell mit &#9633;\204nderung im Stash"': No such file or directory
Also entweder stimmt irgendwo die Codierung nicht (UTF-8/ANSI)
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:
#!/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
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.
Und die Hilfe kann einen auch manchmal erschrecken, so dass man gleich wegrennen will.
Zitat:

Bash supports a surprising number of string manipulation operations. Unfortunately, these tools lack a unified focus. Some are a subset of parameter substitution, and others fall under the functionality of the UNIX expr command. This results in inconsistent command syntax and overlap of functionality, not to mention confusion.
aus https://www.tldp.org/LDP/abs/html/st...ipulation.html
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:

Aviator 29. Mai 2020 18:41

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"

himitsu 8. Jun 2020 14:40

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:
chcp 1252
cd /d "%~dp0"
md "Täst"
bash a.sh "%~dp0Täst"
pause
a.sh
Code:
#!/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"
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.

Assarbad 8. Jun 2020 21:48

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:

Zitat von himitsu (Beitrag 1465845)
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.
Und die Hilfe kann einen auch manchmal erschrecken, so dass man gleich wegrennen will.
Zitat:

Bash supports a surprising number of string manipulation operations. Unfortunately, these tools lack a unified focus. Some are a subset of parameter substitution, and others fall under the functionality of the UNIX expr command. This results in inconsistent command syntax and overlap of functionality, not to mention confusion.
aus https://www.tldp.org/LDP/abs/html/st...ipulation.html
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:

Es mag Inkonsistenzen bei Bash geben, aber einiges davon ist auch einfach der Tatsache geschuldet, daß es einige Dinge aus dem POSIX-Standard erbt, andere aber sinnvoll selbst implementiert. Bspw. würde ich immer empfehlen [[ ]] für Bedingungen in Bash zu benutzen, weil es einfach weniger Probleme macht in diversen Grenzfällen (bspw. wenn eine Variable zu einem leeren String expandiert usw.).

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:
#!/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
... wäre so besser:

Code:
#!/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")"
... oder halt für die letzten beiden Zeilen:

Code:
[[ -n "$gitdir" ]] && gitdir="$(cygpath -u "$gitdir")"
[[ -n "$dest" ]] && dest="$(cygpath -u "$dest")"
... und den drei Variablen könntest du jeweils auch Standardwerte zuordnen.

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:
mode=${3:-log}
Und wenn du ein frisches Skript beginnst, bietet sich

Code:
set -e
... an. Damit werden alle ungeprüften Rückgabewerte die nicht 0 sind, zum Beenden des Skripts führen. Fördert manchmal die Disziplin.

himitsu 10. Jun 2020 14:04

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:
#!/bin/bash
steht überall im Internet so, da denkt man doch das sei richtig so. .stupid:
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:
mode=${3:-log}
ist, hab ich nicht so ganz verstanden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz