Lahme Commits mit KI töten?
Alle Commits in diesem Repo wurden von OpenCommit erstellt – schauen Sie sich die Commits an, um zu sehen, wie OpenCommit funktioniert. Emojis und lange Commit-Beschreibungen sind konfigurierbar, im Grunde alles.
Sie können OpenCommit verwenden, indem Sie es einfach wie folgt über die CLI ausführen oco
. Nach 2 Sekunden werden Ihre bereitgestellten Änderungen mit einer aussagekräftigen Nachricht übernommen.
Installieren Sie OpenCommit global, um es in jedem Repository zu verwenden:
npm install -g opencommit
Holen Sie sich Ihren API-Schlüssel von OpenAI oder anderen unterstützten LLM-Anbietern (wir unterstützen sie alle). Stellen Sie sicher, dass Sie Ihre OpenAI-Zahlungsdaten zu Ihrem Konto hinzufügen, damit die API funktioniert.
Legen Sie den Schlüssel auf OpenCommit-Konfiguration fest:
oco config set OCO_API_KEY= < your_api_key >
Ihr API-Schlüssel wird lokal in der Konfigurationsdatei ~/.opencommit
gespeichert.
Sie können OpenCommit mit dem Befehl oco
aufrufen, um eine Commit-Nachricht für Ihre bereitgestellten Änderungen zu generieren:
git add < files... >
oco
Das Ausführen von git add
ist optional, oco
erledigt das für Sie.
Sie können es auch mit einem lokalen Modell über Ollama ausführen:
ollama run mistral
(tun Sie dies nur einmal, um das Modell zu ziehen)git add < files... >
oco config set OCO_AI_PROVIDER= ' ollama ' OCO_MODEL= ' llama3:8b '
Das Standardmodell ist mistral
.
Wenn Sie Ollama haben, das in Docker/ auf einem anderen Computer mit GPUs (nicht lokal) eingerichtet ist, können Sie die Standard-Endpunkt-URL ändern.
Sie können dies tun, indem Sie die Umgebungsvariable OCO_API_URL
wie folgt festlegen:
oco config set OCO_API_URL= ' http://192.168.1.10:11434/api/chat '
Dabei ist 192.168.1.10 ein Beispiel für die Endpunkt-URL, für die Sie Ollama eingerichtet haben.
Es gibt mehrere optionale Flags, die mit dem Befehl oco
verwendet werden können:
Link zur GitMoji-Spezifikation: https://gitmoji.dev/
Dieses Flag kann nur verwendet werden, wenn das Konfigurationselement OCO_EMOJI
auf true
gesetzt ist. Mit diesem Flag können Benutzer alle Emojis in der GitMoji-Spezifikation verwenden. Standardmäßig ist die vollständige GitMoji-Spezifikation auf false
gesetzt, was nur 10 Emojis (?✅♻️⬆️?) umfasst.
Dies ist darauf zurückzuführen, dass die Anzahl der in jeder Anfrage gesendeten Token begrenzt wird. Wenn Sie jedoch die vollständige GitMoji-Spezifikation verwenden möchten, können Sie das Flag --fgm
verwenden.
oco --fgm
Mit diesem Flag können Benutzer die Änderungen automatisch festschreiben, ohne die Festschreibungsnachricht manuell bestätigen zu müssen. Dies ist nützlich für Benutzer, die den Commit-Prozess rationalisieren und zusätzliche Schritte vermeiden möchten. Um dieses Flag zu verwenden, können Sie den folgenden Befehl ausführen:
oco --yes
Erstellen Sie eine .env
Datei und fügen Sie dort OpenCommit-Konfigurationsvariablen wie folgt hinzu:
...
OCO_AI_PROVIDER = <openai (default), anthropic, azure, ollama, gemini, flowise>
OCO_API_KEY = <your OpenAI API token> // or other LLM provider API token
OCO_API_URL = <may be used to set proxy path to OpenAI api>
OCO_TOKENS_MAX_INPUT = <max model token limit (default: 4096)>
OCO_TOKENS_MAX_OUTPUT = <max response tokens (default: 500)>
OCO_DESCRIPTION = <postface a message with ~3 sentences description of the changes>
OCO_EMOJI = <boolean, add GitMoji>
OCO_MODEL = <either 'gpt-4o', 'gpt-4', 'gpt-4-turbo', 'gpt-3.5-turbo' (default), 'gpt-3.5-turbo-0125', 'gpt-4-1106-preview', 'gpt-4-turbo-preview' or 'gpt-4-0125-preview' or any Anthropic or Ollama model or any string basically, but it should be a valid model name>
OCO_LANGUAGE = <locale, scroll to the bottom to see options>
OCO_MESSAGE_TEMPLATE_PLACEHOLDER = <message template placeholder, default: ' $msg '>
OCO_PROMPT_MODULE = <either conventional-commit or @commitlint, default: conventional-commit>
OCO_ONE_LINE_COMMIT = <one line commit message, default: false>
Globale Konfigurationen sind dieselben wie lokale Konfigurationen, sie werden jedoch in der globalen Konfigurationsdatei ~/.opencommit
gespeichert und mit dem Befehl oco config set
festgelegt, z. B. oco config set OCO_MODEL=gpt-4o
.
Die lokale Konfiguration hat immer noch eine höhere Priorität als die globale Konfiguration, aber Sie können OCO_MODEL
und OCO_LOCALE
global festlegen und lokale Konfigurationen für OCO_EMOJI
und OCO_DESCRIPTION
pro Repo festlegen, was praktischer ist.
Legen Sie einfach eine der oben genannten Variablen wie folgt fest:
oco config set OCO_MODEL=gpt-4o-mini
Konfigurieren Sie GitMoji so, dass eine Nachricht vorangestellt wird.
oco config set OCO_EMOJI=true
So entfernen Sie Vorwort-Emojis:
oco config set OCO_EMOJI=false
Andere Konfigurationsoptionen verhalten sich genauso.
Sie können die OCO_WHY
-Konfiguration auf true
setzen, damit OpenCommit nach der Commit-Nachricht eine kurze Beschreibung ausgibt, WARUM die Änderungen vorgenommen wurden. Der Standardwert ist false
.
Damit dies korrekt funktioniert, müssen wir „was Dateien tun“ in einer Art Index oder Einbettung speichern und eine Suche (irgendwie RAG) nach der genauen Git-Commit-Nachricht durchführen. Wenn Sie Lust haben, diesen Kommentar zu diesem Ticket Nr. 398 zu erstellen, lassen Sie uns gemeinsam von dort aus fortfahren.
oco config set OCO_WHY=true
Standardmäßig verwendet OpenCommit gpt-4o-mini
-Modell.
Sie können zu gpt-4o wechseln, das eine bessere Leistung bietet, aber mehr kostet?
oco config set OCO_MODEL=gpt-4o
oder als günstigere Variante:
oco config set OCO_MODEL=gpt-3.5-turbo
Standardmäßig verwendet OpenCommit OpenAI.
Sie könnten zu Azure OpenAI Service oder Flowise oder Ollama wechseln.
oco config set OCO_AI_PROVIDER=azure OCO_API_KEY= < your_azure_api_key > OCO_API_URL= < your_azure_endpoint >
oco config set OCO_AI_PROVIDER=flowise OCO_API_KEY= < your_flowise_api_key > OCO_API_URL= < your_flowise_endpoint >
oco config set OCO_AI_PROVIDER=ollama OCO_API_KEY= < your_ollama_api_key > OCO_API_URL= < your_ollama_endpoint >
So legen Sie global die Sprache fest, die zum Generieren von Commit-Nachrichten verwendet wird:
# de, German, Deutsch
oco config set OCO_LANGUAGE=de
oco config set OCO_LANGUAGE=German
oco config set OCO_LANGUAGE=Deutsch
# fr, French, française
oco config set OCO_LANGUAGE=fr
oco config set OCO_LANGUAGE=French
oco config set OCO_LANGUAGE=française
Die Standard-Spracheinstellung ist Englisch. Alle verfügbaren Sprachen sind derzeit im i18n-Ordner aufgeführt
Eine Aufforderung zum Pushen an Git ist standardmäßig aktiviert. Wenn Sie sie jedoch deaktivieren möchten, verwenden Sie einfach:
oco config set OCO_GITPUSH=false
und es wird direkt nach der Bestätigung des Commits beendet, ohne zu fragen, ob Sie auf Remote übertragen möchten.
@commitlint
Mit OpenCommit können Sie das Eingabeaufforderungsmodul auswählen, das zum Generieren von Commit-Nachrichten verwendet wird. Standardmäßig verwendet OpenCommit seinen herkömmlichen Commit-Nachrichtengenerator. Sie können jedoch auch auf die Verwendung des Eingabeaufforderungsmoduls @commitlint
umsteigen, wenn Sie dies bevorzugen. Mit dieser Option können Sie Commit-Nachrichten in Bezug auf die lokale Konfiguration generieren.
Sie können diese Option festlegen, indem Sie den folgenden Befehl ausführen:
oco config set OCO_PROMPT_MODULE= < module >
Ersetzen Sie <module>
entweder durch conventional-commit
oder @commitlint
.
Um zur Verwendung des Eingabeaufforderungsmoduls '@commitlint
zu wechseln, führen Sie Folgendes aus:
oco config set OCO_PROMPT_MODULE=@commitlint
Führen Sie Folgendes aus, um zum standardmäßigen Nachrichtengenerator für herkömmliche Festschreibungen zurückzukehren:
oco config set OCO_PROMPT_MODULE=conventional-commit
@commitlint
Die Integration zwischen @commitlint
und OpenCommit erfolgt automatisch, wenn OpenCommit zum ersten Mal ausgeführt wird, wobei OCO_PROMPT_MODULE
auf @commitlint
gesetzt ist. Wenn Sie jedoch das Festlegen oder Zurücksetzen der Konfiguration für @commitlint
erzwingen müssen, können Sie den folgenden Befehl ausführen:
oco commitlint force
Um die generierte Konfiguration für @commitlint
anzuzeigen, können Sie diesen Befehl verwenden:
oco commitlint get
Dadurch können Sie sicherstellen, dass die Konfiguration wie gewünscht eingerichtet wird.
Darüber hinaus erstellt die Integration eine Datei mit dem Namen .opencommit-commitlint
, die die Eingabeaufforderungen enthält, die für die lokale @commitlint
-Konfiguration verwendet werden. Sie können diese Datei ändern, um die von OpenAI generierte Beispiel-Commit-Nachricht zu optimieren. Dies gibt Ihnen die Flexibilität, Anpassungen basierend auf Ihren Vorlieben oder Projektrichtlinien vorzunehmen.
OpenCommit generiert in Ihrem Projektverzeichnis eine Datei mit dem Namen .opencommit-commitlint
, die die für die lokale @commitlint
-Konfiguration verwendeten Eingabeaufforderungen enthält. Sie können diese Datei ändern, um die von OpenAI generierte Beispiel-Commit-Nachricht zu optimieren. Wenn sich die lokale @commitlint
-Konfiguration ändert, wird diese Datei bei der nächsten Ausführung von OpenCommit aktualisiert.
Dies bietet Ihnen eine bessere Kontrolle über die generierten Commit-Nachrichten und ermöglicht eine Anpassung, die den Konventionen Ihres Projekts entspricht.
Die Befehle opencommit
oder oco
können anstelle des Befehls git commit -m "${generatedMessage}"
verwendet werden. Das bedeutet, dass alle regulären Flags, die mit dem Befehl git commit
verwendet werden, auch bei Verwendung von opencommit
oder oco
angewendet werden.
oco --no-verify
wird übersetzt zu:
git commit -m " ${generatedMessage} " --no-verify
Um eine Nachricht in die generierte Nachricht einzubinden, können Sie beispielsweise die Vorlagenfunktion nutzen:
oco ' #205: $msg’
opencommit untersucht Platzhalter in den Parametern und ermöglicht Ihnen das Anhängen zusätzlicher Informationen vor und nach den Platzhaltern, z. B. dem relevanten Issue oder Pull Request. Ebenso haben Sie die Möglichkeit, das Konfigurationselement OCO_MESSAGE_TEMPLATE_PLACEHOLDER anzupassen und es beispielsweise auf $m!" zu vereinfachen.
Mit der Funktion OCO_MESSAGE_TEMPLATE_PLACEHOLDER
im opencommit
-Tool können Benutzer mithilfe einer Vorlagenfunktion eine benutzerdefinierte Nachricht in die generierte Commit-Nachricht einbetten. Diese Konfiguration soll die Flexibilität und Anpassbarkeit von Commit-Nachrichten verbessern und es Benutzern erleichtern, relevante Informationen direkt in ihre Commits aufzunehmen.
In unserer Codebasis finden Sie die Implementierung dieser Funktion im folgenden Segment:
commitMessage = messageTemplate . replace (
config . OCO_MESSAGE_TEMPLATE_PLACEHOLDER ,
commitMessage
) ;
Diese Zeile ist dafür verantwortlich, den Platzhalter im messageTemplate
durch die tatsächliche commitMessage
zu ersetzen.
Mit dem Befehl oco '$msg #205'
können Benutzer diese Funktion beispielsweise nutzen. Der bereitgestellte Code stellt die Backend-Mechanik solcher Befehle dar und stellt sicher, dass der Platzhalter durch die entsprechende Commit-Nachricht ersetzt wird.
Sobald Benutzer ihre gewünschte Commit-Nachricht generiert haben, können sie mit dem Commit mithilfe der generierten Nachricht fortfahren. Wenn Benutzer das volle Potenzial der Funktion und ihre Implementierungsdetails verstehen, können sie die generierten Nachrichten sicher für ihre Commits verwenden.
Sie können das Senden von Dateien an OpenAI verhindern, indem Sie eine .opencommitignore
Datei erstellen. Zum Beispiel:
path/to/large-asset.zip
**/*.jpg
Dadurch wird verhindert, dass opencommit Artefakte und große Dateien hochlädt.
Standardmäßig ignoriert opencommit Dateien, die mit *-lock.*
und *.lock
übereinstimmen
Sie können OpenCommit als Git- prepare-commit-msg
Hook festlegen. Hook lässt sich in Ihre IDE-Quellcodeverwaltung integrieren und ermöglicht Ihnen, die Nachricht vor dem Festschreiben zu bearbeiten.
Um den Haken zu setzen:
oco hook set
Um den Haken zu lösen:
oco hook unset
So verwenden Sie den Haken:
git add < files... >
git commit
Oder folgen Sie dem Prozess Ihrer IDE-Quellcodeverwaltungsfunktion, wenn sie den Befehl git commit
aufruft – OpenCommit wird in den Ablauf integriert.
OpenCommit ist jetzt als GitHub-Aktion verfügbar, die alle neuen Commit-Nachrichten automatisch verbessert, wenn Sie sie auf Remote übertragen!
Das ist großartig, wenn Sie sicherstellen möchten, dass alle Commits in allen Ihren Repository-Zweigen sinnvoll und nicht lahm wie fix1
oder done2
sind.
Erstellen Sie eine Datei .github/workflows/opencommit.yml
mit dem folgenden Inhalt:
name : ' OpenCommit Action '
on :
push :
# this list of branches is often enough,
# but you may still ignore other public branches
branches-ignore : [main master dev development release]
jobs :
opencommit :
timeout-minutes : 10
name : OpenCommit
runs-on : ubuntu-latest
permissions : write-all
steps :
- name : Setup Node.js Environment
uses : actions/setup-node@v2
with :
node-version : ' 16 '
- uses : actions/checkout@v3
with :
fetch-depth : 0
- uses : di-sukharev/[email protected]
with :
GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
env :
# set openAI api key in repo actions secrets,
# for openAI keys go to: https://platform.openai.com/account/api-keys
# for repo secret go to: <your_repo_url>/settings/secrets/actions
OCO_API_KEY : ${{ secrets.OCO_API_KEY }}
# customization
OCO_TOKENS_MAX_INPUT : 4096
OCO_TOKENS_MAX_OUTPUT : 500
OCO_OPENAI_BASE_PATH : ' '
OCO_DESCRIPTION : false
OCO_EMOJI : false
OCO_MODEL : gpt-4o
OCO_LANGUAGE : en
OCO_PROMPT_MODULE : conventional-commit
Das ist es. Wenn Sie jetzt zu einem Zweig in Ihrem Repo pushen, werden alle NEUEN Commits von Ihrer unermüdlichen KI verbessert.
Stellen Sie sicher, dass Sie öffentliche Kollaborationszweige ( main
, dev
etc
) in branches-ignore
ausschließen, damit OpenCommit dort keine Rebasing-Commits durchführt und gleichzeitig die Nachrichten verbessert.
Interaktives Rebase ( rebase -i
) ändert den SHA von Commits, sodass sich der Commit-Verlauf in Remote von Ihrem lokalen Branch-Verlauf unterscheidet. Dies ist in Ordnung, wenn Sie alleine an der Verzweigung arbeiten, kann aber für andere Mitarbeiter unpraktisch sein.
Sie bezahlen Ihre Anfragen an die OpenAI API selbst.
OpenCommit speichert Ihren Schlüssel lokal.
OpenCommit verwendet standardmäßig das 3,5-Turbo-Modell, es sollte 0,10 $ pro gelegentlichem Arbeitstag nicht überschreiten.
Sie können auf gpt-4 umsteigen, es ist besser, aber teurer.