Stellen Sie der Git-Commit-Nachricht einen teilweisen Branch-Namen voran

Lesezeit: 3 Minuten

Meine aktuelle Namenskonvention für Zweige lautet wie folgt:

ticket-45-my-new-feature-branch-description

Ich verwende diesen Code derzeit in meiner .git/hooks/prepare-commit-msg-Datei, um jeder Commit-Nachricht den Branch-Namen voranzustellen:

BRANCH_NAME=$(git branch 2>/dev/null | grep -e ^* | tr -d ' *')
if [ -n "$BRANCH_NAME" ] && [ "$BRANCH_NAME" != "master" ]; then
    echo "[$BRANCH_NAME] $(cat $1)" > $1
fi

Endresultat:

[ticket-45-my-new-feature-branch-description] test commit

Was ich erreichen möchte, ist die Ausgabe wie folgt:

[ticket-45] test commit

Brownie-Punkte, wenn wir es groß schreiben können:

[TICKET-45] test commit

Ich würde gerne meine beschreibenden Zweignamen beibehalten, aber den vorangestellten Text in Commit-Nachrichten abschneiden. Ich bin sicher, dass ich einige Regex verwenden muss, aber ich weiß wirklich nicht, wie ich das bewerkstelligen soll. Ich sollte erwähnen, dass wir mehrere Projekte gleichzeitig haben, daher sind die Namen der Zweige unterschiedlich, etwa so:

ticket-123-branch-name
abc-22-my-branch
ua-11-my-feature

Die einzige Gemeinsamkeit ist die Tatsache, dass ich alles vor dem zweiten ‘-‘ brauche.

Jede Hilfe wird sehr geschätzt!!!

  • Hallo. Könnten Sie das resultierende Skript veröffentlichen, nachdem Sie die folgenden Ratschläge befolgt haben? Danke!!

    – Benutzer3341592

    12. Januar ’21 um 16:12

Stellen Sie der Git Commit Nachricht einen teilweisen Branch Namen voran
torek

Okay, zuerst das:

BRANCH_NAME=$(git branch 2>/dev/null | grep -e ^* | tr -d ' *')

ist ein großer Overkill 🙂

branch=$(git symbolic-ref --short HEAD) || ...

um den aktuellen Zweignamen zu erhalten. Der Teil danach || ist “Was tun, wenn Sie sich nicht in einem Zweig befinden” (dh wenn Sie sich im Modus “Abgesetzter Kopf” befinden) – das müssen Sie selbst entscheiden. (Ihr aktueller Code setzt BRANCH_NAME auf den leeren String; dazu brauchen Sie nicht einmal die || Teil, aber vielleicht möchten Sie hinzufügen -q, oder ein 2>/dev/null, um die “fatal:”-Meldung von symbolic-ref zu vermeiden.)

Der Rest ist nur einfaches Scripting. In bash können Sie Regex’s direkt verwenden, in alten sh können Sie aufrufen expr oder sed. Beide sed und tr kann Großbuchstaben schreiben, aber sed kann auch eine Regex ausführen, also sieht es nach einem guten Kandidaten aus:

$ trimmed=$(echo $branch | sed -e 's:^([^-]*-[^-]*)-.*:1:' -e 
    'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/')
$ echo $trimmed
TICKET-45

Zu guter Letzt ist es etwas gefährlich, Folgendes zu tun:

echo "some stuff $(cat $1)" > $1

da Sie auf die Shell angewiesen sind, um die zu erweitern $(cat $1) bevor es die Ausgabedatei für die > $1 Teil. (Offensichtlich funktioniert es, aber Sie unterliegen Shell-Wahrnehmungen.) Verwenden Sie besser eine temporäre Datei oder vielleicht eine andere sed aber vor Ort:

sed -i .bak -e "1s:^:[$trimmed] :" $1
# or use -i '', but note minor warning in sed man pages

Das obige ist nur stückweise getestet, sollte aber funktionieren.

  • Das funktioniert wie ein Zauber. Danke für die sehr ausführliche Nachricht!

    – gjunkie

    12. November ’13 um 1:34

  • Das oben gepostete Skript stammt höchstwahrscheinlich aus meinem Blog, also schade um mich. Vielen Dank an Torek für die ausführliche Erklärung. Jetzt kann ich mich “ein bisschen besser Shell n00b” nennen 🙂 Ich werde meinen Blog mit Ihren Vorschlägen aktualisieren.

    – bartosz.majsak

    20. November 13 um 9:36 Uhr

  • @bartosz.majsak: Hey, jeder muss irgendwo anfangen 🙂

    – torek

    20. November ’13 um 13:45

  • branch=$(git symbolic-ref --short HEAD) $trimmed=$(echo $branch | sed -e 's/^([^-]*-[^-]*)-.*/1/' -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/') sed -i .bak -e "1s/^/[$trimmed] /" $1 – Dies erzeugt eine solche Commit-Nachricht: [] meine commt-Nachricht. Was kann der Grund sein?

    – Alex

    22. Juli ’15 um 7:40


  • @alex: dein obiges Zitat hat $trimmed= eher, als trimmed= (aber wenn ich das tue, bekomme ich Dinge wie =...: command not found Daher bin ich mir nicht sicher, ob das in Ihrem Original ist).

    – torek

    22. Juli ’15 um 9:18

.

185050cookie-checkStellen Sie der Git-Commit-Nachricht einen teilweisen Branch-Namen voran

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy