Jak uniknąć wpisywania „git” na początku każdego polecenia Git?

190

Zastanawiam się, czy istnieje sposób, aby uniknąć konieczności wpisywania słowa gitna początku każdego polecenia Git.

Byłoby miło, gdyby istniał sposób użycia gitpolecenia tylko raz na początku po otwarciu wiersza polecenia, aby przejść do „trybu Git” .

Na przykład:

git>

Po którym każde wpisane polecenie jest domyślnie interpretowane jako polecenie Git.

W sposób podobny do tego, w jaki sposób używamy powłoki MySQL do pisania poleceń bazy danych:

mysql>

Dzięki temu nie będę musiał pisać gitsetki razy dziennie.

UWAGA: używam git-bashw systemie Windows.

Nocny
źródło
87
Do tych, którzy głosowali za zamknięciem ze względu na to, że jest nie na temat, przeczytaj tekst, który klikniesz: „Pytania dotyczące ogólnego sprzętu komputerowego i oprogramowania są nie na temat przepełnienia stosu, chyba że dotyczą bezpośrednio narzędzi używanych głównie do programowania . ” Git to narzędzie używane przez programistów. Dowodzi tego fakt, że ma on własny tag na tej stronie.
JBentley,
5
Dlaczego tak często piszesz „git”? Twoje IDE powinno mieć potężne integracje vcs dostępne po naciśnięciu klawisza. Czy wolisz pisać „git pull” 50 razy dziennie, czy ctrl-t ... przestań być wojownikiem z linii poleceń, kiedy nie musisz;)
vikingsteve
8
@vikingsteve Praktycznie cała git pomoc i mądrość są podawane w postaci wiersza poleceń.
Ed Randall,
6
@vikingsteve Piszę tak dużo, ponieważ jest szybszy. Wpisuję ~ 100wpm, więcej, jeśli dobrze znam klawisze tak jak w Git; w porównaniu do klikania w GUI, jest to po prostu łatwiejsze. Twoje ulubione IDE może mieć skróty klawiaturowe. To miło z twojej strony. Dlaczego miałby mi tracić czasu na ich naukę, gdy <M-Tab> git bla <CR> jest już w mojej pamięci mięśniowej?
Pozew funduszu Moniki z
3
Powinno być „to pytanie powinno zostać zamknięte, ponieważ użytkownik zadaje pytanie, które nie ma sensu” - tak jak ja rozumiem, o co pytasz, ale skąd powłoka będzie wiedziała, że ​​chcesz wprowadzić „nie zaczynające się od” git command ”, jeśli rzeczywiście był na to sposób.
user3728501

Odpowiedzi:

190

Możesz spróbować gitsh . Z ich pliku Readme:

gitshProgram jest interaktywny shell na git. Z wewnątrz gitshmożesz wydać dowolne polecenie git, nawet używając lokalnych aliasów i konfiguracji.

  • Polecenia git zwykle występują w grupach. Unikaj ciągłego pisania, gituruchamiając je w dedykowanej powłoce git:
sh$ gitsh
gitsh% status
gitsh% add .
gitsh% commit -m "Ship it!"
gitsh% push
gitsh% ctrl-d
sh$

Lub spójrz na inne powiązane projekty:

  • git-sh - Dostosowana powłoka bash z monitem Git, aliasami i zakończeniem.
  • gitsh - Prosta powłoka Git napisana w Perlu.
  • repl - Zawija dowolny program z podkomendami w REPL.

Uwaga: sam tego nie używałem.

alfunx
źródło
22
narzekanie ... repl(1)nie jest REPL. Nic nie ewaluuje ani nie drukuje. Uruchamia programy.
Kevin
11
@Kevin Odczytuje żądania użytkownika, ocenia żądanie użytkownika (uruchamiając program) i drukuje dane wyjściowe programu. To właśnie robią powłoki.
Yakk - Adam Nevraumont,
2
@ Yakk-AdamNevraumont: Nie, z całą pewnością nie „drukuje wyników programu”. Przechwytuje stdout programu do terminalu, a następnie program drukuje własne wyjście - z wyjątkiem stdout Program jest już podłączona do terminala (dziedziczona automatycznie nad fork()/ exec()), więc repl(1)nawet nie robi to .
Kevin
6
@Kevin Rozumiem twoje zdanie, jednak ścisła definicja REPL wyklucza większość „REPL” tłumaczy w różnych językach. Tylko w czysto funkcjonalnych językach można zapewnić, że ocena nie ma skutków ubocznych, ale nawet w Haskell GHCi „REPL” domyślnie akceptuje również IOdziałania i wykonuje je, w tym efekty uboczne, takie jak drukowanie na ekranie podłączonym do terminala.
leftaroundabout
2
@Kevin replnie jest samodzielną REPL; to sposób na stworzenie systemu REPL, w którym repljest tylko komponent interaktywny. Czy to w porządku?
Kyle Strand
116

Jednowierszowy Perl, który to zrobi:

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

Wykona to wszystko, co wpiszesz, z prefiksem git. I tak będzie, dopóki nie uderzysz ^D.


źródło
6
To naprawdę najbardziej przypomina to, o co prosi OP, w bardzo lekkim pakiecie!
ruohola
2
Byłoby to idealne, gdyby działało z readline, ale niestety nie działa (nic dziwnego, ponieważ jest to tylko hack wokół -neflag Perla ).
Konrad Rudolph,
11
@KonradRudolphperl -MTerm::ReadLine -E '$n = Term::ReadLine -> new ("git"); while ($_ = $n -> readline ("git > ")) {system "git $_"}'
57

Nie jest to dokładnie to, o co prosisz, ale możesz ustawić aliasy powłoki w swoich ~/.bashrcpoleceniach Git, których najczęściej używasz:

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

Pamiętaj też, że możesz tworzyć aliasy w samym Git:

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

To pozwala pisać git cizamiast git commit, i tak dalej.

Tomasz
źródło
7
Wadą tego podejścia jest konieczność utworzenia osobnego aliasu dla każdego polecenia Git.
Tim Biegeleisen
22
Tylko dla najczęściej używanych. Mam na myśli, jak często używasz git hash-objectlub git interpret-trailers? Po prostu oferuję to jako alternatywę, ponieważ o ile wiem, pytanie o to tak naprawdę nie istnieje.
Thomas
15
Oprócz cidla commitużywam również aliasu powłoki gdla git, to zmniejsza większość pisania i pozwala mi pozostać w mojej preferowanej powłoce.
rkta
32

Jestem wielkim fanem używania aliasów w ~ / .bash_profile dla mojego GitBash. Jeśli zastosujesz to podejście, oto niektóre z moich ulubionych:

# 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
źródło
3
gdzie jest zatwierdzenie: P
qwr
14
I nie obejmują commitani pushponieważ chcę kilka dodatkowych sekund (w trakcie pisania), aby mieć pewność, że ja nie niszcząc coś
JacobIRR
3
Commit i push nie powinny być w stanie niczego zniszczyć, chyba że użyjesz siły push. Ale staram się wcześniej użyć statusu git.
qwr
1
to też zrobiłem, +1. Chociaż mam ochotę spróbować gitsh, jak wspomniano w innych odpowiedziach
CoffeeTableEspresso
1
@CoffeeTableEspresso Szanuję fakt, że zdajesz sobie sprawę, że kilka naciśnięć klawiszy stanowi różnicę między zapisywaniem aktualizacji a niszczeniem projektu.
LogicalBranch
31

Użyj swojego edytora.

Wpisz polecenie jak commitz ulubionego edytora, np. Vs code, i wydaj się dzięki git:

wprowadź opis zdjęcia tutaj

Lub wpisz, gitaby uzyskać wszystkie polecenia:

wprowadź opis zdjęcia tutaj

prosti
źródło
13
Jestem zaskoczony tymi wszystkimi głosami. To nie jest okropna odpowiedź dla osób korzystających z IDE obsługujących te funkcje.
Glen Pierce
4
Myślę, że ludzie głosowali w dół, ponieważ nie wszyscy używają / lubią VS-Code. Tak czy inaczej, myślę, że to przyzwoite rozwiązanie, więc daj +1 ode mnie.
LogicalBranch
4
@LogicalBranch, ludzie zazwyczaj używają git z wiersza poleceń i jestem tego świadomy, ale obsługa git w niektórych edytorach istnieje i warto spróbować.
prosti
1
Nie podoba mi się ta odpowiedź, ponieważ nie wszyscy używają kodu VS (osobiście mi się nie podoba), ale nie będę głosować negatywnie, ponieważ jest to dobre rozwiązanie dla ppl, które go używają.
CoffeeTableEspresso
1
@CoffeeTableEspresso, jeśli używasz wzniosłej, istnieje wtyczka o nazwie gitsavvy i tak dalej ... Prawie każdy edytor ma obecnie jakieś wsparcie dla git. To był punkt odpowiedzi, ponieważ możesz przeczytać „Użyj swojego edytora”.
prosti
26

Mój przyjaciel napisał mały skrypt bash, który to osiąga. To się nazywa Zamień .

$ 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
źródło
6
OK, wspomniałem już o tym w odpowiedzi Umura, ale użycie evaloryginalnego źródła skryptu nie jest najlepszym pomysłem. Powiedz swojemu przyjacielowi, aby używał while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";donezamiast tego
Sergiy Kolodyazhnyy
23

Oto inny sposób. To również nie do końca to, o co pytano, ale używam go od jakiegoś czasu i jest całkiem fajny. Dodaj następujący wiersz do ~/.bashrc:

complete -E -W git

Teraz naciskając Tab po pustym znaku zachęty Bash wypisze „git”.

koczownik
źródło
5
Pamiętaj, że jeśli używasz innej powłoki, musisz umieścić ją w odpowiednim pliku. Na przykład dla zsh wstawisz go ~/zshrc, dla tcsh wstawisz ~/tcshrcitd.
TheOnlyMrCat
20

Wiem, że to bardzo późna odpowiedź, ale to pytanie naprawdę przykuło moją uwagę, ponieważ od dłuższego czasu mam do czynienia z cierpieniem z powodu tego rodzaju powtórzeń.

Nie jestem pewien co do ciebie, ale szczerze mówiąc nie chcę (powtarzam NIE ) tworzenia aliasów dla każdego gitpolecenia, więc zamiast tego napisałem skrypt Pythona o nazwie NoGit, aby rozwiązać ten problem:

#!/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 to prosty skrypt w języku Python, który zapobiega niepotrzebnemu powtarzaniu słowa kluczowego „git”.

Dokumentacja:

  • %undopolecenie usuwa ostatnią komendę ze stosu
  • %runpolecenie uruchamia polecenia w stosie i czyści stos
  • %exitkomenda zamyka CLI bez robienia czegokolwiek
  • naciskanie ctr+cjest takie samo jak bieganie%run; %exit
  • skrypt zapisuje polecenia, które zostały wykonane, w pliku wywoływanym git.historyw tym samym folderze co skrypt
  • możesz dodać wiele poleceń w jednym wierszu za pomocą średnika
  • możesz użyć słowa kluczowego gitna początku polecenia, a skrypt go nie powieli (np . : git init nie stanie się git git init)

Przykładowe polecenia:

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

Informacje dodatkowe (dla użytkowników Linuksa):

Jeśli chcesz, możesz usunąć .pyrozszerzenie i przekonwertować je na plik wykonywalny, używając:

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

Następnie zamiast wywoływać skrypt w następujący sposób:

python3 git.py

Uruchomiłbyś to zamiast tego:

./git

Informacje dodatkowe (dla leniwych):

Jeśli jesteś leniwy i nie chcesz pisać, ./możesz przenieść ten skrypt do swojego /bin/folderu i utworzyć dla niego alias.

Jeśli jesteś naprawdę, bardzo leniwy, użyj następujących poleceń:

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

Jeśli jesteś naprawdę, naprawdę, naprawdę leniwy, skopiuj i wklej następujący jedno-liner:

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

Jeśli twoje lenistwo osiągnęło poziomy nieznane wcześniej ludzkości, oto bardziej kompaktowa wersja tego samego liniowca:

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

Powodzenia.

LogicalBranch
źródło
17

Inne podejście, które będzie działać z dowolnymi poleceniami: użyj Ctrl + R (reverse-i-search).

Funkcja wyszukiwania wstecznego umożliwia przeszukiwanie historii poleceń. Powtórz Ctrl + R po naciśnięciu szukanego ciągu, aby powtórzyć wyszukiwanie z tym samym ciągiem wstecz.

Wystarczy wpisać polecenie tylko raz, a następnie można je przywołać z dowolnego podłańcucha polecenia. W większości przypadków możesz przywołać całe bardzo długie polecenia i ich różne warianty za pomocą zaledwie dwóch do trzech dobrze umieszczonych liter wyszukiwania. Nie są wymagane żadne wstępne konfiguracje oprócz normalnego używania powłoki i jest ona dostosowująca się do sposobu używania powłoki, wystarczy wpisać raz pełne polecenie, a polecenia zostaną automatycznie dodane do historii poleceń.

  • 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
  • itp

Co więcej, Ctrl-R działa nie tylko na bash, ale na wielu programach, które używają biblioteki readline (a jest ich wiele), takich jak powłoka Python, IPython, powłoka mysql, powłoka psql, irb (ruby) itp.

Lie Ryan
źródło
15

W twoim przykładzie porównujesz go z monitem MySql. Działa to tak, że rozpoczyna się proces MySql, a ty podajesz komendom ten proces. Jako taki, dlaczego nie napisać czegoś podobnego w wybranym języku? Oto prosty przykład w 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;
}

Pamiętaj, że właśnie napisałem to z pamięci i nie sprawdziłem tego za pomocą kompilatora. Mogą występować trywialne błędy składniowe.

john01dav
źródło
Po prostu moja myśl. Każdy na stosie przepełnienia stosu powinien być w stanie samodzielnie kodować taki program. Język programowania nie ma tak naprawdę znaczenia.
Thomas Weller
@ThomasWeller Zdecydowanie się zgadzam. Opublikowałem program, aby dokładnie pokazać, o czym mówiłem, nie dlatego, że jest to program trudny do napisania.
john01dav
9
Będziesz inwestować dużo czasu w takie podejście, jeśli chcesz, aby program był wolny od błędów i miał przyzwoitą liczbę funkcji. Na przykład po naprawieniu początkowej awarii kompilacji (std :: system () chce const char *) zauważysz, że na EOF istnieje nieskończona pętla. Możesz potrzebować wsparcia historii / readline, uzupełniania tabulatorów, niektórych wbudowanych plików, aby zmienić katalog / ustawić env vars / shell out / ... itd. Jeśli istnieje oprogramowanie (w tym przypadku gitsh), dlaczego go nie użyć?
koczowniczy typ
1
@nomadictype To uzasadniona krytyka, ale nauka innego oprogramowania to także zobowiązanie czasowe. Zaletą tego podejścia jest to, że potrzeba tylko kilku minut, aby go uruchomić, i że zrobi dokładnie to, czego oczekujesz lub chcesz (ze zmianami).
john01dav
2
Utrata readline, edycja linii, obsługa historii, możliwość uruchamiania prostych poleceń, takich jak ls, itp. Będzie cię kosztować o wiele więcej niż cztery naciśnięcia klawiszy, a więc oszczędzisz dzięki temu.
Lie Ryan,
13

W przypadku podstawowych rzeczy możesz:

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>

Wyjdź za pomocą Ctrl + C

Umur Kontacı
źródło
2
Przyzwoity pomysł, jednak są dwa problemy. Jedna z ;nich prowadzi do bash: syntax error near unexpected token ; `` Po drugie, evalczęść jest podatna na podatności. Zastanówmy się na przykład, co się stanie, jeśli napiszę status;cat /etc/passwdw tej małej powłoce. Nieszkodliwy przykład, ale masz pojęcie, co może się zdarzyć. Możesz uprościć to w while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";doneTo oczywiście nie jest kuloodporne, ale 1 - jest prostszy i 2 - unika wykonywania poleceń innych niż git (na podstawie podwójnych cudzysłowów). Nie idealnie, tylko trochę lepiej
Sergiy Kolodyazhnyy
@Abigail Funny :) Dlaczego tak, sama powłoka nie jest najbezpieczniejszą aplikacją. Problemem może być nawet przechwycenie pliku . Jednak pierwotnie chciałem powiedzieć, że nie widzimy interpretera mysql wykonującego polecenia powłoki, przynajmniej bez systemlub \!na początku. Tam, gdzie można założyć, że to „repl” wykonuje gittylko polecenia, w rzeczywistości pozwala na więcej.
Sergiy Kolodyazhnyy
@Abigail Nie boję się, bo wiem, co to robi. Inni, którzy tego nie robią - mogą w końcu złamać coś, czego nie powinni. I znowu - eval nie jest najlepszym pomysłem na uruchamianie poleceń, szczególnie gdy w grę wchodzą dane kontrolowane przez użytkownika.
Sergiy Kolodyazhnyy
Naprawiono literówkę po do. Dzięki! re: security: To oczywiście nie jest przeznaczone do dystrybucji jako osobna aplikacja. Po prostu włóż, .bash_profilejeśli nie lubisz pisać git. Nie martwię się zbytnio o to, że jest „niepewny”. Jeśli wkleisz do swojego basha rzeczy, których nie rozumiesz (w tym ten skrypt oneliner), będziesz miał zły czas. Podoba mi się to, ponieważ jest proste, łatwe do napisania i łatwe do odczytania oraz łatwe do ulepszenia.
Umur Kontacı
2

Kiedy korzystałem z systemu Windows 7 z Conemu, dodałem następujące elementy do skryptu uruchamiania środowiska programistycznego:

doskey g=git $*

Dzięki temu mogłem po prostu użyć gpolecenia zamiast pisać git. Ostatnio próbowałem z Windows 10 i Conemu, to nie działało, myślę, że jest błąd, ale warto spróbować.

Adamsan
źródło
2

Użyj edytora nawiasów, możesz łatwo używać kodu i poleceń git, ma także wiele funkcji.

wprowadź opis zdjęcia tutaj

W prawym górnym rogu druga ikona lornetki służy do instalowania rozszerzeń.

wprowadź opis zdjęcia tutaj

Wyszukaj rozszerzenie brackets gitjak na powyższym obrazku i zainstaluj je.

wprowadź opis zdjęcia tutaj

Ponownie w prawym górnym rogu pojawi się czwarta ikona, więc po prostu kliknij i zobacz zmiany jak na powyższym obrazku.

Jeśli chcesz zainstalować wsporniki, użyj następujących poleceń:

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

Aby uzyskać więcej informacji, przeczytaj: Jak zainstalować nawias edytora kodów w Ubuntu i Linux Mint na Ubuntupit .

akash
źródło