Come evitare di digitare "git" all'inizio di ogni comando Git?


190

Mi chiedo se c'è un modo per evitare di dover digitare la parola gitall'inizio di ogni comando Git.

Sarebbe bello se ci fosse un modo per usare il gitcomando solo una volta all'inizio dopo aver aperto un prompt dei comandi per entrare in "Modalità Git" .

Per esempio:

git>

Dopo di che ogni comando che digitiamo viene interpretato di default come un comando Git.

In un modo simile a come utilizziamo la shell MySQL per scrivere i comandi del database:

mysql>

Questo mi eviterà di dover scrivere gitcentinaia di volte al giorno.

NOTA: sto usando git-bash, su Windows.


87
A coloro che hanno votato per la chiusura sulla base del fatto che sono fuori tema, si prega di leggere il testo su cui si fa clic: "Le domande sull'hardware e sul software di elaborazione generale sono fuori tema per Stack Overflow a meno che non riguardino direttamente gli strumenti utilizzati principalmente per la programmazione . ". Git è uno strumento utilizzato dai programmatori. Come evidenziato dal fatto che ha il proprio tag su questo sito.
JBentley,

5
Perché stai scrivendo "git" così tanto? Il tuo IDE dovrebbe avere potenti integrazioni vcs disponibili a un tasto premuto. Preferisci digitare "git pull" 50 volte al giorno, o ctrl-t ... smetti di essere un guerriero da riga di comando quando non devi esserlo;)
vikingsteve l'

8
@vikingsteve Praticamente tutto l' aiuto e la saggezza di git sono dati in termini di riga di comando.
Ed Randall,

6
@vikingsteve Lo sto scrivendo così tanto perché è più veloce. Scrivo ~ 100wpm, di più se ho familiarità con i tasti premuti come se fossi con Git; rispetto al clic sulle GUI, è solo più semplice. Il tuo IDE preferito potrebbe avere scorciatoie da tastiera. È carino per te. Perché dovrei perdere tempo ad impararli quando <M-Tab> git blah <CR> è già nella mia memoria muscolare?
Finanzi la causa di Monica l'

3
Dovrebbe esserci un "questa domanda dovrebbe essere chiusa perché l'utente sta ponendo una domanda che non ha senso" - come se avessi quello che stai chiedendo, ma come farà la shell a sapere che vuoi inserire un "non iniziare con comando git "se ci fosse davvero un modo per farlo.
user3728501

Risposte:


190

Potresti provare Gitsh . Dal loro readme:

Il gitshprogramma è una shell interattiva per git. Dall'interno gitshpuoi emettere qualsiasi comando git, anche usando i tuoi alias e configurazione locali.

  • I comandi Git tendono ad arrivare in gruppi. Evita di digitare gitpiù e più volte eseguendoli in una shell git dedicata:
sh$ gitsh
gitsh% status
gitsh% add .
gitsh% commit -m "Ship it!"
gitsh% push
gitsh% ctrl-d
sh$

O dai un'occhiata agli altri progetti collegati lì:

  • git-sh - Una shell bash personalizzata con un prompt Git, alias e completamento.
  • gitsh - Una semplice shell Git scritta in Perl.
  • repl - Avvolge qualsiasi programma con sottocomandi in un REPL.

Nota: non l'ho usato da solo.


22
brontolare ... repl(1)non è un REPL. Non valuta né stampa nulla. Esegue programmi.
Kevin,

11
@Kevin Legge nelle richieste dell'utente, valuta la richiesta dell'utente (eseguendo un programma) e stampa l'output del programma. Questo è anche ciò che fanno le conchiglie.
Yakk - Adam Nevraumont,

2
@ Yakk-AdamNevraumont: No, sicuramente non "stampa l'output del programma". Si aggancia stdout del programma fino al terminale, e quindi il programma stampa la propria uscita - tranne stdout del programma è già collegato al terminale (ereditato automaticamente il fork()/ exec()), quindi repl(1)non è nemmeno fare quello .
Kevin,

6
@Kevin Capisco il tuo sentimento, tuttavia la definizione rigorosa di un REPL escluderebbe la maggior parte degli interpreti "REPL" in varie lingue. Solo in linguaggi funzionali puri è possibile garantire che la valutazione non abbia effetti collaterali, ma anche in Haskell il GHCi "REPL" accetterà di default anche IOazioni ed eseguirle includendo effetti collaterali come la stampa sullo schermo collegato al terminale.
lasciato circa l'

2
@Kevin replnon è un REPL autonomo; è un mezzo per creare un sistema REPL in cui replè solo il componente interattivo. È giusto?
Kyle Strand,

116

Un one-liner Perl che farà questo:

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

Questo eseguirà qualunque cosa tu digiti, con il prefisso git . E continuerà a farlo fino a quando non colpisci ^D.


6
Questo è davvero molto simile a ciò che OP richiede, e in un pacchetto molto leggero!
Ruohola,

2
Sarebbe perfetto se funzionasse con readline ma sfortunatamente non funziona (non sorprende dal momento che si tratta di un vero e proprio trucco attorno alle -nebandiere di Perl ).
Konrad Rudolph,

11
@KonradRudolphperl -MTerm::ReadLine -E '$n = Term::ReadLine -> new ("git"); while ($_ = $n -> readline ("git > ")) {system "git $_"}'

57

Questo non è esattamente quello che stai chiedendo, ma potresti impostare alcuni alias di shell nei tuoi ~/.bashrccomandi Git che usi più frequentemente:

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

Si noti inoltre che è possibile creare alias all'interno di Git stesso:

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

Ciò consente di digitare git cianziché git commite così via.


7
Lo svantaggio di questo approccio è che sarebbe necessario creare un alias separato per ogni comando Git.
Tim Biegeleisen l'

22
Solo per i più utilizzati. Voglio dire, quanto spesso usi git hash-objecto git interpret-trailers? Lo sto solo offrendo come alternativa perché, per quanto ne so, ciò che la domanda sta facendo non esiste davvero.
Thomas,

15
Oltre a ciper commituso anche un alias di shell gper git, questo riduce la maggior parte della digitazione e mi permette di rimanere nella mia shell preferita.
rkta,

32

Sono un grande fan dell'uso degli alias in ~ / .bash_profile per il mio GitBash. Se segui questo approccio, ecco alcuni dei miei preferiti:

# 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'

3
dov'è commesso: P
qwr

14
Non includo commito pushpoiché desidero qualche secondo in più (durante la digitazione) per essere sicuro di non distruggere qualcosa
JacobIRR,

3
Impegnarsi e spingere non dovrebbe essere in grado di distruggere nulla a meno che non si usi la spinta forzata. Ma provo a usare lo stato git in anticipo.
qwr

1
questo è anche quello che ho fatto, +1. Anche se sono tentato di provare Gitsh come hanno già detto altre risposte
CoffeeTableEspresso,

1
@CoffeeTableEspresso Rispetto il fatto che tu riconosca che alcuni tasti sono la differenza tra il salvataggio degli aggiornamenti e la distruzione di un progetto.
LogicalBranch l'

31

Usa il tuo editor.

Digita il comando come commitdal tuo editor preferito come vs code e sii più efficiente con git:

inserisci qui la descrizione dell'immagine

Oppure digita gitper ottenere tutti i comandi:

inserisci qui la descrizione dell'immagine


13
Sono sorpreso da tutti questi voti negativi. Questa non è una risposta terribile per le persone che utilizzano IDE che supportano queste funzionalità.
Glen Pierce,

4
Penso che le persone abbiano votato verso il basso perché non tutti usano / gradiscono VS-Code. Ad ogni modo, penso che sia una soluzione decente, quindi +1 da parte mia.
LogicalBranch,

4
@LogicalBranch, le persone generalmente usano git dalla riga di comando, e ne sono consapevole, ma esiste il supporto git all'interno di alcuni editor e vale la pena provare.
prosti,

1
Non mi piace questa risposta perché non tutti usano il codice VS (personalmente non mi piace), ma non voterò perché questa è una buona soluzione per ppl che la usano.
CoffeeTableEspresso

1
@CoffeeTableEspresso, se stai usando sublime c'è un plugin chiamato gitsavvy , e così via ... Quasi tutti gli editor al giorno d'oggi hanno un qualche tipo di supporto per git. Questo era il punto della risposta, come puoi leggere "Usa il tuo editor".
prosti,

26

Un mio amico ha realizzato un piccolo script bash che lo compie. Si chiama 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

6
OK, l'ho già menzionato sulla risposta di Umur, ma l'uso di evalnella fonte di script originale non è la migliore idea. Di 'al tuo amico di usare while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";doneinvece
Sergiy Kolodyazhnyy,

23

Ecco un altro modo. Inoltre non è proprio quello che mi è stato chiesto, ma lo sto usando da un po 'di tempo ed è abbastanza carino. Aggiungi la seguente riga al tuo ~/.bashrc:

complete -E -W git

Ora premendo Tab al prompt di Bash vuoto si digiterà "git".


5
Nota che se stai usando un'altra shell, dovrai inserirla nel file appropriato. Ad esempio, per zsh, lo ~/zshrc~/tcshrc
inserirai

20

So che questa è una risposta molto tardiva, ma questa domanda mi ha davvero colpito perché ho avuto a che fare con questo tipo di ripetizione da un po 'di tempo.

Non sono sicuro di te ma sinceramente non voglio (ripeto NON VOGLIO ) creare alias per ogni gitcomando, quindi ho scritto uno script Python chiamato NoGit per risolvere questo problema:

#!/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 è un semplice script Python per evitare la ripetizione non necessaria della parola chiave "git".

Documentazione:

  • il %undocomando rimuove l'ultimo comando dallo stack
  • il %runcomando esegue i comandi nello stack e cancella lo stack
  • il %exit comando chiude la CLI senza fare nulla
  • premere ctr+cequivale a correre%run; %exit
  • lo script salva i comandi che sono stati eseguiti su un file chiamato git.history nella stessa cartella dello script
  • puoi aggiungere più comandi in una riga usando un punto e virgola
  • puoi usare la parola chiave gitall'inizio del comando e lo script non la duplicherà ( eg: git init non diventa git git init)

Comandi di esempio:

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

Informazioni aggiuntive (per utenti Linux):

Se lo desideri, puoi rimuovere l' .pyestensione e convertirla in un eseguibile utilizzando:

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

Quindi invece di chiamare lo script in questo modo:

python3 git.py

Avresti eseguito questo invece:

./git

Informazioni aggiuntive (per i più pigri):

Se sei pigro e non vuoi scrivere a, ./puoi spostare questo script nella tua /bin/cartella e creare un alias per questo.

Se sei davvero molto pigro, usa i seguenti comandi:

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

Se sei davvero, davvero, molto pigro, copia e incolla il seguente one-liner:

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

Se la tua pigrizia ha raggiunto livelli precedentemente sconosciuti all'umanità, ecco una versione più compatta dello stesso one-liner:

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

In bocca al lupo.


17

Un altro approccio che funzionerà con qualsiasi comando: usa Ctrl + R (reverse-i-search).

La ricerca inversa i consente di cercare nella cronologia dei comandi. Ripeti Ctrl + R dopo aver premuto la stringa di ricerca per ripetere la ricerca più indietro con la stessa stringa.

Devi solo digitare un comando una volta, quindi puoi richiamare quel comando da qualsiasi sottostringa del comando. Nella maggior parte dei casi, puoi richiamare interi comandi molto lunghi e le loro varie varianti con solo due o tre lettere di ricerca ben posizionate. Non sono necessarie preconfigurazioni oltre all'utilizzo della shell normalmente ed è autoadattativo rispetto al modo in cui è stata utilizzata la shell, è sufficiente digitare il comando completo una volta e i comandi verranno automaticamente aggiunti alla cronologia dei comandi.

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

Inoltre, Ctrl-R funziona non solo su bash, ma molti programmi che usano la libreria readline (e ce ne sono molti), come Python shell, IPython, mysql shell, psql shell, irb (ruby), ecc.


15

Nel tuo esempio, lo confronti con un prompt di MySql. Il modo in cui funziona è che inizia un processo MySql e tu dai i tuoi comandi a quel processo. Come tale, perché non scrivere qualcosa di simile nella tua lingua preferita? Ecco un semplice esempio 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;
}

Nota che l'ho appena scritto dalla memoria e che non l'ho verificato con un compilatore. Potrebbero esserci banali errori di sintassi.


Solo il mio pensiero. Chiunque su Stack Overflow dovrebbe essere in grado di codificare un programma del genere da solo. Il linguaggio di programmazione non ha molta importanza.
Thomas Weller,

@ThomasWeller Sono assolutamente d'accordo. Ho pubblicato il programma per mostrare esattamente di cosa stavo parlando, non perché è un programma difficile da scrivere.
john01dav,

9
Investirai molto tempo con questo approccio se vuoi che il programma sia privo di bug e abbia una discreta quantità di funzionalità. Ad esempio, dopo aver corretto l'errore di compilazione iniziale (std :: system () vuole const char *) noterai che esiste un loop infinito su EOF. Potresti volere supporto cronologia / readline, completamento della scheda, alcuni builtin per cambiare directory / impostare env vars / shell out / ..., ecc. Se esiste un software esistente (come gitsh in questo caso), perché non usarlo?
nomadictype

1
@nomadictype Questa è una critica valida, ma imparare altri software è anche un impegno nel tempo. I vantaggi di questo approccio sono che sono necessari solo pochi minuti per farlo funzionare, e poi farà esattamente ciò che ti aspetti o desideri (con le modifiche).
john01dav,

2
La perdita di readline, la modifica delle linee, il supporto della cronologia, la possibilità di eseguire comandi semplici come ls, ecc. Ti costerà molto di più delle quattro sequenze di tasti che hai salvato con questo.
Sdraiati Ryan l'

13

Per le cose di base, puoi fare:

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>

Esci con ctrl + c


2
Idea decente, tuttavia ci sono due problemi. Uno, il ;dopo fare porta a bash: syntax error near unexpected token ; '' Secondo, la evalparte è soggetta a vulnerabilità. Ad esempio, considera cosa succede se scrivo status;cat /etc/passwdin questa piccola shell. Esempio innocuo, ma hai l'idea di cosa può accadere. Puoi semplificare questo in while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";doneQuesto ovviamente non è a prova di proiettile, ma 1 - è più semplice e 2 - evita l'esecuzione di comandi non git (in virtù di virgolette doppie). Non ideale, solo un po 'meglio
Sergiy Kolodyazhnyy,

@Abigail Funny :) Perché sì, la shell stessa non è l'applicazione più sicura. Anche catturare un file può essere un problema. Tuttavia, il punto che stavo inizialmente sollevando è che non vediamo l'interprete mysql che esegue i comandi di shell, non almeno systemo \!all'inizio. Laddove il presupposto potrebbe essere che questo "rimpiazzare" esegue gitsolo i comandi, in realtà consente di più.
Sergiy Kolodyazhnyy,

@Abigail Non ho paura, perché so cosa fa. Altri che non lo fanno - potrebbero finire per rompere qualcosa che non dovrebbero. E ancora: eval non è la migliore idea per eseguire comandi, specialmente quando è coinvolto un input controllato dall'utente.
Sergiy Kolodyazhnyy,

Risolto l'errore di battitura dopo do. Grazie! re: security: Questo ovviamente non è pensato per essere distribuito come un'applicazione separata. Inserisci il tuo .bash_profilese non ti piace digitare git. Non sono troppo preoccupato che sia "insicuro". Se incolli qualcosa nella tua bash che non capisci (incluso questo script oneliner), avrai un brutto momento. Mi piace perché è semplice, facile da scrivere e da leggere e da migliorare.
Umur Kontacı,

2

Quando ho usato Windows 7 con Conemu, ho aggiunto quanto segue al mio script di avvio dell'ambiente di sviluppo:

doskey g=git $*

Con questo, potrei semplicemente usare il gcomando invece di digitare git. L'ultima volta che ho provato con Windows 10 e Conemu, non ha funzionato, penso che ci sia un bug, ma vale la pena provare.


2

Usa un editor di parentesi, è facile usare il tuo codice e comandi git, ha anche molte funzionalità.

inserisci qui la descrizione dell'immagine

Nell'angolo in alto a destra viene utilizzata la seconda icona binoculare per installare le estensioni.

inserisci qui la descrizione dell'immagine

Cerca estensione brackets git come l'immagine sopra e installala.

inserisci qui la descrizione dell'immagine

Di nuovo nell'angolo in alto a destra verrà mostrata la quarta icona, quindi basta fare clic e vedere le modifiche come nell'immagine sopra.

Se si desidera installare parentesi, utilizzare i comandi seguenti:

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

Per ulteriori informazioni, puoi leggere: Come installare l'Editor di codice parentesi in Ubuntu e Linux Mint su Ubuntupit .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.