Wie vermeide ich es, zu Beginn jedes Git-Befehls "git" einzugeben?

190

Ich frage mich, ob es eine Möglichkeit gibt, zu vermeiden, dass das Wort gitam Anfang jedes Git-Befehls eingegeben werden muss.

Es wäre schön, wenn es eine Möglichkeit gäbe, den gitBefehl am Anfang nur einmal zu verwenden, nachdem eine Eingabeaufforderung geöffnet wurde, um in den "Git-Modus" zu gelangen .

Beispielsweise:

git>

Danach wird jeder von uns eingegebene Befehl standardmäßig als Git-Befehl interpretiert.

Ähnlich wie wir die MySQL-Shell zum Schreiben von Datenbankbefehlen verwenden:

mysql>

Dadurch muss ich nicht githunderte Male am Tag tippen .

HINWEIS: Ich verwende unter git-bashWindows.

Nächtlich
quelle
87
Für diejenigen, die für das Schließen gestimmt haben, weil es nicht zum Thema gehört, lesen Sie bitte den Text, auf den Sie klicken: "Fragen zu allgemeiner Computerhardware und -software sind für den Stapelüberlauf nicht zum Thema, es sei denn, es handelt sich direkt um Tools, die hauptsächlich für die Programmierung verwendet werden . ". Git ist ein Tool, das von Programmierern verwendet wird. Dies wird durch die Tatsache belegt, dass es auf dieser Site ein eigenes Tag gibt.
JBentley
5
Warum tippst du so viel "git"? Ihre IDE sollte über leistungsstarke VCS-Integrationen verfügen, die per Tastendruck verfügbar sind. Geben Sie lieber 50 Mal am Tag "git pull" ein oder drücken Sie Strg-t ... hören Sie auf , ein Kommandozeilen-Krieger zu sein, wenn Sie es nicht müssen;)
vikingsteve
8
@vikingsteve Praktisch alle Git-Hilfe und Weisheit wird in Bezug auf die Befehlszeile gegeben.
Ed Randall
6
@vikingsteve Ich schreibe es so oft, weil es schneller ist. Ich tippe ~ 100wpm, mehr, wenn ich mit den Tastendrücken vertraut bin, wie ich es mit Git bin; Im Vergleich zum Klicken auf GUIs ist es einfach einfacher. Ihre Lieblings-IDE verfügt möglicherweise über Tastaturkürzel. Das ist schön für dich. Warum sollte ich Zeit damit verschwenden, sie zu lernen, wenn <M-Tab> git blah <CR> bereits in meinem Muskelgedächtnis ist?
Fund Monica Klage
3
Es sollte ein "Diese Frage sollte geschlossen sein, weil der Benutzer eine Frage stellt, die keinen Sinn ergibt" geben - wie ich verstehe, was Sie fragen, aber wie wird die Shell wissen, dass Sie ein "Nicht beginnend mit" eingeben möchten git Befehl "wenn es tatsächlich einen Weg gab, dies zu tun.
user3728501

Antworten:

190

Vielleicht möchten Sie Gitsh ausprobieren . Aus ihrer Readme:

Das gitshProgramm ist eine interaktive Shell für Git. Von innen können gitshSie jeden git-Befehl ausgeben, auch wenn Sie Ihre lokalen Aliase und Konfigurationen verwenden.

  • Git-Befehle kommen in der Regel in Gruppen. Vermeiden Sie es, gitimmer und immer wieder zu tippen, indem Sie sie in einer speziellen Git-Shell ausführen:
sh$ gitsh
gitsh% status
gitsh% add .
gitsh% commit -m "Ship it!"
gitsh% push
gitsh% ctrl-d
sh$

Oder schauen Sie sich die anderen dort verlinkten Projekte an:

  • git-sh - Eine angepasste Bash-Shell mit einer Git-Eingabeaufforderung, Aliasnamen und Vervollständigung.
  • gitsh - Eine einfache Git-Shell, die in Perl geschrieben wurde.
  • repl - Umschließt jedes Programm mit Unterbefehlen in einer REPL.

Hinweis: Ich habe das selbst nicht benutzt.

alfunx
quelle
22
murren ... repl(1)ist keine REPL. Es wird nichts ausgewertet oder gedruckt. Es werden Programme ausgeführt.
Kevin
11
@ Kevin Es liest Benutzeranforderungen ein, wertet die Benutzeranforderung aus (indem ein Programm ausgeführt wird) und druckt die Ausgabe des Programms. Dies ist auch, was Muscheln tun.
Yakk - Adam Nevraumont
2
@ Yakk-AdamNevraumont: Nein, es wird mit Sicherheit nicht "die Ausgabe des Programms drucken". Es verbindet das stdout des Programms mit dem Terminal, und dann druckt das Programm seine eigene Ausgabe - außer dass das stdout des Programms bereits mit dem Terminal verbunden ist (automatisch über das fork()/ geerbt exec()), also repl(1)tut es das nicht einmal .
Kevin
6
@ Kevin Ich verstehe Ihr Gefühl, aber die strenge Definition einer REPL würde die meisten Dolmetscher-REPLs in verschiedenen Sprachen ausschließen. Nur in reinen Funktionssprachen können Sie sicherstellen, dass die Auswertung keine Nebenwirkungen aufweist. Selbst in Haskell akzeptiert der GHCi „REPL“ standardmäßig auch IOAktionen und führt diese aus, einschließlich Nebenwirkungen wie Drucken auf dem mit dem Terminal verbundenen Bildschirm.
links um den
2
@ Kevin replist keine eigenständige REPL; Es ist ein Mittel zum Erstellen eines REPL-Systems, in dem replnur die interaktive Komponente enthalten ist. Ist das fair?
Kyle Strand
116

Ein Perl-Einzeiler, der dies tut:

perl -nE 'BEGIN {print "git > "} system "git $_"; print "git > "'

Dies führt alles aus, was Sie eingeben, mit dem Präfix git. Und das wird so lange so bleiben, bis Sie treffen ^D.


quelle
6
Dies ist wirklich am ähnlichsten, was OP verlangt, und in einem sehr leichten Paket!
Ruohola
2
Dies wäre perfekt, wenn es mit readline funktionieren würde, aber leider nicht (nicht überraschend, da dies ausschließlich ein Hack um Perls -neFlaggen ist).
Konrad Rudolph
11
@KonradRudolphperl -MTerm::ReadLine -E '$n = Term::ReadLine -> new ("git"); while ($_ = $n -> readline ("git > ")) {system "git $_"}'
57

Dies ist nicht genau das, wonach Sie fragen, aber Sie können einige Shell-Aliase in Ihrem ~/.bashrcfür die Git-Befehle einrichten, die Sie am häufigsten verwenden:

alias commit='git commit'
alias checkout='git checkout'
...

Beachten Sie auch, dass Sie Aliase in Git selbst erstellen können:

git config --global alias.ci commit
git config --global alias.co checkout
...

Auf diese Weise können Sie git cianstelle von git commitusw. eingeben.

Thomas
quelle
7
Der Nachteil dieses Ansatzes besteht darin, dass für jeden Git-Befehl ein separater Alias ​​erstellt werden muss.
Tim Biegeleisen
22
Nur für die am häufigsten verwendeten. Ich meine, wie oft benutzt du git hash-objectoder git interpret-trailers? Ich biete dies nur als Alternative an, weil meines Wissens das, wonach die Frage gestellt wird, nicht wirklich existiert.
Thomas
15
Zusätzlich dazu, cidass commitich auch einen Shell-Alias gfür verwende git, reduziert dies den größten Teil der Eingabe und lässt mich in meiner bevorzugten Shell bleiben.
Rkta
32

Ich bin ein großer Fan von der Verwendung von Aliasen in ~ / .bash_profile für meinen GitBash. Wenn Sie sich für diesen Ansatz entscheiden, sind hier einige meiner Favoriten:

# git
alias gw='git whatchanged'
alias gg='git grep -n -C8'
alias ggi='git grep -i -n -C8'
alias gb='git branch'
alias gbd='git branch -D'
alias gba='git branch -a'
alias gc='git checkout'
alias gcp='git cherry-pick'
alias gfo='git fetch origin'
alias s='git status'
alias gmom='git merge origin/master'
alias grom='git rebase origin/master'
alias gpom='git pull origin master'
alias pplog='git log --oneline --graph --decorate'
JacobIRR
quelle
3
Wo ist Commit: P
QWR
14
Ich schließe nicht ein commitoder pushda ich ein paar zusätzliche Sekunden (während des Tippens) möchte, um sicherzugehen, dass ich nichts zerstöre
JacobIRR
3
Commit und Push sollten nichts zerstören können, es sei denn, Sie verwenden Force Push. Aber ich versuche vorher den Git-Status zu verwenden.
qwr
1
das habe ich auch getan, +1. Obwohl ich versucht bin, Gitsh zu versuchen, wie andere Antworten erwähnt haben
CoffeeTableEspresso
1
@CoffeeTableEspresso Ich respektiere die Tatsache, dass Sie anerkennen, dass ein paar Tastenanschläge den Unterschied zwischen dem Speichern von Updates und dem Zerstören eines Projekts ausmachen.
LogicalBranch
31

Verwenden Sie Ihren Editor.

Geben Sie den Befehl wie commitin Ihrem bevorzugten Editor wie vs code ein und arbeiten Sie effizienter mit git:

Geben Sie hier die Bildbeschreibung ein

Oder geben Sie ein git, um alle Befehle abzurufen:

Geben Sie hier die Bildbeschreibung ein

Prosti
quelle
13
Ich bin überrascht von all diesen Abstimmungen. Dies ist keine schreckliche Antwort für Personen, die IDEs verwenden, die diese Funktionen unterstützen.
Glen Pierce
4
Ich denke, die Leute haben abgestimmt, weil nicht jeder VS-Code verwendet / mag. In jedem Fall denke ich, dass es eine anständige Lösung ist, also +1 von mir.
LogicalBranch
4
@LogicalBranch, die Leute verwenden im Allgemeinen das Git über die Befehlszeile, und mir ist das bewusst, aber die Git-Unterstützung in einigen Editoren ist vorhanden und es lohnt sich, es zu versuchen.
Prosti
1
Ich mag diese Antwort nicht, weil nicht jeder VS-Code verwendet (ich persönlich mag sie nicht), aber ich werde nicht abstimmen, weil dies eine nette Lösung für Leute ist, die sie verwenden.
CoffeeTableEspresso
1
@CoffeeTableEspresso, wenn Sie sublime verwenden, gibt es ein Plugin namens gitsavvy und so weiter ... Fast jeder Editor hat heutzutage eine Art Unterstützung für git. Dies war der Punkt der Antwort, da Sie "Verwenden Sie Ihren Editor" lesen können.
Prosti
26

Ein Freund von mir hat ein kleines Bash-Skript erstellt, das dies erreicht. Es heißt Replify .

$ replify git
Initialized REPL for [git]
git> init
Initialized empty Git repository in /your/directory/here/.git/

git> remote add origin https://your-url/repo.git

git> checkout -b new-branch
Switched to a new branch 'new-branch'

git> push
Sam Weaver
quelle
6
OK, das habe ich bereits in Umurs Antwort erwähnt, aber die Verwendung evalin der ursprünglichen Skriptquelle ist nicht die beste Idee. Sagen Sie Ihrem Freund, while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";donestattdessen zu verwenden
Sergiy Kolodyazhnyy
23

Hier ist ein anderer Weg. Es ist auch nicht ganz das, was gefragt wurde, aber ich benutze es seit einiger Zeit und es ist ziemlich schön. Fügen Sie Ihrer Zeile die folgende Zeile hinzu ~/.bashrc:

complete -E -W git

Wenn Sie nun an einer leeren Bash-Eingabeaufforderung die Tabulatortaste drücken, wird "git" eingegeben.

Nomadentyp
quelle
5
Beachten Sie, dass Sie eine andere Shell in der entsprechenden Datei ablegen müssen, wenn Sie sie verwenden. Zum Beispiel werden Sie es für zsh ~/zshrc~/tcshrc
einfügen
20

Ich weiß, dass dies eine sehr späte Antwort ist, aber diese Frage hat mich wirklich beeindruckt, weil ich mich schon seit einiger Zeit mit dieser Art von Wiederholung beschäftige.

Ich bin mir nicht sicher, aber ich möchte ehrlich gesagt nicht (ich wiederhole NICHT ) Aliase für jeden gitBefehl erstellen. Stattdessen habe ich ein Python-Skript namens NoGit geschrieben , um dieses Problem zu lösen:

#!/usr/bin/env python
import sys, os, signal, atexit, readline, subprocess

commands, stop, history_file = [], False, os.path.join(os.getcwd(), "git.history")

def run_commands():
  stop = True
  for cmd in commands:
    command = ["git" if not cmd.startswith("git ") else ""]
    command = [cmd] if command[0] == "" else [command[0], cmd]
    subprocess.Popen(command).communicate()
    commands = []

def signal_handler(sig, frame):
  run_commands()
  sys.exit(0)

try:
  readline.read_history_file(history_file)
  signal.signal(signal.SIGINT, signal_handler)

  while True:
    if stop == True:
      break
    command = input("git> ")
    if command == "%undo":
      commands.pop()
    elif command == "%run":
      run_commands()
    elif command == "%exit":
      sys.exit(0)
    else:
      commands += [cmd.strip() for cmd in command.split(";")]

  signal.pause()
  readline.set_history_length(-1)
except IOError:
  pass

atexit.register(readline.write_history_file, history_file)

NoGit ist ein einfaches Python-Skript, um die unnötige Wiederholung des Schlüsselworts "git" zu verhindern.

Dokumentation:

  • Der %undoBefehl entfernt den letzten Befehl vom Stapel
  • Der %runBefehl führt die Befehle im Stapel aus und löscht den Stapel
  • Der %exitBefehl schließt die CLI, ohne etwas zu tun
  • Drücken ctr+cist dasselbe wie Laufen%run; %exit
  • Das Skript speichert Befehle, die ausgeführt wurden, in einer Datei, die git.historyim selben Ordner wie das Skript aufgerufen wird
  • Sie können mehrere Befehle in einer Zeile mit einem Semikolon hinzufügen
  • Sie können das Schlüsselwort gitam Anfang des Befehls verwenden und das Skript wird es nicht duplizieren ( EG: git init wird nicht git git init)

Beispielbefehle:

  1. init
  2. add .
  3. stage .
  4. commit -m "inital commit"
  5. %run; %exit

Zusätzliche Informationen (für Linux-Benutzer):

Wenn Sie möchten, können Sie die .pyErweiterung entfernen und in eine ausführbare Datei konvertieren, indem Sie:

mv ./git.py ./git
chmod +x ./git

Dann anstatt das Skript wie folgt aufzurufen:

python3 git.py

Sie würden dies stattdessen ausführen:

./git

Zusätzliche Informationen (für faule Leute):

Wenn Sie faul sind und kein a eingeben möchten, können ./Sie dieses Skript in Ihren /bin/Ordner verschieben und einen Alias ​​dafür erstellen.

Wenn Sie wirklich sehr, sehr faul sind, verwenden Sie die folgenden Befehle:

sudo cp ./git /bin/nogit
sudo chmod +x /bin/nogit
alias nogit='/bin/nogit'

Wenn Sie wirklich, wirklich, wirklich faul sind, kopieren Sie den folgenden Einzeiler und fügen Sie ihn ein:

sudo cp ./git /bin/nogit && sudo chmod +x /bin/nogit && alias nogit='/bin/nogit'

Wenn Ihre Faulheit ein Niveau erreicht hat, das der Menschheit bisher unbekannt war, finden Sie hier eine kompaktere Version desselben Einzeilers:

sudo cp ./git /bin/nogit;sudo chmod +x /bin/nogit;alias nogit='/bin/nogit'

Viel Glück.

LogicalBranch
quelle
17

Ein weiterer Ansatz, der mit allen Befehlen funktioniert: Verwenden Sie Strg + R (Reverse-i-Search).

Mit der Reverse-i-Suche können Sie Ihren Befehlsverlauf durchsuchen. Wiederholen Sie Strg + R, nachdem Sie Ihre Suchzeichenfolge gedrückt haben, um die Suche mit derselben Zeichenfolge weiter hinten zu wiederholen.

Sie müssen einen Befehl nur einmal eingeben, dann können Sie diesen Befehl aus beliebigen Teilzeichenfolgen des Befehls abrufen. In den meisten Fällen können Sie ganze sehr lange Befehle und ihre verschiedenen Varianten mit nur zwei bis drei gut platzierten Suchbuchstaben abrufen. Es sind keine Vorkonfigurationen erforderlich, außer dass Sie Ihre Shell normal verwenden. Sie passt sich an die Verwendung der Shell an. Geben Sie einfach den vollständigen Befehl einmal ein, und die Befehle werden automatisch zu Ihrem Befehlsverlauf hinzugefügt.

  • git commit --amend:: <Ctrl+R>am
  • git pull:: <Ctrl+R>pu
  • git rebase --rebase-merges -i --onto origin/develop origin/develop feature/blue-header:: <Ctrl+R>blu
  • git rebase --abort:: <Ctrl-R>ab
  • git rebase --continue:: <Ctrl-R>con
  • docker-compose stop && git pull && make && docker-compose up -d:: <Ctrl-R>up
  • etc

Darüber hinaus funktioniert Strg-R nicht nur mit Bash, sondern mit vielen Programmen, die eine Readline-Bibliothek verwenden (und es gibt viele davon), wie Python-Shell, IPython, MySQL-Shell, Psql-Shell, IRB (Ruby) usw.

Lie Ryan
quelle
15

In Ihrem Beispiel vergleichen Sie es mit einer MySQL-Eingabeaufforderung. Die Funktionsweise besteht darin, dass ein MySQL-Prozess gestartet wird und Sie diesem Prozess Ihre Befehle geben. Warum schreiben Sie nicht etwas Ähnliches in der Sprache Ihrer Wahl? Hier ist ein einfaches Beispiel in C ++:

#include <iostream>
#include <cstdlib>

int main(int argc, char *argv[]){
    while(true){
        std::cout << "git> ";
        std::cout.flush();
        std::string command;
        std::getline(std::cin, command);
        if(command == "exit") break;
        std::system("git " + command);
    }

    return 0;
}

Bitte beachten Sie, dass ich das gerade aus dem Speicher geschrieben habe und es nicht mit einem Compiler überprüft habe. Es kann triviale Syntaxfehler geben.

john01dav
quelle
Nur mein Gedanke. Jeder, der sich im Stapelüberlauf befindet, sollte in der Lage sein, ein solches Programm selbst zu codieren. Die Programmiersprache spielt keine Rolle.
Thomas Weller
@ ThomasWeller Ich stimme definitiv zu. Ich habe das Programm gepostet, um genau zu zeigen, worüber ich gesprochen habe, nicht weil es schwierig zu schreiben ist.
John01Dav
9
Sie werden viel Zeit in diesen Ansatz investieren, wenn Sie möchten, dass das Programm fehlerfrei ist und über eine angemessene Anzahl von Funktionen verfügt. Nachdem Sie beispielsweise den anfänglichen Build-Fehler behoben haben (std :: system () möchte const char *), werden Sie feststellen, dass EOF eine Endlosschleife enthält. Möglicherweise möchten Sie Unterstützung für Verlauf / Readline, Vervollständigung von Registerkarten, einige integrierte Funktionen zum Ändern des Verzeichnisses / Festlegen von env vars / shell out / ... usw. Wenn bereits Software vorhanden ist (in diesem Fall gitsh), warum nicht?
Nomadentyp
1
@nomadictype Das ist eine berechtigte Kritik, aber das Erlernen anderer Software ist auch eine zeitliche Verpflichtung. Die Vorteile dieses Ansatzes bestehen darin, dass nur wenige Minuten benötigt werden, um ihn zum Laufen zu bringen, und dass er genau das tut , was Sie erwarten oder wollen (mit Änderungen).
John01Dav
2
Der Verlust von Readline, Zeilenbearbeitung, Verlaufsunterstützung, die Möglichkeit, einfache Befehle wie ls usw. auszuführen, kostet Sie viel mehr als die vier Tastenanschläge, die Sie damit gespeichert haben.
Lie Ryan
13

Für grundlegende Dinge können Sie tun:

function ggit(){ while true; do printf 'git> '; read; eval git $REPLY; done }
git> status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    deleted:    yarn.lock

no changes added to commit (use "git add" and/or "git commit -a")
git> add .
git> status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    yarn.lock

git>

Beenden Sie mit Strg + c

Umur Kontacı
quelle
2
Anständige Idee, jedoch gibt es zwei Probleme. Einer, der ;nach tun , führt zu bash: syntax error near unexpected token ; "` Zweitens ist der evalTeil zu Schwachstellen anfällig ist. Überlegen Sie zum Beispiel, was passiert, wenn ich status;cat /etc/passwdin diese kleine Shell tippe. Harmloses Beispiel, aber Sie bekommen die Idee, was passieren kann. Sie können das vereinfachen. while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";doneDies ist natürlich nicht kugelsicher, aber 1 - es ist einfacher und 2 - vermeidet die Ausführung von Nicht-Git-Befehlen (aufgrund von doppelten Anführungszeichen). Nicht ideal, nur ein bisschen besser
Sergiy Kolodyazhnyy
@Abigail Funny :) Warum ja, Shell selbst ist nicht die sicherste Anwendung. Sogar das Catten einer Datei kann ein Problem sein. Der Punkt, den ich ursprünglich angesprochen habe, ist jedoch, dass wir keinen MySQL-Interpreter sehen, der Shell-Befehle ausführt, nicht ohne systemoder \!zumindest am Anfang. Wo die Annahme sein könnte, dass diese "Repl" gitnur Befehle ausführt , erlaubt sie tatsächlich mehr als das.
Sergiy Kolodyazhnyy
@Abigail Ich habe keine Angst, weil ich weiß, was das macht. Andere, die dies nicht tun, brechen möglicherweise etwas, das sie nicht sollten. Und wieder - eval ist nicht die beste Idee, um Befehle auszuführen, insbesondere wenn benutzergesteuerte Eingaben erforderlich sind.
Sergiy Kolodyazhnyy
Der Tippfehler danach wurde behoben do. Vielen Dank! re: security: Dies ist offensichtlich nicht als separate Anwendung gedacht. Geben .bash_profileSie einfach Ihre ein, wenn Sie nicht gerne Git eingeben. Ich mache mir keine Sorgen darüber, dass es "unsicher" ist. Wenn Sie Dinge in Ihre Bash einfügen, die Sie nicht verstehen (einschließlich dieses Oneliner-Skripts), werden Sie eine schlechte Zeit haben. Ich mag das, weil es einfach, leicht zu schreiben und leicht zu lesen und leicht zu verbessern ist.
Umur Kontacı
2

Als ich Windows 7 mit Conemu verwendet habe, habe ich meinem Startskript für die Entwicklungsumgebung Folgendes hinzugefügt:

doskey g=git $*

Damit könnte ich einfach den gBefehl verwenden, anstatt zu tippen git. Zuletzt habe ich es mit Windows 10 und Conemu versucht, es hat nicht funktioniert, es gibt einen Fehler, denke ich, aber es ist einen Versuch wert.

Adamsan
quelle
2

Verwenden Sie einen Klammer-Editor, es ist einfach, Ihre Code- und Git-Befehle zu verwenden, und es hat auch viele Funktionen.

Geben Sie hier die Bildbeschreibung ein

In der oberen rechten Ecke wird das zweite Fernglas-Symbol zum Installieren von Erweiterungen verwendet.

Geben Sie hier die Bildbeschreibung ein

Suchen Sie nach einer Erweiterung brackets gitwie dem obigen Bild und installieren Sie sie.

Geben Sie hier die Bildbeschreibung ein

Wieder in der oberen rechten Ecke wird das vierte Symbol angezeigt. Klicken Sie also einfach auf und sehen Sie die Änderungen wie im obigen Bild.

Wenn Sie Klammern installieren möchten, verwenden Sie die folgenden Befehle:

sudo add-apt-repository ppa:webupd8team/brackets
sudo apt-get update
sudo apt-get install brackets

Weitere Informationen finden Sie unter: So installieren Sie den Brackets Code Editor in Ubuntu und Linux Mint unter Ubuntupit .

akash
quelle