Bagaimana saya menghindari mengetik "git" di awal setiap perintah Git?

190

Saya bertanya-tanya apakah ada cara untuk menghindari keharusan mengetik kata gitdi awal setiap perintah Git.

Alangkah baiknya jika ada cara untuk menggunakan gitperintah hanya sekali di awal setelah membuka prompt perintah untuk masuk ke "mode Git" .

Sebagai contoh:

git>

Setelah itu setiap perintah yang kita ketik secara default ditafsirkan sebagai perintah Git.

Dengan cara yang mirip dengan bagaimana kita menggunakan shell MySQL untuk menulis perintah basis data:

mysql>

Ini akan menyelamatkan saya dari keharusan mengetik gitratusan kali sehari.

CATATAN: Saya menggunakan git-bash, pada Windows.

Nokturnal
sumber
87
Bagi mereka yang telah memilih untuk menutup berdasarkan itu di luar topik, silakan baca teks yang Anda klik: "Pertanyaan tentang perangkat keras dan perangkat lunak komputasi umum di luar topik untuk Stack Overflow kecuali jika mereka secara langsung melibatkan alat yang digunakan terutama untuk pemrograman . " Git adalah alat yang digunakan oleh programmer. Seperti dibuktikan oleh fakta bahwa ia memiliki tag sendiri di situs ini.
JBentley
5
Mengapa Anda mengetik "git" begitu banyak? IDE Anda harus memiliki integrasi vcs yang kuat yang tersedia saat tombol ditekan. Apakah Anda lebih baik mengetik "git pull" 50 kali sehari, atau ctrl-t ... berhenti menjadi prajurit baris perintah saat Anda tidak perlu;)
vikingsteve
8
@ vikingsteve Secara praktis semua bantuan git dan kebijaksanaan diberikan dalam bentuk command-line.
Ed Randall
6
@vikingsteve saya mengetik begitu banyak karena lebih cepat. Saya mengetik ~ 100wpm, lebih jika saya akrab dengan penekanan tombol seperti saya dengan Git; dibandingkan dengan mengklik GUI, itu hanya lebih mudah. IDE favorit Anda mungkin memiliki pintasan keyboard. Itu bagus untukmu. Mengapa saya membuang waktu untuk mempelajarinya ketika <M-Tab> git blah <CR> sudah ada dalam memori otot saya?
Dana Gugatan Monica
3
Seharusnya ada "pertanyaan ini harus ditutup karena pengguna mengajukan pertanyaan yang tidak masuk akal" - seperti saya mendapatkan apa yang Anda tanyakan tetapi bagaimana shell akan tahu Anda ingin memasukkan "tidak dimulai dengan perintah git "jika memang ada cara untuk melakukan ini.
user3728501

Jawaban:

190

Anda mungkin ingin mencoba gitsh . Dari readme mereka:

The gitshProgram adalah sebuah shell interaktif untuk git. Dari dalam gitshAnda dapat mengeluarkan perintah git, bahkan menggunakan alias dan konfigurasi lokal Anda.

  • Perintah Git cenderung datang dalam kelompok. Hindari mengetik gitberulang-ulang dengan menjalankannya di git shell khusus:
sh$ gitsh
gitsh% status
gitsh% add .
gitsh% commit -m "Ship it!"
gitsh% push
gitsh% ctrl-d
sh$

Atau lihat proyek-proyek lain yang terhubung di sana:

  • git-sh - Bash shell khusus dengan prompt Git, alias, dan penyelesaian.
  • gitsh - Git shell sederhana yang ditulis dalam Perl.
  • repl - Membungkus program apa pun dengan sub-perintah dalam REPL.

Catatan: Belum pernah menggunakan ini sendiri.

alfunx
sumber
22
menggerutu ... repl(1)bukan REPL. Itu tidak eval atau mencetak apa pun. Ini menjalankan program.
Kevin
11
@Kevin Bunyinya dalam permintaan pengguna, mengevaluasi permintaan pengguna (dengan menjalankan program), dan mencetak output dari program. Ini juga yang dilakukan kerang.
Yakk - Adam Nevraumont
2
@ Yakk-AdamNevraumont: Tidak, itu pasti tidak "mencetak output dari program." Ini menghubungkan stdout program ke terminal, dan kemudian program mencetak outputnya sendiri - kecuali stdout program sudah terhubung ke terminal (diwarisi secara otomatis di atas fork()/ exec()), jadi repl(1)bahkan tidak melakukan itu .
Kevin
6
@Kevin Saya mengerti sentimen Anda, namun definisi ketat dari REPL akan mengecualikan sebagian besar penerjemah “REPL” dalam berbagai bahasa. Hanya dalam bahasa fungsional yang murni Anda dapat memastikan bahwa evaluasi tidak memiliki efek samping, tetapi bahkan di Haskell GHCi "REPL" akan secara default juga menerima IOtindakan, dan menjalankannya termasuk efek samping seperti mencetak ke layar yang terhubung ke terminal.
leftaroundabout
2
@ Kevin replbukanlah REPL mandiri; ini adalah cara untuk menciptakan sistem REPL yang replhanya merupakan komponen interaktif. Apakah itu adil?
Kyle Strand
116

Satu-liner Perl yang akan melakukan ini:

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

Ini akan mengeksekusi apa pun yang Anda ketik, diawali dengan git. Dan itu akan terus melakukan itu sampai Anda menekan ^D.


sumber
6
Ini benar-benar mirip dengan apa yang diminta OP, dan dalam paket yang sangat ringan!
ruohola
2
Ini akan sempurna jika bekerja dengan readline tetapi sayangnya tidak (tidak mengherankan karena ini adalah retas di sekitar -nebendera Perl ).
Konrad Rudolph
11
@KonradRudolphperl -MTerm::ReadLine -E '$n = Term::ReadLine -> new ("git"); while ($_ = $n -> readline ("git > ")) {system "git $_"}'
57

Ini bukan apa yang Anda minta, tetapi Anda bisa mengatur beberapa alias shell di dalam Anda ~/.bashrcuntuk perintah Git yang paling sering Anda gunakan:

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

Perhatikan juga bahwa Anda dapat membuat alias di dalam Git itu sendiri:

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

Ini memungkinkan Anda mengetik, git cibukan git commit, dan seterusnya.

Thomas
sumber
7
Kelemahan dari pendekatan ini adalah bahwa alias yang terpisah perlu dibuat untuk setiap perintah Git.
Tim Biegeleisen
22
Hanya untuk yang paling sering digunakan. Maksud saya, seberapa sering Anda menggunakan git hash-objectatau git interpret-trailers? Saya hanya menawarkan ini sebagai alternatif karena sejauh yang saya tahu, pertanyaan yang diajukan tidak benar-benar ada.
Thomas
15
Selain ciuntuk commitsaya juga menggunakan alias shell guntuk git, ini mengurangi sebagian mengetik dan membuat saya tinggal di shell yang saya sukai.
rkta
32

Saya penggemar berat menggunakan alias di ~ / .bash_profile untuk GitBash saya. Jika Anda menggunakan pendekatan ini, berikut adalah beberapa favorit saya:

# 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
sumber
3
di mana komit: P
qwr
14
Saya tidak menyertakan commitatau pushkarena saya ingin beberapa detik tambahan (saat mengetik) untuk memastikan bahwa saya tidak menghancurkan sesuatu
JacobIRR
3
Berkomitmen dan mendorong seharusnya tidak dapat menghancurkan apa pun kecuali Anda menggunakan dorongan paksa. Tapi saya mencoba menggunakan status git sebelumnya.
qwr
1
inilah yang telah saya lakukan juga, +1. Meskipun saya tergoda untuk mencoba gitsh seperti jawaban lain telah disebutkan
CoffeeTableEspresso
1
@CoffeeTableEspresso Saya menghargai kenyataan bahwa Anda mengakui bahwa beberapa penekanan tombol adalah perbedaan antara menyimpan pembaruan dan menghancurkan suatu proyek.
LogicalBranch
31

Gunakan editor Anda.

Ketikkan perintah like commitdari editor favorit Anda seperti vs code dan lebih efisien dengan git:

masukkan deskripsi gambar di sini

Atau ketik gituntuk mendapatkan semua perintah:

masukkan deskripsi gambar di sini

prosti
sumber
13
Saya terkejut dengan semua suara turun ini. Ini bukan jawaban yang mengerikan bagi orang yang menggunakan IDE yang mendukung fitur ini.
Glen Pierce
4
Saya pikir orang-orang telah memilih karena tidak semua orang menggunakan / suka VS-Code. Either way, saya pikir itu solusi yang layak jadi +1 dari saya.
LogicalBranch
4
@ LogicalBranch, orang umumnya menggunakan git dari command line, dan saya tahu itu, tetapi dukungan git di dalam beberapa editor ada dan perlu dicoba.
prosti
1
Saya tidak suka jawaban ini karena tidak semua orang menggunakan kode VS (saya pribadi tidak suka itu), tetapi tidak akan downvote karena ini adalah solusi yang bagus untuk ppl yang menggunakannya.
CoffeeTableEspresso
1
@CoffeeTableEspresso, jika Anda menggunakan sublim ada plugin bernama gitsavvy , dan seterusnya ... Hampir setiap editor saat ini memiliki semacam dukungan untuk git. Inilah inti jawabannya, karena Anda dapat membaca "Gunakan editor Anda".
prosti
26

Seorang teman saya membuat skrip bash kecil yang menyelesaikan ini. Ini disebut 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
sumber
6
OK, saya sudah menyebutkan itu pada jawaban Umur, tetapi penggunaan evaldalam sumber naskah asli bukan ide terbaik. Beri tahu teman Anda untuk menggunakan while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";donesebagai gantinya
Sergiy Kolodyazhnyy
23

Ini cara lain. Ini juga tidak cukup dengan apa yang diminta, tetapi saya telah menggunakannya untuk beberapa waktu dan itu cukup bagus. Tambahkan baris berikut ke Anda ~/.bashrc:

complete -E -W git

Sekarang menekan Tab pada prompt Bash kosong akan mengetik "git".

nomadictype
sumber
5
Perhatikan bahwa jika Anda menggunakan shell lain, Anda harus memasukkannya ke file yang sesuai. Misalnya, untuk zsh, Anda akan memasukkannya ~/zshrc, untuk tcsh, Anda akan memasukkannya ~/tcshrc, dll.
TheOnlyMrCat
20

Saya tahu ini adalah jawaban yang sangat terlambat tetapi pertanyaan ini benar-benar menyentuh catatan saya karena saya telah berurusan dengan penderitaan dari pengulangan semacam ini untuk beberapa waktu sekarang.

Saya tidak yakin tentang Anda tetapi saya sejujurnya tidak (saya ulangi TIDAK ) ingin membuat alias untuk setiap gitperintah, jadi alih-alih saya menulis skrip python bernama NoGit untuk menyelesaikan masalah ini:

#!/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 adalah skrip python sederhana untuk mencegah pengulangan kata kunci "git" yang tidak perlu.

Dokumentasi:

  • yang %undoperintah menghapus perintah terakhir dari stack
  • yang %runperintah menjalankan perintah dalam stack dan membersihkan tumpukan
  • yang %exitperintah menutup CLI tanpa melakukan apa-apa
  • menekan ctr+csama dengan menjalankan%run; %exit
  • skrip menyimpan perintah yang dieksekusi ke file yang dipanggil git.historydalam folder yang sama dengan skrip
  • Anda dapat menambahkan beberapa perintah dalam satu baris menggunakan tanda titik koma
  • Anda dapat menggunakan kata kunci gitdi awal perintah dan skrip tidak akan menggandakannya ( EG: git init tidak menjadi git git init)

Contoh perintah:

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

Informasi tambahan (untuk pengguna Linux):

Jika mau, Anda dapat menghapus .pyekstensi dan mengubahnya menjadi yang dapat dieksekusi menggunakan:

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

Maka alih-alih memanggil skrip seperti ini:

python3 git.py

Anda malah menjalankan ini:

./git

Informasi tambahan (untuk orang malas):

Jika Anda malas dan tidak ingin mengetik, ./maka Anda dapat memindahkan skrip ini ke /bin/folder Anda dan membuat alias untuk itu.

Jika Anda benar- benar malas, gunakan perintah berikut:

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

Jika Anda benar- benar malas, salin dan tempel satu baris berikut:

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

Jika kemalasan Anda telah mencapai tingkat yang sebelumnya tidak diketahui oleh manusia, berikut adalah versi yang lebih ringkas dari satu kalimat yang sama:

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

Semoga berhasil.

LogicalBranch
sumber
17

Pendekatan lain yang akan bekerja dengan perintah apa pun: gunakan Ctrl + R (reverse-i-search).

Reverse-i-search memungkinkan Anda untuk mencari riwayat perintah Anda. Ulangi Ctrl + R setelah menekan string pencarian Anda untuk mengulangi pencarian lebih jauh ke belakang dengan string yang sama.

Anda hanya perlu mengetikkan perintah sekali, maka Anda dapat memanggil kembali perintah itu dari setiap substring dari perintah. Dalam kebanyakan kasus, Anda dapat mengingat seluruh perintah yang sangat panjang dan berbagai variannya hanya dengan dua hingga tiga huruf pencarian yang ditempatkan dengan baik. Tidak ada prakonfigurasi yang dibutuhkan selain menggunakan shell Anda secara normal dan itu adalah adaptasi sendiri terhadap bagaimana Anda menggunakan shell, cukup ketik perintah penuh sekali dan perintah akan secara otomatis ditambahkan ke riwayat perintah Anda.

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

Selain itu, Ctrl-R bekerja tidak hanya pada bash, tetapi banyak program yang menggunakan pustaka readline (dan ada banyak di antaranya), seperti shell Python, IPython, shell mysql, shell psql, irb (ruby), dll.

Lie Ryan
sumber
15

Dalam contoh Anda, Anda membandingkannya dengan prompt MySql. Cara kerjanya adalah proses MySql dimulai, dan Anda memberikan perintah kepada proses itu. Karena itu, mengapa tidak menulis yang serupa dalam bahasa pilihan Anda? Berikut ini contoh sederhana dalam 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;
}

Harap dicatat bahwa saya baru saja menulisnya dari memori dan saya tidak memeriksanya dengan kompiler. Mungkin ada kesalahan sintaksis sepele.

john01dav
sumber
Hanya pikiranku saja. Siapa pun di Stack Overflow harus dapat mengkodekan program semacam itu sendiri. Bahasa pemrograman tidak terlalu penting.
Thomas Weller
@ ThomasWeller saya setuju. Saya memposting program untuk secara tepat menunjukkan apa yang saya bicarakan, bukan karena itu adalah program yang sulit untuk ditulis.
john01dav
9
Anda akan menginvestasikan banyak waktu dengan pendekatan ini jika Anda ingin program bebas bug dan memiliki sejumlah fitur yang layak. Misalnya, setelah memperbaiki kegagalan build awal (std :: system () ingin const char *) Anda akan melihat bahwa ada loop tak terbatas pada EOF. Anda mungkin ingin riwayat / dukungan readline, penyelesaian tab, beberapa bawaan untuk mengubah direktori / set env vars / shell out / ..., dll. Jika ada perangkat lunak yang ada (seperti gitsh dalam kasus ini), mengapa tidak menggunakannya?
nomadictype
1
@nomadictype Itu kritik yang valid, tetapi mempelajari perangkat lunak lain juga merupakan komitmen waktu. Keuntungan dengan pendekatan ini adalah bahwa hanya beberapa menit yang diperlukan untuk membuatnya bekerja, dan thst akan melakukan persis apa yang Anda harapkan atau inginkan (dengan perubahan).
john01dav
2
Hilangnya readline, pengeditan baris, dukungan riwayat, bisa menjalankan perintah sederhana seperti ls, dll akan dikenakan biaya lebih banyak daripada empat penekanan tombol atau jadi Anda menyimpannya dengan ini.
Lie Ryan
13

Untuk hal-hal dasar, Anda dapat melakukan:

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>

Keluar dengan ctrl + c

Umur Kontacı
sumber
2
Gagasan yang layak, namun ada dua masalah. Satu, ;after do mengarah ke bash: syntax error near unexpected token ; '' Kedua, evalbagian itu rentan terhadap kerentanan. Sebagai contoh, perhatikan apa yang terjadi jika saya mengetikkan status;cat /etc/passwdshell kecil ini. Contoh yang tidak berbahaya, tetapi Anda mendapatkan ide apa yang bisa terjadi. Anda dapat menyederhanakannya menjadi while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";doneIni tentu saja bukan bukti peluru, tetapi 1 - itu lebih sederhana dan 2 - menghindari eksekusi perintah non-git (berdasarkan tanda kutip ganda). Tidak ideal, hanya sedikit lebih baik
Sergiy Kolodyazhnyy
@Abigail Lucu :) Kenapa ya, shell itu sendiri bukan aplikasi yang paling aman. Bahkan mem-file file bisa menjadi masalah. Namun, intinya saya awalnya adalah bahwa kita tidak melihat penerjemah mysql mengeksekusi perintah shell, bukan tanpa systematau \!setidaknya pada awalnya. Di mana asumsinya mungkin bahwa "repl" ini menjalankan gitperintah saja, sebenarnya memungkinkan lebih dari itu.
Sergiy Kolodyazhnyy
@Abigail saya tidak takut, karena saya tahu apa fungsinya. Orang lain yang tidak - mungkin akhirnya melanggar sesuatu yang seharusnya tidak mereka lakukan. Dan lagi - eval bukan ide terbaik untuk menjalankan perintah, terutama ketika input yang dikontrol pengguna terlibat.
Sergiy Kolodyazhnyy
Memperbaiki kesalahan ketik sesudahnya do. Terima kasih! re: security: Ini jelas tidak dimaksudkan untuk didistribusikan sebagai aplikasi terpisah. Masukkan saja .bash_profilejika Anda tidak suka mengetik git. Saya tidak terlalu khawatir tentang hal itu menjadi "tidak aman". Jika Anda menempelkan hal-hal di bash Anda yang tidak Anda mengerti (termasuk skrip oneliner ini), Anda akan memiliki waktu yang buruk. Saya suka ini karena sederhana, mudah ditulis dan mudah dibaca, dan mudah diperbaiki.
Umur Kontacı
2

Ketika saya menggunakan Windows 7 dengan Conemu, saya menambahkan yang berikut ini ke skrip startup lingkungan dev saya:

doskey g=git $*

Dengan ini, saya bisa menggunakan gperintah alih-alih mengetik git. Terakhir saya mencoba dengan Windows 10 dan Conemu, tidak berhasil, ada bug, saya pikir, tapi patut dicoba.

Adamsan
sumber
2

Gunakan editor kurung, mudah untuk menggunakan kode Anda dan perintah git, juga memiliki banyak fitur.

masukkan deskripsi gambar di sini

Di sudut kanan atas ikon binokular kedua digunakan untuk menginstal ekstensi.

masukkan deskripsi gambar di sini

Cari ekstensi brackets gitseperti gambar di atas dan instal.

masukkan deskripsi gambar di sini

Kembali ke sudut kanan atas akan muncul ikon keempat, jadi klik dan lihat perubahan seperti gambar di atas.

Jika Anda ingin memasang tanda kurung, gunakan perintah berikut:

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

Untuk informasi lebih lanjut, Anda dapat membaca: Cara Menginstal Editor Kode Kurung di Ubuntu dan Linux Mint di Ubuntupit .

akash
sumber