Як я уникаю набирати "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; порівняно з натисканням на GUI, це просто простіше. У вашому улюбленому IDE можуть бути комбінації клавіш. Це приємно для вас. Чому я б витрачав час на їх вивчення, коли <M-Tab> git blah <CR> вже в моїй м’язовій пам'яті?
Фонд позову Моніки

3
Повинно бути "це питання має бути закритим, оскільки користувач задає питання, яке не має сенсу" - як я отримую те, що ви запитуєте, але як оболонка дізнається, що ви хочете ввести "не починаючи з git команда "якби дійсно було способу це зробити.
користувач3728501

Відповіді:


190

Ви можете спробувати gitsh . З їх прочитаного:

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.

Примітка. Я цього не використовував сам.


22
бурчить ... repl(1)це не ВІДПОВІДЬ. Він нічого не оцінює і не друкує. Він запускає програми.
Кевін

11
@Kevin Він читає запити користувачів, оцінює запит користувача (запустивши програму) та друкує вихідну програму. Це теж те, що роблять снаряди.
Якк - Адам Невраумон

2
@ Yakk-AdamNevraumont: Ні, це, звичайно, не "друкує вихід програми". Він перехоплює стандартний висновок програми до терміналу, а потім програма друкує свій власний вихід - крім стандартного виведення цієї програми вже підключений до терміналу (успадковується автоматично через fork()/ exec()), так що repl(1)навіть не робити що .
Кевін

6
@Kevin Я розумію ваші настрої, проте суворе визначення REPL виключає більшість перекладачів "REPL" на різних мовах. Тільки на чистих функціональних мовах ви могли б переконатися, що оцінка не має побічних ефектів, але навіть у Haskell "REPL" GHCi за замовчуванням також приймає IOдії та виконує їх, включаючи побічні ефекти, такі як друк на екрані, пов'язаному з терміналом.
близько

2
@Kevin replне є самостійною REPL; це засіб створення системи REPL, в якій replє лише інтерактивний компонент. Це справедливо?
Кайл Странд

116

Perl-лайнер, який буде робити це:

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

Це буде виконувати все, що ви вводите, з префіксом git. І буде продовжувати це робити, поки не вдариш ^D.


6
Це дійсно найбільш схоже на те, що просить ОП, і в дуже легкій упаковці!
ruohola

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
На додаток до ciдля того, що commitя також використовую псевдонім оболонки gдля git, це зменшує більшу частину набору тексту і дозволяє мені залишитися в моїй бажаній оболонці.
ркта

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'

3
де здійснюються: P
qwr

14
Я не включаю commitабо pushоскільки я хочу кілька додаткових секунд (під час набору тексту), щоб бути впевненим, що я щось не
руйную

3
Здійснення та натискання не повинно нічого знищувати, якщо ви не використовуєте силовий натиск. Але я намагаюся заздалегідь використовувати статус git.
qwr

1
це я теж зробив, +1. Хоча я спробую спробувати gitsh, як згадували інші відповіді
CoffeeTableEspresso

1
@CoffeeTableEspresso Я поважаю те, що ви визнаєте, що кілька натискань клавіш - це різниця між збереженням оновлень та знищенням проекту.
LogicalBranch

31

Використовуйте свій редактор.

Введіть команду типу commit у вашому улюбленому редакторі, як vs код, і будьте більш ефективними з git:

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

Або введіть, gitщоб отримати всі команди:

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


13
Я здивований усіма цими голосами. Це не страшна відповідь для людей, які використовують IDE, які підтримують ці функції.
Глен Пірс

4
Я думаю, що люди заперечили голос, оскільки не всі користуються / подобаються VS-кодом. Так чи інакше, я думаю, що це гідне рішення, тому +1 від мене.
LogicalBranch

4
@LogicalBranch, люди зазвичай використовують git з командного рядка, і я знаю про це, але підтримка git всередині деяких редакторів існує, і варто спробувати.
prosti

1
Мені не подобається ця відповідь, тому що не всі використовують код VS (особисто мені це не подобається), але не підкреслюють, тому що це гарне рішення для ppl, які використовують його.
CoffeeTableEspresso

1
@CoffeeTableEspresso, якщо ви використовуєте піднесене, є плагін під назвою gitsavvy і так далі ... Майже кожен редактор нині має якусь підтримку git. Це був пункт відповіді, оскільки ви можете прочитати "Використовувати свій редактор".
prosti

26

Мій друг склав невеликий скрипт, який виконує це. Це називається 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".


5
Зауважте, що якщо ви використовуєте іншу оболонку, вам доведеться помістити її у відповідний файл. Наприклад, для zsh, ви помістите його ~/zshrc, для tcsh, ви помістите його в ~/tcshrcінше
TheOnlyMrCat

20

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

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

Ще один підхід, який буде працювати з будь-якими командами: використовувати Ctrl + R (зворотний-i-пошук).

Зворотний 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 shell, psql shell, 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;
}

Зверніть увагу, що я щойно написав це з пам'яті і що я не перевірив це компілятором. Можуть бути тривіальні синтаксичні помилки.


Просто моя думка. Кожен, хто перебуває у стеці Overflow, повинен мати можливість кодувати таку програму сам. Мова програмування насправді не має значення.
Томас Веллер

@ThomasWeller Я однозначно згоден. Я розмістив програму, щоб точно показати, про що я говорив, а не тому, що це складна програма для написання.
john01dav

9
Ви збираєтесь інвестувати багато часу в цей підхід, якщо хочете, щоб програма була без помилок і мала пристойну кількість функцій. Наприклад, виправивши початковий збій збірки (std :: system () хоче const char *), ви помітите, що на EOF існує нескінченний цикл. Можливо, ви хочете підтримати історію / читання рядків, завершення вкладок, деякі вбудовані файли, щоб змінити каталог / встановити env vars / shell out / ... і т. Д. Якщо є існуюче програмне забезпечення (наприклад, gitsh у цьому випадку), чому б не використовувати його?
nomadictype

1
@nomadictype Це обгрунтована критика, але вивчення іншого програмного забезпечення - також час. Переваги такого підходу полягають у тому, що для його роботи потрібно лише кілька хвилин, і це зробить саме те , що ви очікуєте чи хочете (із змінами).
john01dav

2
Втрата читальної лінії, редагування рядків, підтримка історії, можливість виконання простих команд, таких як 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 - уникає виконання команд non git (в силу подвійних лапок). Не ідеально, лише трохи краще
Сергій Колодяжний

@Abigail Funny :) Чому так, сама оболонка - не найбезпечніша програма. Навіть введення файлу може бути проблемою. Однак я спочатку зазначав, що ми не бачимо інтерпретатора mysql, який виконує команди оболонки, не принаймні без початку systemабо \!на початку. Якщо може бути припущення, що цей "репл" виконує gitлише команди, воно насправді дозволяє більше, ніж це.
Сергій Колодяжний

@Abigail Я не боюся, бо знаю, що це робить. Інші, хто цього не зробить, - можуть порушити щось, чого не повинні. І знову ж таки - eval не найкраща ідея для запуску команд, особливо коли йдеться про керований користувачем ввід.
Сергій Колодяжний

Виправлено помилку друку після do. Дякую! re: безпека: це, очевидно, не поширюється як окрема програма. Просто введіть свій текст, .bash_profileякщо вам не подобається вводити git. Я не надто переживаю, щоб це було "небезпечно". Якщо ви вставите речі у свій баш, які ви не розумієте (включаючи цей сценарій oneliner), вам буде погано провести час. Мені це подобається, тому що це просто, легко писати і легко читати і легко вдосконалюватися.
Umur Kontacı

2

Коли я використовував Windows 7 з Conemu, я додав у свій сценарій запуску програми для розробленого середовища наступне:

doskey g=git $*

З цим я міг просто використовувати gкоманду замість набору тексту git. Востаннє я спробував з Windows 10 та Conemu, це не вийшло, помилка є, я думаю, але варто спробувати.


2

Використовуйте редактор дужок, користуватися кодом і git командами легко, у нього також багато функцій.

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

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

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

Шукайте розширення на brackets gitзразок наведеного вище зображення та встановіть його.

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

Знову у верхньому правому куті з’явиться четвертий значок, тому просто натисніть та побачите зміни, як на зображенні вище.

Якщо ви хочете встановити дужки, скористайтеся такими командами:

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

Для отримання додаткової інформації ви можете прочитати: Як встановити редактор кодів брекетів в Ubuntu та Linux Mint на Ubuntupit .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.