Как мне избежать ввода «git» в начале каждой команды Git?

190

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

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

Например:

git>

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

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

mysql>

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

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

ночной
источник
87
Тем, кто проголосовал за закрытие на основании того, что это не по теме, пожалуйста, прочитайте текст, на который вы нажимаете: «Вопросы об общем вычислительном оборудовании и программном обеспечении не относятся к теме переполнения стека, если они не связаны напрямую с инструментами, используемыми в основном для программирования . " Git - инструмент, используемый программистами. Об этом свидетельствует тот факт, что у него есть собственный тег на этом сайте.
JBentley
5
Почему вы так много печатаете "git"? Ваша IDE должна иметь мощные vcs-интеграции, доступные при нажатии клавиш. Вы предпочитаете набирать «git pull» 50 раз в день или ctrl-t ... перестаньте быть воином командной строки, когда вам это не нужно;)
vikingsteve
8
@vikingsteve Практически вся помощь git и мудрость даны в терминах командной строки.
Эд Рэндалл
6
@vikingsteve Я так много печатаю, потому что это быстрее. Я набираю ~ 100wpm, больше, если я близко знаком с клавишами, как я с Git; по сравнению с нажатием на графический интерфейс, это просто проще. У вашей любимой IDE могут быть сочетания клавиш. Это хорошо для тебя. Зачем мне тратить время на их изучение, когда <M-Tab> git blah <CR> уже находится в моей мышечной памяти?
Фонд Моника Иск
3
Должно быть «этот вопрос должен быть закрыт, потому что пользователь задает вопрос, который не имеет смысла» - как будто я получаю то, что вы спрашиваете, но как оболочка узнает, что вы хотите ввести «не начиная с команда git "если действительно был способ сделать это.
user3728501

Ответы:

190

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

gitshПрограмма представляет собой интерактивную оболочку для мерзавца. Изнутри 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.

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

alfunx
источник
22
ворчать ... repl(1)это не ответ. Он ничего не выдает и не печатает. Он запускает программы.
Кевин
11
@Kevin Читает в пользовательских запросах, оценивает пользовательский запрос (запустив программу) и печатает выходные данные программы. Это также то, что делают оболочки.
Якк - Адам Невраумонт
2
@ Yakk-AdamNevraumont: Нет, он, безусловно, не «печатает вывод программы». Он подключает стандартный вывод программы к терминалу, а затем программа выводит свой собственный вывод - за исключением того, что стандартный вывод программы уже подключен к терминалу (наследуется автоматически через fork()/ exec()), поэтому repl(1)даже не делает этого .
Кевин
6
@Kevin Я понимаю ваше мнение, однако строгое определение REPL исключает большинство переводчиков «REPL» на разных языках. Только в чисто функциональных языках вы можете убедиться, что у оценки нет побочных эффектов, но даже в Haskell GHCi «REPL» по умолчанию также будет принимать IOдействия и выполнять их, включая побочные эффекты, такие как печать на экране, подключенном к терминалу.
оставил около
2
@Kevin repl- это не отдельный REPL; это средство создания системы REPL, в которой replесть только интерактивный компонент. Это справедливо?
Кайл Стрэнд,
116

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

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

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


источник
6
Это действительно очень похоже на то, о чем просит OP, и в очень легкой упаковке!
Руохола
2
Это было бы идеально, если бы он работал с readline, но, к сожалению, это не так (не удивительно, поскольку это просто взломать -neфлаги Perl )
Конрад Рудольф
11
@KonradRudolphperl -MTerm::ReadLine -E '$n = Term::ReadLine -> new ("git"); while ($_ = $n -> readline ("git > ")) {system "git $_"}'
57

Это не совсем то, что вы просите, но вы можете настроить некоторые псевдонимы оболочки для своих ~/.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, и так далее.

Томас
источник
7
Недостаток этого подхода заключается в том, что для каждой команды Git необходимо создать отдельный псевдоним.
Тим Бигелейзен
22
Только для наиболее часто используемых. Я имею в виду, как часто вы используете git hash-objectили git interpret-trailers? Я просто предлагаю это в качестве альтернативы, потому что, насколько я знаю, вопрос, о котором идет речь, на самом деле не существует.
Томас
15
В дополнение к cifor commitя также использую псевдоним оболочки gдля git, это уменьшает большую часть набора текста и позволяет мне оставаться в моей предпочитаемой оболочке.
rkta
32

Я большой поклонник использования псевдонимов в ~ / .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'
JacobIRR
источник
3
где коммит: P
qwr
14
Я не включаю commitили pushпотому что хочу, чтобы несколько дополнительных секунд (при наборе текста) были уверены, что я что-то не уничтожаю
JacobIRR
3
Фиксация и толчок не должны уничтожать что-либо, если вы не используете принудительный толчок. Но я стараюсь использовать git status заранее.
qwr
1
это то, что я сделал, +1. Хотя я испытываю желание попробовать гитш, как уже упоминалось в других ответах
CoffeeTableEspresso
1
@CoffeeTableEspresso Я уважаю тот факт, что вы признаете, что несколько нажатий клавиш - это разница между сохранением обновлений и уничтожением проекта.
LogicalBranch
31

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

Введите команду like commitиз вашего любимого редактора, например vs code, и будьте эффективнее с git:

введите описание изображения здесь

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

введите описание изображения здесь

прости
источник
13
Я удивлен всеми этими отрицательными голосами. Это не страшный ответ для людей, которые используют IDE, которые поддерживают эти функции.
Глен Пирс
4
Я думаю, что люди проголосовали против, потому что не всем нравится / нравится VS-код. В любом случае, я думаю, что это достойное решение, так что +1 от меня.
LogicalBranch
4
@LogicalBranch, люди обычно используют git из командной строки, и я знаю об этом, но поддержка git внутри некоторых редакторов существует, и ее стоит попробовать.
Прости
1
Мне не нравится этот ответ, потому что не все используют код VS (лично мне он не нравится), но не понравится, потому что это хорошее решение для людей, которые его используют.
CoffeeTableEspresso
1
@CoffeeTableEspresso, если вы используете sublime, есть плагин gitsavvy и т. Д. Почти каждый редактор в настоящее время имеет какую-то поддержку git. Это был смысл ответа, так как вы можете прочитать «Используйте свой редактор».
прости
26

Мой друг сделал небольшой скрипт 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
Сэм Уивер
источник
6
Хорошо, я уже упоминал об этом в ответе Умура, но использование evalв исходном скрипте не является лучшей идеей. Скажи другу, чтобы использовать while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";doneвместо
Сергей Колодяжный
23

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

complete -E -W git

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

nomadictype
источник
5
Обратите внимание, что если вы используете другую оболочку, вам придется поместить ее в соответствующий файл. Например, для zsh вы ~/zshrc~/tcshrc
вставите
20

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

Я не уверен в вас, но, честно говоря, я не хочу (я повторяю, НЕ ) создавать псевдонимы для каждой 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'

Удачи.

LogicalBranch
источник
17

Другой подход, который будет работать с любыми командами: используйте 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

В вашем примере вы сравниваете его с приглашением 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;
}

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

john01dav
источник
Просто моя мысль. Любой, кто находится в Stack Overflow, должен сам иметь возможность кодировать такую ​​программу. Язык программирования не имеет большого значения.
Томас Уэллер
@ThomasWeller Я определенно согласен. Я разместил программу, чтобы точно показать, о чем я говорил, а не потому, что это сложная программа для написания.
john01dav
9
Вы будете тратить много времени на этот подход, если хотите, чтобы программа не содержала ошибок и имела приличное количество функций. Например, после исправления первоначального сбоя сборки (std :: system () хочет const char *), вы заметите, что в EOF существует бесконечный цикл. Возможно, вам понадобится поддержка истории / readline, завершение табуляции, некоторые встроенные функции для изменения каталога / установки env vars / shell out / ... и т. Д. Если существует программное обеспечение (например, gitsh в этом случае), почему бы не использовать его?
кочевой тип
1
@nomadictype Это серьезная критика, но изучение другого программного обеспечения также требует времени. Преимущества этого подхода в том, что для его работы требуется всего несколько минут, и он будет делать именно то , что вы ожидаете или хотите (с изменениями).
john01dav
2
Потеря readline, редактирование строки, поддержка истории, возможность запуска простых команд, таких как ls и т. Д., Обойдется вам намного дороже, чем четыре нажатия клавиш, или вы сэкономили с этим.
Ли Райан
13

Для базовых вещей вы можете сделать:

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>

Выход с помощью Ctrl + C

Умур Контачи
источник
2
Достойная идея, однако есть две проблемы. Во- первых, ;после do делает следующее bash: syntax error near unexpected token : «Во-вторых, evalчасть подвержена уязвимостям. Например, рассмотрим, что произойдет, если я введу status;cat /etc/passwdв эту небольшую оболочку. Пример безвреден, но вы понимаете, что может произойти. Вы можете упростить это в while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";doneКонечно, это не является пуленепробиваемым, но 1 - это проще и 2 - позволяет избежать выполнения не git-команд (благодаря двойным кавычкам). Не идеал, просто чуть лучше
Сергей Колодяжный
@Abigail Забавно :) Почему да, сама оболочка не самое безопасное приложение. Даже перехват файла может быть проблемой. Тем не менее, изначально я хотел сказать, что мы не видим интерпретатора mysql, выполняющего команды оболочки, по крайней мере , без systemили \!в начале. Если можно предположить, что этот «repl» выполняет gitтолько команды, он на самом деле допускает нечто большее.
Сергей Колодяжный
@ Abigail Я не боюсь, потому что я знаю, что это делает. Другие, которые не ... могут в конечном итоге сломать то, что не должны. И снова - eval не самая лучшая идея для запуска команд, особенно когда задействован контролируемый пользователем ввод.
Сергей Колодяжный
Исправлена ​​опечатка после do. Спасибо! re: security: Это явно не предназначено для распространения как отдельное приложение. Просто вставьте свой, .bash_profileесли вам не нравится печатать git. Я не слишком беспокоюсь о том, что это «небезопасно». Если вы вставите в свой bash вещи, которые вы не понимаете (включая этот скрипт oneliner), у вас будет плохое время. Мне это нравится, потому что это просто, легко написать, легко прочитать и легко улучшить.
Умур Контачи
2

Когда я использовал Windows 7 с Conemu, я добавил в скрипт запуска среды разработки следующее:

doskey g=git $*

При этом я мог бы просто использовать gкоманду вместо ввода git. Последний раз я пробовал с Windows 10 и Conemu, он не работал, есть ошибка, я думаю, но попробовать стоит.

Adamsan
источник
2

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

введите описание изображения здесь

В верхнем правом углу второй значок бинокля используется для установки расширений.

введите описание изображения здесь

Найдите расширение, brackets gitкак на картинке выше, и установите его.

введите описание изображения здесь

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

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

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

Для получения дополнительной информации вы можете прочитать: Как установить редактор скобок в Ubuntu и Linux Mint в Ubuntupit .

Акаша
источник