Как мне избежать ввода "git" в начале каждой команды Git? - PullRequest
187 голосов
/ 08 июня 2019

Мне интересно, есть ли способ избежать необходимости вводить слово git в начале каждой команды Git.

Было бы неплохо, если бы был способ использовать gitКоманда только один раз в начале после открытия командной строки, чтобы войти в «Режим Git» .

Например:

git>

После которого каждая набираемая нами команда будетпо умолчанию интерпретируется как команда Git.

Подобно тому, как мы используем оболочку MySQL для написания команд базы данных:

mysql>

Это избавит меня от необходимости набирать git сотни раз в день.

ПРИМЕЧАНИЕ: Я использую git-bash, для Windows.

Ответы [ 13 ]

190 голосов
/ 08 июня 2019

Возможно, вы захотите попробовать Гитш .Из их readme:

Программа gitsh представляет собой интерактивную оболочку для git.Из gitsh вы можете выполнить любую команду git, даже используя ваши локальные псевдонимы и конфигурацию.

  • Команды Git обычно собираются группами.Старайтесь не вводить git снова и снова, запуская их в специальной оболочке git:
sh$ gitsh
gitsh% status
gitsh% add .
gitsh% commit -m "Ship it!"
gitsh% push
gitsh% ctrl-d
sh$

Или посмотрите на другие связанные с этим проекты:

  • git-sh - настраиваемая оболочка bash с подсказкой Git, псевдонимами и завершением.
  • gitsh - написана простая оболочка Gitв Perl.
  • repl - Обертывание любой программы с подкомандами в REPL.

Примечание: сам не использовал это.

115 голосов
/ 08 июня 2019

Однострочный Perl, который сделает это:

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

Это выполнит все, что вы введете, с префиксом git.И это будет продолжаться до тех пор, пока вы не нажмете ^D.

57 голосов
/ 08 июня 2019

Это не совсем то, что вы просите, но вы можете настроить псевдонимы оболочки в вашем ~/.bashrc для команд Git, которые вы используете чаще всего:

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

Также обратите внимание, что вы можете создавать псевдонимы внутри самого Git:

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

Это позволяет вам печатать git ci вместо git commit и т. Д.

32 голосов
/ 10 июня 2019

Я большой поклонник использования псевдонимов в ~ / .bash_profile для моего GitBash.Если вы используете этот подход, вот некоторые из моих любимых:

# 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'
31 голосов
/ 10 июня 2019

Используйте свой редактор.

Введите команду, например commit, в своем любимом редакторе, например против кода , и будьте эффективнее с помощью git:

enter image description here

Или введите git, чтобы получить все команды:

enter image description here

26 голосов
/ 10 июня 2019

Мой друг написал небольшой скрипт bash, который выполняет это. Это называется 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
23 голосов
/ 09 июня 2019

Вот другой способ.Это также не совсем то, о чем спрашивали, но я уже некоторое время пользуюсь им, и это довольно приятно.Добавьте следующую строку к вашему ~/.bashrc:

complete -E -W git

Теперь, нажав Tab в пустой строке Bash, выведите «git».

21 голосов
/ 10 июня 2019

Я знаю, что это очень поздний ответ, но этот вопрос поразил меня, потому что я имел дело с , страдающим от такого рода повторений уже довольно давно.

Я не уверен в вас, но, честно говоря, не (повторяю НЕ ) не хотят создавать псевдонимы для каждой команды git, поэтому вместо этого я написал PythonСценарий NoGit для решения этой проблемы:

#!/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 - это простой скрипт на python, предотвращающий ненужное повторение ключевого слова "git".

Документация:

  • команда %undo удаляет последнюю команду из стека
  • команда %run запускает команды в стеке и очищает стек
  • команда %exit закрывает CLI, ничего не делая
  • нажатие ctr+c аналогично выполнению %run; %exit
  • сценарий сохраняет команды, которые были выполнены, в файл с именем git.history в той же папке, что и скрипт
  • , вы можете добавить мульКоманды в одной строке, используя точку с запятой
  • , вы можете использовать ключевое слово git в начале команды, и скрипт не будет дублировать его ( EG: git initне становится git git init)

Примеры команд:

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

Дополнительная информация (для пользователей Linux):

Если вы хотите, вы можете удалить .py расширение и преобразование его в исполняемый файл, используя:

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

Затем вместо вызова сценария, например:

python3 git.py

Вместо этого вы запустите:

./git

Дополнительная информация (для ленивых людей):

Если вы ленивы и не хотите вводить ./, вы можете переместить этот скрипт в папку /bin/ и создать псевдонимдля этого.

Если вы действительно , действительно ленивый, используйте следующие команды:

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

Если вы действительно, действительно, действительно ленивый, скопируйтеи вставьте следующий однострочный текст:

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

Если ваша лень достигла уровней, ранее неизвестных человечеству, вот более компактная версия того же однострочного:

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

Удачи.

17 голосов
/ 10 июня 2019

Другой подход, который будет работать с любыми командами: используйте Ctrl + R (reverse-i-search).

Обратный i-search позволяет вам искать историю команд.Повторите Ctrl + R после нажатия строки поиска, чтобы повторить поиск далее с той же строкой.

Вам нужно всего лишь набрать команду один раз, затем вы можете вызвать эту команду из любой подстроки команды.В большинстве случаев вы можете вспомнить целые очень длинные команды и их различные варианты с помощью всего двух-трех удачно расположенных поисковых букв.Никаких предварительных настроек не требуется, кроме использования вашей оболочки в обычном режиме, и оно само адаптируется к тому, как вы использовали оболочку, просто введите полную команду один раз, и команды будут автоматически добавлены в историю команд.

  • 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
  • и т. Д.

Более того, Ctrl-R работает не только на bash, но и намножество программ, использующих библиотеку readline (и их много), таких как оболочка Python, IPython, оболочка mysql, оболочка psql, irb (ruby) и т. д.

15 голосов
/ 09 июня 2019

В вашем примере вы сравниваете его с приглашением MySql.Это работает так, что запускается процесс MySql, и вы даете свои команды этому процессу.Как так, почему бы не написать что-то похожее на выбранном вами языке?Вот простой пример на 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;
}

Обратите внимание, что я только что написал это по памяти и не проверял это с помощью компилятора.Там могут быть тривиальные синтаксические ошибки.

...