Alias ​​in git erstellen

Lesezeit: 4 Minuten

Benutzer-Avatar
KyleMit

Ich bin sehr neu bei Git und versuche, die Commits aus einem Repository schrittweise durchzugehen. Anstatt die SHAs für jeden Commit zu kopieren und einzufügen, verwende ich diese Methode, um den nächsten Commit nach dem HEAD zu erhalten:

git checkout $(git rev-list HEAD..master | tail -n 1)

Das funktioniert perfekt, aber ich benutze es viel, also würde ich gerne die Syntax mit ein wenig aufräumen alias.

Erster Versuch

In einer idealen Welt würde eine Funktion namens „child-sha“ den Inhalt der gesamten Suche zurückgeben, sodass sie in Powershell so aufgerufen werden könnte:

git checkout child-sha

Wenn ich die Datei /.config öffne, kann ich den Befehl hinzufügen, indem ich den folgenden Abschnitt hinzufüge:

[alias]
    child-sha = $(git rev-list HEAD..master | tail -n 1)

Aber wenn ich es ausführe, erhalte ich den folgenden Fehler

Erweiterung des Alias ​​’child-sha’ fehlgeschlagen; ‘$(git’ ist kein Git-Befehl

Zweiter Versuch

Okay, also keine Verwendung $(). Wenn ich die Konfigurationsdatei wie folgt bearbeite:

[alias]
    child-sha = rev-list HEAD..master | tail -n 1

Rufen Sie dann so an:

git checkout $(git child-sha)

Dann bekomme ich folgenden Fehler

schwerwiegend: mehrdeutiges Argument ‘|’: unbekannte Revision oder Pfad nicht im Arbeitsbaum

Dritter Versuch – Funktioniert, aber schlampig

Okay, also keine Verwendung der Pipe (|). Wenn ich meine Konfigurationsdatei wie folgt aktualisiere:

git config --local alias.child-shas "rev-list HEAD..master"

Dann rufe ich so an:

get checkout $(git child-shas | tail -n 1)

Dann funktioniert es, aber ich habe nicht gespeichert das viel Platz.

Ich bin mir nicht sicher, was die einzelnen Funktionen im Skript tun, da ich mit Git- und Powershell-Befehlen im Allgemeinen wirklich neu bin. Google sucht nach den zu verwendenden Dokumenten $oder | oder tail zeigen nichts Hilfreiches, da Sonderzeichen oft aus der Suche entfernt werden.

Gibt es eine Möglichkeit, diese Funktion abzukürzen?


In einer separaten Anfrage möchte ich wirklich jeden Checkout durchlaufen, damit ich zu diesem Zeitpunkt die gesamte Codebasis anzeigen kann, damit ich eine kleine Demo für eine Präsentation einrichten kann. Ich scheine nicht, als ob irgendein GUI-Editor (GitHub-Windows, gitkoder Visual Studio-Tools für Git) gibt Ihnen ganz einfach die Möglichkeit, einen bestimmten Commit auszuchecken; sagen wir zum Beispiel, indem Sie mit der rechten Maustaste durch die Liste der Commits klicken.

  • Versuchen Sie: child-sha = “!git rev-list HEAD..master | tail -n 1”

    – Arkadiusz Drabczyk

    15. Juni 2014 um 19:25 Uhr

Sie vermissen den grundlegenden Trick, dass Git-Aliase (siehe „es sei denn“, gleich) nur direkte Git-Befehle sind, ohne dass eine Shell beteiligt ist und keine Möglichkeit besteht, Nicht-Git-Befehle auszuführen:

[alias]
    foo = checkout

wenn nicht vorausgegangen von einer Shell-Flucht ! Charakter:

[alias]
    bar = !git checkout

(an dieser Stelle bedeuten beide Aliase dasselbe). Seit du wollen die Shell einzubinden, um Unterbefehle auszuführen $(...) und Rohre ... | ...– das sind alles „Shell“-Dinge, keine „Git“-Dinge – Sie brauchen die ! Präfix-Syntax. Alle weiteren Experimente werden dann viel besser gehen.


Das heißt, um Ihr grundlegendes Problem anzugehen: Ich weiß wenig über die meisten GUI-Editoren, aber in gitk können Sie im obersten Bereich eine beliebige Revision auswählen, auf den „Baum“-Selektor im unteren rechten Bereich klicken und dann eine beliebige Datei im auswählen Baum (bei Bedarf durch die Verzeichnisse gehen), um die Datei im unteren linken Bereich anzuzeigen. Es ist wahr, dass Sie dadurch natürlich nicht den ganzen Baum erhalten, sondern nur eine Datei auf einmal. (Klicken Sie erneut auf die „Patch“-Auswahl, um zur Anzeige der Patches zurückzukehren.)

Das andere, was ich hier tun würde, ist, diese zu vermeiden HEAD-relative Operationen, wenn möglich: Anstelle von “einen Schritt nach vorne” (was schwierig ist), können Sie von einem bekannten festen Punkt aus beginnen – oder zumindest für die Dauer der Demo festgelegt – wie einem Branch-Namen, und die Revision von git verwenden Syntax (vgl gitrevisionen), um Commits auszuwählen, wie weit zurück Sie meinen:

git checkout master~5
... demonstrate something ...
git checkout master~4
... demonstrate next thing ...

Das ~n Syntax weist git an, rückwärts zu zählen n Eltern, die im Falle von Merge-Commits nur Links des ersten Elternteils folgen. Da 4 eins weniger als 5 ist, master~4 ist unbedingt einen Sprung näher dran master als master~5. (Wenn es Zusammenführungen gibt, sind die beiden zusammenzuführenden Elemente sprungweise von dem von Ihnen gewählten Startpunkt aus gleich weit entfernt, sodass diese spezielle Methode zu einfach ist, um die Wahrheit zu erfassen. Sie können damit beginnen master~3^2~2 zum Beispiel, aber es wird ziemlich chaotisch.)

  • Vielen Dank! Perfekt!

    – KyleMit

    16. Juni 2014 um 4:14 Uhr

1011050cookie-checkAlias ​​in git erstellen

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

Privacy policy