¿Cómo evito escribir "git" al comienzo de cada comando Git?

190

Me pregunto si hay una manera de evitar tener que escribir la palabra git al comienzo de cada comando Git.

Sería bueno si hubiera una manera de usar el gitcomando solo una vez al principio después de abrir un símbolo del sistema para ingresar al "modo Git" .

Por ejemplo:

git>

Después de lo cual, cada comando que escribimos se interpreta por defecto como un comando Git.

De manera similar a cómo usamos el shell MySQL para escribir comandos de la base de datos:

mysql>

Esto me ahorrará tener que escribir gitcientos de veces al día.

NOTA: Estoy usando git-bash, en Windows.

Nocturno
fuente
87
Para aquellos que votaron para cerrar debido a que está fuera de tema, lea el texto en el que está haciendo clic: "Las preguntas sobre hardware y software informáticos generales están fuera de tema para Stack Overflow a menos que impliquen directamente herramientas utilizadas principalmente para la programación . ". Git es una herramienta utilizada por los programadores. Como lo demuestra el hecho de que tiene su propia etiqueta en este sitio.
JBentley
55
¿Por qué escribes tanto "git"? Su IDE debe tener poderosas integraciones vcs disponibles al presionar una tecla. ¿Prefieres escribir "git pull" 50 veces al día, o ctrl-t ... deja de ser un guerrero de línea de comando cuando no necesitas serlo?)
vikingsteve
8
@vikingsteve Prácticamente toda la ayuda y sabiduría de git se da en términos de línea de comandos.
Ed Randall
66
@vikingsteve Lo estoy escribiendo mucho porque es más rápido. Escribo ~ 100 ppm, más si estoy íntimamente familiarizado con las pulsaciones de teclas como si estuviera con Git; en comparación con hacer clic en las GUI, es más fácil. Su IDE favorito puede tener atajos de teclado. Eso es bueno para ti. ¿Por qué tendría que perder el tiempo aprendiendo cuando <M-Tab> git bla <CR> ya está en mi memoria muscular?
Financia la demanda de Mónica el
3
Debería haber un "esta pregunta debe cerrarse porque el usuario está haciendo una pregunta que no tiene sentido", como entiendo lo que está preguntando, pero ¿cómo va a saber el shell que desea ingresar un "no comienza con comando git "si realmente hubiera una manera de hacer esto.
user3728501

Respuestas:

190

Es posible que desee probar gitsh . De su léame:

El gitshprograma es un shell interactivo para git. Desde dentro gitshpuede emitir cualquier comando git, incluso utilizando sus alias locales y configuración.

  • Los comandos Git tienden a venir en grupos. Evite escribir gituna y otra vez ejecutándolos en un shell de git dedicado:
sh$ gitsh
gitsh% status
gitsh% add .
gitsh% commit -m "Ship it!"
gitsh% push
gitsh% ctrl-d
sh$

O echa un vistazo a los otros proyectos vinculados allí:

  • git-sh : un shell bash personalizado con un indicador Git, alias y finalización.
  • gitsh : un shell Git simple escrito en Perl.
  • repl - Envuelve cualquier programa con subcomandos en un REPL.

Nota: No he usado esto yo mismo.

Alfunx
fuente
22
gruñir ... repl(1)no es una REPL. No evalúa ni imprime nada. Ejecuta programas.
Kevin
11
@Kevin Lee las solicitudes de los usuarios, evalúa la solicitud del usuario (ejecutando un programa) e imprime la salida del programa. Esto es también lo que hacen las conchas.
Yakk - Adam Nevraumont
2
@ Yakk-AdamNevraumont: No, ciertamente no "imprime la salida del programa". Conecta el stdout del programa al terminal, y luego el programa imprime su propia salida, excepto que el stdout del programa ya está conectado al terminal (heredado automáticamente sobre el fork()/ exec()), por repl(1)lo que ni siquiera está haciendo eso .
Kevin
66
@Kevin Entiendo su opinión, sin embargo, la definición estricta de un REPL excluiría a la mayoría de los intérpretes "REPL" en varios idiomas. Solo en lenguajes funcionales puros podría asegurarse de que la evaluación no tenga efectos secundarios, pero incluso en Haskell el GHCi "REPL" también aceptará IOacciones por defecto y las ejecutará, incluidos los efectos secundarios, como imprimir en la pantalla conectada al terminal.
Leftaroundabout
2
@Kevin replno es un REPL independiente; Es un medio de crear un sistema REPL en el que replsolo se encuentra el componente interactivo. ¿Es eso justo?
Kyle Strand
116

Un Perl one-liner que hará esto:

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

Esto ejecutará lo que escriba, con el prefijo git. Y seguirá haciéndolo hasta que golpees ^D.


fuente
66
¡Esto es muy similar a lo que está pidiendo OP, y en un paquete muy liviano!
ruohola
2
Esto sería perfecto si funcionara con readline pero desafortunadamente no lo hace (no es sorprendente ya que esto es estrictamente un truco alrededor de las -nebanderas de Perl ).
Konrad Rudolph
11
@KonradRudolphperl -MTerm::ReadLine -E '$n = Term::ReadLine -> new ("git"); while ($_ = $n -> readline ("git > ")) {system "git $_"}'
57

Esto no es exactamente lo que está pidiendo, pero puede configurar algunos alias de shell en ~/.bashrclos comandos Git que usa con más frecuencia:

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

También tenga en cuenta que puede crear alias dentro de Git:

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

Esto le permite escribir en git cilugar de git commit, y así sucesivamente.

Thomas
fuente
77
El inconveniente de este enfoque es que sería necesario crear un alias por separado para cada comando de Git.
Tim Biegeleisen
22
Solo para los más utilizados. Quiero decir, ¿con qué frecuencia usas git hash-objecto git interpret-trailers? Solo estoy ofreciendo esto como una alternativa porque, hasta donde yo sé, lo que está preguntando realmente no existe.
Thomas
15
Además de cipara commit, también uso un alias de shell gpara git, esto reduce la mayor parte de la escritura y me permite permanecer en mi shell preferido.
rkta
32

Soy un gran fanático del uso de alias en ~ / .bash_profile para mi GitBash. Si sigue este enfoque, estos son algunos de mis favoritos:

# 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
fuente
3
where's commit: P
qwr
14
No commitpush
incluyo
3
Comprometerse y empujar no debería ser capaz de destruir nada a menos que use el empuje forzado. Pero trato de usar el estado de git de antemano.
qwr
1
Esto es lo que he hecho también, +1. Aunque estoy tentado a probar gitsh como otras respuestas han mencionado
CoffeeTableEspresso
1
@CoffeeTableEspresso Respeto el hecho de que reconozca que unas pocas pulsaciones de teclas son la diferencia entre guardar actualizaciones y destruir un proyecto.
LogicalBranch
31

Usa tu editor.

Escriba el comando like commitde su editor favorito como vs code y sea más eficiente con git:

ingrese la descripción de la imagen aquí

O escriba gitpara obtener todos los comandos:

ingrese la descripción de la imagen aquí

prosti
fuente
13
Estoy sorprendido por todos estos votos negativos. Esta no es una respuesta terrible para las personas que usan IDE que admiten estas características.
Glen Pierce
44
Creo que la gente ha votado negativamente porque no todos usan / les gusta VS-Code. De cualquier manera, creo que es una solución decente, por lo que hago un +1.
LogicalBranch
44
@LogicalBranch, la gente generalmente usa el git desde la línea de comandos, y soy consciente de eso, pero el soporte de git dentro de algunos editores existe y vale la pena intentarlo.
prosti
1
No me gusta esta respuesta porque no todo el mundo usa el código VS (personalmente no me gusta), pero no votaré negativamente porque esta es una buena solución para las personas que lo usan.
CoffeeTableEspresso
1
@CoffeeTableEspresso, si está usando sublime, hay un complemento llamado gitsavvy , y así sucesivamente ... Casi todos los editores hoy en día tienen algún tipo de soporte para git. Este fue el punto de la respuesta, ya que puedes leer "Usa tu editor".
prosti
26

Un amigo mío hizo un pequeño script de bash que logra esto. Se llama Replificar .

$ 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
fuente
66
Bien, ya lo mencioné en la respuesta de Umur, pero el uso de evalla fuente del script original no es la mejor idea. Dile a tu amigo que use while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";doneen su lugar
Sergiy Kolodyazhnyy
23

Aquí hay otra manera. Tampoco es exactamente lo que se pidió, pero lo he estado usando durante algún tiempo y es bastante agradable. Agregue la siguiente línea a su ~/.bashrc:

complete -E -W git

Ahora, presionando Tab en un indicador de Bash vacío escribirá "git".

tipo nómada
fuente
55
Tenga en cuenta que si está utilizando otro shell, deberá colocarlo en el archivo apropiado. Por ejemplo, para zsh, lo colocará ~/zshrc, para tcsh, lo colocará ~/tcshrc, etc.
TheOnlyMrCat
20

Sé que esta es una respuesta muy tardía, pero esta pregunta realmente me llamó la atención porque he estado lidiando con sufrimiento de este tipo de repetición durante bastante tiempo.

No estoy seguro de ti, pero honestamente no (repito NO ) quiero crear alias para cada gitcomando, así que escribí un script de Python llamado NoGit para resolver este 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 es un script simple de Python para evitar la repetición innecesaria de la palabra clave "git".

Documentación:

  • el %undo comando elimina el último comando de la pila
  • el %run comando ejecuta los comandos en la pila y borra la pila
  • el %exit comando cierra la CLI sin hacer nada
  • presionar ctr+ces lo mismo que correr%run; %exit
  • el script guarda los comandos que se ejecutaron en un archivo llamado git.history en la misma carpeta que el script
  • puedes agregar múltiples comandos en una línea usando un punto y coma
  • puede usar la palabra clave gital comienzo del comando y el script no la duplicará (por ejemplo, git init no se convierte git git init)

Comandos de ejemplo:

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

Información adicional (para usuarios de Linux):

Si lo desea, puede eliminar la .pyextensión y convertirla en un ejecutable usando:

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

Luego, en lugar de llamar al script de esta manera:

python3 git.py

En su lugar, ejecutarías esto:

./git

Información adicional (para personas perezosas):

Si eres flojo y no quieres escribir un, ./entonces puedes mover este script a tu /bin/carpeta y crear un alias para él.

Si usted es realmente, realmente perezoso, utilice los siguientes comandos:

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

Si eres muy, muy, muy vago, copia y pega la siguiente línea:

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

Si su pereza ha alcanzado niveles previamente desconocidos para la humanidad, aquí hay una versión más compacta de la misma frase:

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

Buena suerte.

Rama Lógica
fuente
17

Otro enfoque que funcionará con cualquier comando: use Ctrl + R (reverse-i-search).

Reverse-i-search le permite buscar en su historial de comandos. Repita Ctrl + R después de presionar su cadena de búsqueda para repetir la búsqueda más atrás con la misma cadena.

Solo necesita escribir un comando una vez, luego puede recuperar ese comando de cualquier subcadena del comando. En la mayoría de los casos, puede recuperar comandos completos muy largos y sus diversas variantes con solo dos o tres letras de búsqueda bien ubicadas. No se necesitan configuraciones previas que no sean usar su shell normalmente y es autoadaptable a la forma en que usó el shell, simplemente escriba el comando completo una vez y los comandos se agregarán automáticamente a su historial de comandos.

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

Además, Ctrl-R funciona no solo en bash, sino en muchos programas que usan la biblioteca readline (y hay muchos de ellos), como Python shell, IPython, mysql shell, psql shell, irb (ruby), etc.

Lie Ryan
fuente
15

En su ejemplo, lo compara con un indicador de MySql. La forma en que funciona es que se inicia un proceso MySql y usted le da sus comandos a ese proceso. Como tal, ¿por qué no escribir algo similar en su idioma de elección? Aquí hay un ejemplo 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;
}

Tenga en cuenta que acabo de escribir eso de memoria y que no lo comprobé con un compilador. Puede haber errores de sintaxis triviales.

john01dav
fuente
Solo mi pensamiento. Cualquier persona en Stack Overflow debería poder codificar dicho programa por sí mismo. El lenguaje de programación realmente no importa.
Thomas Weller
@ThomasWeller Definitivamente estoy de acuerdo. Publiqué el programa para mostrar con precisión de lo que estaba hablando, no porque sea un programa difícil de escribir.
john01dav
9
Vas a invertir mucho tiempo con este enfoque si quieres que el programa esté libre de errores y tenga una cantidad decente de características. Por ejemplo, después de corregir el error de compilación inicial (std :: system () quiere const char *) notará que hay un bucle infinito en EOF. Es posible que desee soporte de historial / lectura, finalización de pestañas, algunas funciones integradas para cambiar el directorio / configurar env vars / shell out / ..., etc. Si hay un software existente (como gitsh en este caso), ¿por qué no usarlo?
nomadictype
1
@nomadictype Esa es una crítica válida, pero aprender otro software también es un compromiso de tiempo. Las ventajas de este enfoque son que solo se necesitan unos minutos para que funcione, y que hará exactamente lo que espera o desea (con cambios).
john01dav
2
La pérdida de readline, edición de línea, soporte de historial, poder ejecutar comandos simples como ls, etc., le costará mucho más que las cuatro pulsaciones de teclas, o eso ahorró con esto.
Mentira Ryan
13

Para cosas básicas, puedes hacer:

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>

Salir con ctrl + c

Umur Kontacı
fuente
2
Idea decente, sin embargo, hay dos problemas. Uno, el ;after do conduce a bash: syntax error near unexpected token : `` Segundo, la evalparte es propensa a vulnerabilidades. Por ejemplo, considere lo que sucede si escribo status;cat /etc/passwden este pequeño shell. Ejemplo inofensivo, pero usted tiene la idea de lo que puede suceder. Puede simplificar eso en while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";doneEsto, por supuesto, no es a prueba de balas, pero 1, es más simple y 2, evita la ejecución de comandos no git (en virtud de comillas dobles). No es ideal, solo un poco mejor
Sergiy Kolodyazhnyy
@Abigail Funny :) ¿Por qué sí? Shell en sí no es la aplicación más segura. Incluso la captura de un archivo puede ser un problema. Sin embargo, el punto que estaba diciendo originalmente es que no vemos al intérprete mysql ejecutando comandos de shell, no sin systemo \!al principio al menos. Cuando la suposición podría ser que esta "réplica" gitsolo ejecuta comandos, de hecho permite más que eso.
Sergiy Kolodyazhnyy
@Abigail No tengo miedo, porque sé lo que hace. Otros que no lo hacen, pueden terminar rompiendo algo que no deberían. Y de nuevo, eval no es la mejor idea para ejecutar comandos, especialmente cuando se trata de una entrada controlada por el usuario.
Sergiy Kolodyazhnyy
Se corrigió el error tipográfico después do. ¡Gracias! re: seguridad: Esto obviamente no está destinado a ser distribuido como una aplicación separada. Simplemente ingrese su .bash_profilesi no le gusta escribir git. No me preocupa demasiado que sea "inseguro". Si pegas cosas en tu bash que no entiendes (incluido este script en línea), lo pasarás mal. Me gusta esto porque es simple, fácil de escribir y fácil de leer, y fácil de mejorar.
Umur Kontacı
2

Cuando utilicé Windows 7 con Conemu, agregué lo siguiente a mi script de inicio del entorno de desarrollo:

doskey g=git $*

Con esto, podría usar el gcomando en lugar de escribir git. La última vez que probé con Windows 10 y Conemu, no funcionó, creo que hay un error, pero vale la pena intentarlo.

Adamsan
fuente
2

Use un editor de corchetes, es fácil usar su código y comandos git, también tiene muchas características.

ingrese la descripción de la imagen aquí

En la esquina superior derecha, el segundo ícono binocular se usa para instalar extensiones.

ingrese la descripción de la imagen aquí

Busque la extensión brackets gitcomo la imagen de arriba e instálela.

ingrese la descripción de la imagen aquí

Una vez más, en la esquina superior derecha, aparecerá el cuarto icono, así que solo haga clic y vea los cambios como en la imagen de arriba.

Si desea instalar corchetes, use los siguientes comandos:

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

Para obtener más información, puede leer: Cómo instalar Brackets Code Editor en Ubuntu y Linux Mint en Ubuntupit .

akash
fuente