Comment éviter de taper «git» au début de chaque commande Git?

190

Je me demande s'il existe un moyen d'éviter d'avoir à taper le mot gitau début de chaque commande Git.

Ce serait bien s'il y avait un moyen d'utiliser la gitcommande une seule fois au début après avoir ouvert une invite de commande pour passer en "mode Git" .

Par exemple:

git>

Après quoi, chaque commande que nous tapons est interprétée par défaut comme une commande Git.

D'une manière similaire à la façon dont nous utilisons le shell MySQL pour écrire des commandes de base de données:

mysql>

Cela m'évitera d'avoir à taper des gitcentaines de fois par jour.

REMARQUE: j'utilise git-bash, sous Windows.

Nocturne
la source
87
À ceux qui ont voté pour la fermeture parce que ce n'est pas le sujet, veuillez lire le texte sur lequel vous cliquez: "Les questions sur le matériel informatique général et les logiciels sont hors sujet pour Stack Overflow, sauf si elles impliquent directement des outils utilisés principalement pour la programmation . ". Git est un outil utilisé par les programmeurs. Comme en témoigne le fait qu'il possède sa propre balise sur ce site.
JBentley
5
Pourquoi tapez-vous autant "git"? Votre IDE devrait avoir de puissantes intégrations vcs disponibles en appuyant sur une touche. Est-ce que vous préférez taper "git pull" 50 fois par jour, ou ctrl-t ... arrêtez d' être un guerrier en ligne de commande quand vous n'avez pas besoin de l'être;)
vikingsteve
8
@vikingsteve Pratiquement toute l' aide et la sagesse git sont données en ligne de commande.
Ed Randall du
6
@vikingsteve Je le tape tellement parce que c'est plus rapide. Je tape ~ 100wpm, plus si je suis intimement familier avec les touches comme je le suis avec Git; par rapport à cliquer sur les interfaces graphiques, c'est juste plus facile. Votre IDE préféré peut avoir des raccourcis clavier. C'est bien pour toi. Pourquoi devrais - je perdre du temps à les apprendre quand <M-Tab> git bla <CR> est déjà dans ma mémoire musculaire?
Fund Monica's Lawsuit
3
Il devrait y avoir un "cette question devrait être fermée parce que l'utilisateur pose une question qui n'a pas de sens" - comme j'obtiens ce que vous demandez mais comment le shell va-t-il savoir que vous voulez entrer un "non commençant par git command "s'il y avait effectivement un moyen de le faire.
user3728501

Réponses:

190

Vous voudrez peut-être essayer gitsh . De leur readme:

Le gitshprogramme est un shell interactif pour git. De l'intérieur, gitshvous pouvez lancer n'importe quelle commande git, même en utilisant vos alias locaux et votre configuration.

  • Les commandes Git ont tendance à venir en groupes. Évitez de taper gitencore et encore en les exécutant dans un shell git dédié:
sh$ gitsh
gitsh% status
gitsh% add .
gitsh% commit -m "Ship it!"
gitsh% push
gitsh% ctrl-d
sh$

Ou jetez un œil aux autres projets qui y sont liés:

  • git-sh - Un shell bash personnalisé avec une invite Git, des alias et une complétion.
  • gitsh - Un simple shell Git écrit en Perl.
  • repl - Enveloppe tout programme avec des sous-commandes dans un REPL.

Remarque: je ne l'ai pas utilisé moi-même.

Alfunx
la source
22
grommeler ... repl(1)n'est pas une REPL. Il n'évalue ni n'imprime rien. Il exécute des programmes.
Kevin
11
@Kevin Il lit les requêtes utilisateur, évalue la requête utilisateur (en exécutant un programme) et imprime la sortie du programme. C'est aussi ce que font les obus.
Yakk - Adam Nevraumont
2
@ Yakk-AdamNevraumont: Non, il "n'imprime certainement pas la sortie du programme". Il accroche le stdout de programme jusqu'au terminal, puis le programme imprime sa propre sortie - à l' exception de la sortie standard du programme est déjà relié à la borne (héritée automatiquement le fork()/ exec()), donc repl(1)n'est pas fait même que .
Kevin
6
@Kevin Je comprends votre sentiment, mais la définition stricte d'un REPL exclurait la plupart des «REPL» interprètes dans différentes langues. Ce n'est que dans des langages fonctionnels purs que vous pouvez vous assurer que l'évaluation n'a pas d'effets secondaires, mais même dans Haskell, le «REPL» GHCi acceptera également par défaut des IOactions et les exécutera, y compris des effets secondaires tels que l'impression sur l'écran connecté au terminal.
gauche autour du
2
@Kevin repln'est pas une REPL autonome; c'est un moyen de créer un système REPL dans lequel repln'est que le composant interactif. Est-ce juste?
Kyle Strand
116

Un one-liner Perl qui fera ceci:

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

Cela exécutera tout ce que vous tapez, préfixé par git. Et il continuera à le faire jusqu'à ce que vous frappiez ^D.


la source
6
C'est vraiment très similaire à ce que demande OP, et dans un emballage très léger!
ruohola
2
Ce serait parfait si cela fonctionnait avec readline, mais malheureusement ce n'est pas le cas (ce qui n'est pas surprenant puisqu'il s'agit strictement d'un hack autour des -nedrapeaux de Perl ).
Konrad Rudolph
11
@KonradRudolphperl -MTerm::ReadLine -E '$n = Term::ReadLine -> new ("git"); while ($_ = $n -> readline ("git > ")) {system "git $_"}'
57

Ce n'est pas exactement ce que vous demandez, mais vous pouvez configurer des alias de shell dans votre ~/.bashrcpour les commandes Git que vous utilisez le plus fréquemment:

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

Notez également que vous pouvez créer des alias dans Git lui-même:

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

Cela vous permet de taper git ciau lieu de git commit, et ainsi de suite.

Thomas
la source
7
L'inconvénient de cette approche est qu'un alias séparé devrait être créé pour chaque commande Git.
Tim Biegeleisen
22
Uniquement pour les plus fréquemment utilisés. Je veux dire, à quelle fréquence utilisez-vous git hash-objectou git interpret-trailers? Je propose simplement cela comme une alternative parce que pour autant que je sache, ce que la question demande n'existe pas vraiment.
Thomas
15
En plus de cifor, commitj'utilise également un alias de shell gpour git, cela réduit la plupart du temps de frappe et me permet de rester dans mon shell préféré.
rkta
32

Je suis un grand fan de l'utilisation d'alias dans ~ / .bash_profile pour mon GitBash. Si vous optez pour cette approche, voici quelques-uns de mes favoris:

# 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
la source
3
où est le commit: P
qwr
14
Je n'inclut pas commitou pushpuisque je veux quelques secondes supplémentaires (en tapant) pour être sûr de ne pas détruire quelque chose
JacobIRR
3
L'engagement et la poussée ne devraient pas pouvoir détruire quoi que ce soit à moins que vous n'utilisiez une poussée forcée. Mais j'essaye d'utiliser le statut git au préalable.
qwr
1
c'est ce que j'ai fait aussi, +1. Bien que je sois tenté d'essayer gitsh comme d'autres réponses l'ont mentionné
CoffeeTableEspresso
1
@CoffeeTableEspresso Je respecte le fait que vous reconnaissez que quelques touches font la différence entre l'enregistrement des mises à jour et la destruction d'un projet.
LogicalBranch
31

Utilisez votre éditeur.

Tapez la commande comme commitdans votre éditeur préféré comme vs code et soyez plus efficace avec git:

entrez la description de l'image ici

Ou tapez gitpour obtenir toutes les commandes:

entrez la description de l'image ici

prosti
la source
13
Je suis surpris par tous ces votes négatifs. Ce n'est pas une réponse terrible pour les personnes qui utilisent des IDE qui prennent en charge ces fonctionnalités.
Glen Pierce
4
Je pense que les gens ont voté à la baisse parce que tout le monde n'utilise / n'aime pas VS-Code. Quoi qu'il en soit, je pense que c'est une solution décente, donc +1 de ma part.
LogicalBranch
4
@LogicalBranch, les gens utilisent généralement git à partir de la ligne de commande, et j'en suis conscient, mais le support git dans certains éditeurs existe et cela vaut la peine d'essayer.
prosti
1
Je n'aime pas cette réponse parce que tout le monde n'utilise pas le code VS (personnellement je ne l'aime pas), mais je ne voterai pas parce que c'est une bonne solution pour les personnes qui l'utilisent.
CoffeeTableEspresso
1
@CoffeeTableEspresso, si vous utilisez sublime, il existe un plugin appelé gitsavvy , et ainsi de suite ... Presque tous les éditeurs de nos jours ont une sorte de support pour git. C'était le point de la réponse, comme vous pouvez lire "Utilisez votre éditeur".
prosti
26

Un de mes amis a fait un petit script bash qui accomplit cela. Cela s'appelle 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
la source
6
OK, je l'ai déjà mentionné dans la réponse d'Umur, mais l'utilisation de evaldans la source du script d'origine n'est pas la meilleure idée. Dites à votre ami d'utiliser à la while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";doneplace
Sergiy Kolodyazhnyy
23

Voici une autre manière. Ce n'est pas non plus tout à fait ce qui a été demandé, mais je l'utilise depuis un certain temps et c'est plutôt sympa. Ajoutez la ligne suivante à votre ~/.bashrc:

complete -E -W git

Maintenant, en appuyant sur Tab à une invite Bash vide, vous tapez "git".

nomade
la source
5
Notez que si vous utilisez un autre shell, vous devrez le mettre dans le fichier approprié. Par exemple, pour zsh, vous le mettrez ~/zshrc, pour tcsh, vous le mettrez ~/tcshrc, etc.
TheOnlyMrCat
20

Je sais que c'est une réponse très tard , mais cette question vraiment frappé une note avec moi parce que j'ai affaire à la souffrance de ce genre de répétition pour un certain temps maintenant.

Je ne suis pas sûr de vous mais honnêtement, je ne veux pas (je répète NE PAS ) créer des alias pour chaque gitcommande, alors j'ai plutôt écrit un script python appelé NoGit pour résoudre ce problème:

#!/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 est un simple script python pour éviter la répétition inutile du mot-clé "git".

Documentation:

  • la %undocommande supprime la dernière commande de la pile
  • la %runcommande exécute les commandes dans la pile et efface la pile
  • la %exitcommande ferme la CLI sans rien faire
  • presser ctr+céquivaut à courir%run; %exit
  • le script enregistre les commandes qui ont été exécutées dans un fichier appelé git.historydans le même dossier que le script
  • vous pouvez ajouter plusieurs commandes sur une seule ligne en utilisant un point-virgule
  • vous pouvez utiliser le mot-clé gitau début de la commande et le script ne le dupliquera pas ( EG: git init ne devient pas git git init)

Exemples de commandes:

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

Informations supplémentaires (pour les utilisateurs Linux):

Si vous le souhaitez, vous pouvez supprimer l' .pyextension et la convertir en exécutable en utilisant:

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

Alors au lieu d'appeler le script comme ceci:

python3 git.py

Vous exécuteriez ceci à la place:

./git

Informations supplémentaires (pour les paresseux):

Si vous êtes paresseux et que vous ne voulez pas taper un, ./vous pouvez déplacer ce script dans votre /bin/dossier et créer un alias pour celui-ci.

Si vous êtes vraiment, vraiment paresseux, utilisez les commandes suivantes:

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

Si vous êtes vraiment, vraiment, vraiment paresseux, copiez et collez le one-liner suivant:

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

Si votre paresse a atteint des niveaux auparavant inconnus de l'humanité, voici une version plus compacte du même one-liner:

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

Bonne chance.

LogicalBranch
la source
17

Une autre approche qui fonctionnera avec toutes les commandes: utilisez Ctrl + R (reverse-i-search).

La recherche inversée vous permet de rechercher dans l'historique de vos commandes. Répétez Ctrl + R après avoir appuyé sur votre chaîne de recherche pour répéter la recherche plus en arrière avec la même chaîne.

Vous n'avez besoin de taper une commande qu'une seule fois, puis vous pouvez rappeler cette commande à partir de n'importe quelle sous-chaîne de la commande. Dans la plupart des cas, vous pouvez rappeler des commandes très longues entières et leurs différentes variantes avec seulement deux à trois lettres de recherche bien placées. Aucune préconfiguration nécessaire autre que l'utilisation normale de votre shell et il s'adapte automatiquement à la façon dont vous avez utilisé le shell, tapez simplement la commande complète une fois et les commandes seraient automatiquement ajoutées à votre historique de commandes.

  • 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

De plus, Ctrl-R ne fonctionne pas seulement sur bash, mais sur de nombreux programmes utilisant la bibliothèque readline (et il y en a beaucoup), comme le shell Python, IPython, mysql shell, psql shell, irb (ruby), etc.

Mensonge Ryan
la source
15

Dans votre exemple, vous le comparez à une invite MySql. La façon dont cela fonctionne est qu'un processus MySql démarre, et vous donnez vos commandes à ce processus. En tant que tel, pourquoi ne pas écrire quelque chose de similaire dans la langue de votre choix? Voici un exemple simple en 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;
}

Veuillez noter que je viens de l'écrire de mémoire et que je ne l'ai pas vérifié avec un compilateur. Il peut y avoir des erreurs de syntaxe triviales.

john01dav
la source
Juste ma pensée. N'importe qui sur Stack Overflow devrait être capable de coder un tel programme lui-même. Le langage de programmation n'a pas vraiment d'importance.
Thomas Weller
@ThomasWeller Je suis tout à fait d'accord. J'ai posté le programme pour montrer précisément de quoi je parlais, pas parce que c'est un programme difficile à écrire.
john01dav
9
Vous allez investir beaucoup de temps dans cette approche si vous voulez que le programme soit exempt de bogues et ait une quantité décente de fonctionnalités. Par exemple, après avoir corrigé l'échec de la construction initiale (std :: system () veut const char *), vous remarquerez qu'il y a une boucle infinie sur EOF. Vous voudrez peut-être le support de l'historique / readline, la complétion des onglets, des fonctions intégrées pour changer de répertoire / définir env vars / shell out / ..., etc. S'il existe un logiciel existant (comme gitsh dans ce cas), pourquoi ne pas l'utiliser?
nomadictype
1
@nomadictype C'est une critique valable, mais apprendre d'autres logiciels est aussi un engagement en temps. Les avantages de cette approche sont qu'il ne faut que quelques minutes pour le faire fonctionner, et qu'il fera exactement ce que vous attendez ou voulez (avec des changements).
john01dav
2
La perte de readline, d'édition de ligne, de prise en charge de l'historique, de pouvoir exécuter des commandes simples comme ls, etc. va vous coûter beaucoup plus cher que les quatre frappes que vous avez enregistrées avec cela.
Lie Ryan
13

Pour les choses de base, vous pouvez faire:

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>

Quitter avec ctrl + c

Umur Kontacı
la source
2
Idée décente, mais il y a deux problèmes. Premièrement, l' ;après-faire mène à bash: syntax error near unexpected token : `` Deuxièmement, la evalpièce est sujette à des vulnérabilités. Par exemple, considérez ce qui se passe si je tape status;cat /etc/passwddans ce petit shell. Exemple inoffensif, mais vous avez l'idée de ce qui peut arriver. Vous pouvez simplifier cela en while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";doneCeci bien sûr n'est pas à l'épreuve des balles, mais 1 - c'est plus simple et 2 - évite l'exécution de commandes non git (en vertu de doubles guillemets). Pas idéal, juste un peu mieux
Sergiy Kolodyazhnyy
@Abigail Funny :) Pourquoi oui, shell lui-même n'est pas l'application la plus sécurisée. Même la création d'un fichier peut être un problème. Cependant, le point que je faisais à l'origine est que nous ne voyons pas l'interpréteur mysql exécuter des commandes shell, pas sans systemou \!au début du moins. Là où l'hypothèse pourrait être que ce "repl" n'exécute que des gitcommandes, il permet en fait plus que cela.
Sergiy Kolodyazhnyy
@Abigail Je n'ai pas peur, car je sais ce que cela fait. D'autres qui ne le font pas - peuvent finir par casser quelque chose qu'ils ne devraient pas. Et encore une fois, ce eval n'est pas la meilleure idée pour exécuter des commandes, en particulier lorsque des entrées contrôlées par l'utilisateur sont impliquées.
Sergiy Kolodyazhnyy
Correction de la faute de frappe après do. Merci! re: security: Ceci n'est évidemment pas destiné à être distribué en tant qu'application distincte. Mettez simplement votre .bash_profilesi vous n'aimez pas taper git. Je ne suis pas trop préoccupé par le fait que ce soit «insécure». Si vous collez des éléments dans votre bash que vous ne comprenez pas (y compris ce script oneliner), vous allez passer un mauvais moment. J'aime cela parce que c'est simple, facile à écrire et à lire, et facile à améliorer.
Umur Kontacı
2

Lorsque j'ai utilisé Windows 7 avec Conemu, j'ai ajouté ce qui suit à mon script de démarrage d'environnement de développement:

doskey g=git $*

Avec cela, je pourrais simplement utiliser la gcommande au lieu de taper git. La dernière fois que j'ai essayé avec Windows 10 et Conemu, cela n'a pas fonctionné, il y a un bug, je pense, mais ça vaut le coup d'essayer.

Adamsan
la source
2

Utilisez un éditeur de crochets, il est facile d'utiliser votre code et vos commandes git, il possède également de nombreuses fonctionnalités.

entrez la description de l'image ici

Dans le coin supérieur droit, la deuxième icône binoculaire est utilisée pour installer les extensions.

entrez la description de l'image ici

Recherchez l'extension brackets gitcomme l'image ci-dessus et installez-la.

entrez la description de l'image ici

Encore une fois dans le coin supérieur droit, la quatrième icône apparaîtra, alors cliquez simplement et voyez les changements comme l'image ci-dessus.

Si vous souhaitez installer des crochets, utilisez les commandes suivantes:

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

Pour plus d'informations, vous pouvez lire: Comment installer l'éditeur de code Brackets dans Ubuntu et Linux Mint sur Ubuntupit .

Akash
la source