Her Git komutunun başında “git” yazmayı nasıl önleyebilirim?


190

gitHer Git komutunun başına kelimeyi yazmaktan kaçınmanın bir yolu olup olmadığını merak ediyorum .

"Git moduna"git girmek için komut istemini açtıktan sonra komutu yalnızca bir kez kullanmanın bir yolu olsaydı iyi olurdu .

Örneğin:

git>

Bundan sonra yazdığımız her komut varsayılan olarak Git komutu olarak yorumlanır.

Veritabanı komutları yazmak için MySQL kabuğunu nasıl kullandığımıza benzer bir şekilde:

mysql>

Bu beni gitgünde yüzlerce kez yazmak zorunda kalmayacak .

NOT:git-bash Windows'ta kullanıyorum .


87
Konu dışı olduğu için kapatmaya oy verenler için, lütfen tıkladığınız metni okuyun: "Genel bilgi işlem donanımı ve yazılımı hakkındaki sorular, doğrudan programlama için kullanılan araçları içermedikçe Yığın Taşması için konu dışıdır. . " Git, programcılar tarafından kullanılan bir araçtır. Bu sitede kendi etiketi olduğu gerçeği ile kanıtlandığı gibi.
JBentley

5
Neden "git" yazıyorsunuz? IDE'niz bir tuşa basarak güçlü vcs entegrasyonlarına sahip olmalıdır. Günde 50 kez "git pull"
yazmayı

8
@vikingsteve Pratikte tüm git yardım ve bilgeliği komut satırı olarak verilir.
Ed Randall

6
@vikingsteve Çok yazıyorum çünkü daha hızlı. ~ 100wpm yazıyorum, daha çok Git tuşuyla olduğum gibi tuş basımlarına aşinaysam; GUI'lere tıklamakla karşılaştırıldığında, sadece daha kolaydır. Favori IDE'nizde klavye kısayolları olabilir. Bu senin için iyi. Neden olur ben onları öğrenmeye zaman harcamak zaman <M-Tab> git vesaire <CR> benim kas hafızasına zaten?
Monica'nın Davası

3
"Bu soru kapatılmalıdır, çünkü kullanıcı mantıklı olmayan bir soru soruyor" olmalıdır - sorduğunuz şeyi alıyorum, ancak kabuk " git command "yazmanın bir yolu olsaydı.
user3728501

Yanıtlar:


190

Gitsh'i denemek isteyebilirsiniz . Benioku dosyalarından:

gitshProgram Git için interaktif kabuktur. İçinden gitshsize bile yerel adlar ve yapılandırmayı kullanarak, herhangi git komutu verebilir.

  • Git komutları gruplar halinde gelir. gitÖzel bir git kabuğu içinde çalıştırarak tekrar tekrar yazmaktan kaçının :
sh$ gitsh
gitsh% status
gitsh% add .
gitsh% commit -m "Ship it!"
gitsh% push
gitsh% ctrl-d
sh$

Ya da orada bağlantılı diğer projelere bir göz atın:

  • git-sh - Git istemi, takma adlar ve tamamlama içeren özelleştirilmiş bir bash kabuğu.
  • gitsh - Perl ile yazılmış basit bir Git kabuğu.
  • repl - Herhangi bir programı bir REPL'de alt komutlarla sarar.

Not: Bunu kendim kullanmadım.


22
grumble ... repl(1)bir REPL değil. Hiçbir şey değerlendirmez veya yazdırmaz. Programları çalıştırır.
Kevin

11
@Kevin Kullanıcı isteklerini okur, kullanıcı isteğini değerlendirir (bir program çalıştırarak) ve programın çıktısını yazdırır. Kabuklar da bunu yapar.
Yakk - Adam Nevraumont

2
@ Yakk-AdamNevraumont: Hayır, kesinlikle “programın çıktısını basmıyor”. Bu terminale programın stdout'u kanca ve sonra programı kendi çıktıyı baskı - Programın stdout'u zaten (üzerine otomatik miras terminali için bağladım hariç fork()/ ' exec()), bu yüzden repl(1)bile çıkmıyor o .
Kevin

6
Ben senin neler hissettiğini anlamak @Kevin Ancak REPL sıkı tanımı dışlayacak en tercüman “repl” çeşitli dillerde bu. Sadece saf işlevsel dillerde değerlendirmenin hiçbir yan etkisi olmadığından emin olabilirsiniz, ancak Haskell'de bile “REPL” GHCi varsayılan olarak IOeylemleri kabul eder ve bunları terminale bağlı ekrana yazdırma gibi yan etkiler de dahil olmak üzere yürütür.
leftaroundabout

2
@ Kevin repltek başına bir REPL değildir; replyalnızca etkileşimli bileşen olan bir REPL sistemi oluşturmanın bir yoludur . Adil mi?
Kyle Strand

116

Bunu yapacak bir Perl tek astarı:

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

Bu, ön eki yazdığınız her şeyi yürütür git. Ve vuruncaya kadar bunu yapmaya devam edecek ^D.


6
Bu gerçekten OP'nin istediği şeye çok benziyor ve çok hafif bir pakette!
ruohola

2
Eğer readline ile çalışsaydı bu mükemmel olurdu ama maalesef (şaşırtıcı değil, çünkü bu kesinlikle Perl -nebayraklarının etrafında bir hack olduğu için ).
Konrad Rudolph

11
@KonradRudolphperl -MTerm::ReadLine -E '$n = Term::ReadLine -> new ("git"); while ($_ = $n -> readline ("git > ")) {system "git $_"}'

57

Bu tam olarak istediğiniz şey değil, ancak ~/.bashrcen sık kullandığınız Git komutları için bazı kabuk takma adları ayarlayabilirsiniz :

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

Ayrıca Git'in içinde takma adlar oluşturabileceğinizi de unutmayın:

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

Bu , git ciyerine yazmanızı git commitvb. Sağlar.


7
Bu yaklaşımın dezavantajı, her Git komutu için ayrı bir takma ad oluşturulması gerektiğidir.
Tim Biegeleisen

22
Sadece en sık kullanılanlar için. Yani, ne sıklıkla kullanıyorsun git hash-objectya da git interpret-trailers? Bunu sadece bir alternatif olarak sunuyorum çünkü bildiğim kadarıyla sorunun sorması gerçekten yok.
Thomas

15
Ek olarak ciiçin commitben de bir kabuk takma ad kullanmak giçin git, bu yazım çoğu azaltır ve benim tercih kabuk olmasını sağlar.
rkta

32

GitBash'im için ~ / .bash_profile içinde takma ad kullanmanın büyük bir hayranıyım. Bu yaklaşıma giderseniz, favorilerimden bazıları:

# 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
taahhüt: P
qwr

14
Ben dahil değildir commitya pushben (ederken yazarak) fazladan birkaç saniye istiyorum çünkü emin bir şey yok değilim olmak
JacobIRR

3
Zorlama ve itme, zorla itme kullanmadığınız sürece hiçbir şeyi yok etmemelidir. Ama git durumunu önceden kullanmaya çalışıyorum.
qwr

1
Ben de bunu yaptım +1. Ben gitsh denemek çeliyor rağmen diğer cevaplar söylediğim gibi
CoffeeTableEspresso

1
@CoffeeTableEspresso Birkaç tuş vuruşunun güncellemeleri kaydetmek ve bir projeyi yok etmek arasındaki fark olduğunu kabul ettiğiniz gerçeğine saygı duyuyorum.
LogicalBranch

31

Editörünüzü kullanın.

commitEn sevdiğiniz editörden vs code gibi komutu yazın ve git ile daha verimli olun:

resim açıklamasını buraya girin

Veya gittüm komutları almak için yazın :

resim açıklamasını buraya girin


13
Tüm bu aşağı oylara şaşırdım. Bu, bu özellikleri destekleyen IDE kullanan kişiler için korkunç bir yanıt değildir.
Glen Pierce

4
Bence insanlar aşağı oy kullandılar çünkü herkes VS-Code kullanmıyor / beğenmiyor. Her iki durumda da bence iyi bir çözüm benden +1.
LogicalBranch

4
@LogicalBranch, insanlar genellikle komut satırından git kullanıyor ve bunun farkındayım, ancak bazı editörlerin içindeki git desteği var ve denemeye değer.
prosti

1
Herkes bu VS kodu (kişisel olarak sevmiyorum) kullanmıyor, çünkü bu cevap sevmiyorum, ama bu onu kullanmak ppl için güzel bir çözüm olduğu için downvote olmaz.
CoffeeTableEspresso

1
@CoffeeTableEspresso, yüce kullanıyorsanız, gitsavvy adlı bir eklenti var, vb ... Hemen hemen her editör git için bir çeşit desteğe sahip. "Düzenleyicinizi kullanın" bölümünü okuyabileceğiniz gibi, bu sorunun cevabıydı.
prosti

26

Bir arkadaşım bunu başaran küçük bir bash senaryosu yaptı. Adı 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
Tamam, bundan Umur'un cevabında bahsetmiştim, ancak evalorijinal kod kaynağında kullanımı en iyi fikir değil. Arkadaşınıza while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";donebunun yerine kullanmasını söyleyin
Sergiy Kolodyazhnyy

23

İşte başka bir yol. Aynı zamanda ne istendiğini de değil, ama bir süredir kullanıyorum ve oldukça güzel. Aşağıdaki satırı ekleyin ~/.bashrc:

complete -E -W git

Şimdi boş bir Bash isteminde Tab tuşuna basıldığında "git" yazılır.


5
Başka bir kabuk kullanıyorsanız, bunu uygun dosyaya koymanız gerektiğini unutmayın. Örneğin, zsh için, onu koyacaksınız ~/zshrc, tcsh için, koyacaksınız ~/tcshrc, vb.
TheOnlyMrCat

20

Bunun çok geç cevap biliyorum ama zaten çünkü bu soru beni gerçekten bir not vurdu uğraşan şimdi ise oldukça için tekrarı bu tür acı.

Senin hakkında emin değilim ama dürüst yok (Tekrar DEĞİL DO her için takma ad oluşturmak istiyorum) gitkomutu, bunun yerine adında bir piton senaryoyu yazdım NoGit bu sorunu çözmek için:

#!/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 , "git" anahtar kelimesinin gereksiz tekrarını önlemek için basit bir python betiğidir.

Belgeler:

  • %undoKomut yığınından son komutu kaldırır
  • %runKomut yığınında komutları çalıştırır ve yığını temizler
  • %exitKomut şey yapmadan CLI kapatır
  • basmak ctr+ckoşu ile aynı%run; %exit
  • komut dosyası, komut dosyasıyla git.historyaynı klasörde çağrılan bir dosyaya yürütülen komutları kaydeder
  • noktalı virgül kullanarak bir satıra birden fazla komut ekleyebilirsiniz
  • anahtar sözcüğü gitkomutun başlangıcında kullanabilirsiniz ve komut dosyası çoğaltmaz ( EG: git init oluşmaz git git init)

Örnek komutlar:

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

Ek bilgiler (Linux kullanıcıları için):

İsterseniz .pyuzantıyı kaldırabilir ve aşağıdakileri kullanarak bir yürütülebilir dosyaya dönüştürebilirsiniz:

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

Sonra betiği şöyle çağırmak yerine:

python3 git.py

Bunun yerine şunu çalıştırırdınız:

./git

Ek bilgiler (tembel insanlar için):

Tembelseniz ve bir yazmak istemiyorsanız, ./bu komut dosyasını /bin/klasörünüze taşıyabilir ve bunun için bir takma ad oluşturabilirsiniz.

Eğer konum gerçekten gerçekten tembel, aşağıdaki komutları kullanın:

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

Eğer konum gerçekten, gerçekten, gerçekten tembel, kopyalama ve aşağıdaki tek astar yapıştırın:

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

Tembelliğiniz daha önce insanlık tarafından bilinmeyen seviyelere ulaştıysa, işte aynı tek astarın daha kompakt bir versiyonu:

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

İyi şanslar.


17

Herhangi bir komutla çalışacak başka bir yaklaşım: Ctrl + R (ters-i-arama) kullanın.

Ters-i-arama, komut geçmişinizi aramanızı sağlar. Aynı dizeyle aramayı tekrarlamak için arama dizenize bastıktan sonra Ctrl + R tuşlarını tekrarlayın.

Bir komutu yalnızca bir kez yazmanız yeterlidir, daha sonra bu komutu komutun herhangi bir alt dizesinden geri çağırabilirsiniz. Çoğu durumda, sadece iki ila üç iyi yerleştirilmiş arama harfiyle çok uzun komutların tamamını ve bunların çeşitli varyantlarını hatırlayabilirsiniz. Kabuğunuzu normal şekilde kullanmak dışında herhangi bir ön yapılandırmaya gerek yoktur ve kabuğu nasıl kullandığınıza kendiniz uyarlanır, tam komutu bir kez yazmanız yeterlidir; komutlar otomatik olarak komut geçmişinize eklenir.

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

Dahası, Ctrl-R sadece bash üzerinde değil, Python kabuğu, IPython, mysql kabuğu, psql kabuğu, irb (yakut) vb.Gibi readline kütüphanesini kullanan (ve birçoğu var) birçok programda çalışır.


15

Örneğinizde, bunu bir MySql istemiyle karşılaştırırsınız. Çalışma yöntemi bir MySql işleminin başlaması ve komutlarınızı bu işleme vermenizdir. Bu nedenle, neden kendi dilinizde benzer bir şey yazmıyorsunuz? İşte C ++ ile basit bir örnek:

#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;
}

Lütfen bunu hafızadan yazdığımı ve bir derleyici ile kontrol etmediğimi unutmayın. Önemsiz sözdizimi hataları olabilir.


Sadece düşüncem. Stack Overflow'daki herkes böyle bir programı kendisi kodlayabilmelidir. Programlama dili gerçekten önemli değil.
Thomas Weller

@TomasWeller Kesinlikle katılıyorum. Ne yazmak istediğimi tam olarak göstermek için programı yayınladım, çünkü yazmak zor bir program değil.
john01dav

9
Programın hatasız olmasını ve yeterli sayıda özelliğe sahip olmasını istiyorsanız, bu yaklaşımla çok zaman harcayacaksınız. Örneğin, ilk derleme hatasını düzelttikten sonra (std :: system () const char * istiyor) EOF üzerinde sonsuz bir döngü olduğunu fark edeceksiniz. Geçmiş / okuma satırı desteği, sekme tamamlama, bazı yerleşiklerin dizin / set env vars / shell out / ... vb. Değiştirmesini isteyebilirsiniz. Var olan bir yazılım varsa (bu durumda gitsh gibi), neden kullanmıyorsunuz?
nomadictype

1
@nomadictype Bu geçerli bir eleştiri, ancak diğer yazılımları öğrenmek de bir zaman taahhüdü. Bu yaklaşımın avantajları, çalışmasını sağlamak için sadece birkaç dakikaya ihtiyaç duyulmasıdır ve bu da tam olarak beklediğiniz veya istediğinizi (değişikliklerle) gerçekleştirecektir.
john01dav

2
Readline kaybı, satır düzenleme, geçmiş desteği, ls gibi basit komutları çalıştırabilme, size dört tuş vuruşundan çok daha pahalıya mal olacak.
Yalan Ryan

13

Temel şeyler için şunları yapabilirsiniz:

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 ile çık


2
İyi fikir, ancak iki sorun var. Birincisi, ;sonra yapmak bash: syntax error near unexpected token ; '' İkincisi, bu evalkısım güvenlik açıklarına eğilimlidir. Örneğin, status;cat /etc/passwdbu küçük kabuğa yazdığımda ne olacağını düşünün . Zararsız örnek, ancak ne olabileceği fikrini alırsınız while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";done. İdeal değil, sadece biraz daha iyi
Sergiy Kolodyazhnyy

@Abigail Funny :) Neden evet, kabuğun kendisi en güvenli uygulama değil. Hatta bir dosya catting bir sorun olabilir. Bununla birlikte, başlangıçta bahsettiğim nokta, mysql yorumlayıcısının kabuk komutlarını yürüttüğünü görmemiz, en azından başlangıçta systemveya \!başında değil . Bu "repl" gitin yalnızca komutları yürüttüğü varsayımı , aslında bundan daha fazlasına izin verir.
Sergiy Kolodyazhnyy

@Abigail Korkmuyorum, çünkü bunun ne yaptığını biliyorum. Yapmayanlar - yapmamaları gereken bir şeyi kırabilir. Ve yine - eval özellikle kullanıcı kontrollü girdi söz konusu olduğunda, komutları çalıştırmak için en iyi fikir değildir.
Sergiy Kolodyazhnyy

Sonra yazım hatası düzeltildi do. Teşekkürler! re: güvenlik: Bunun ayrı bir uygulama olarak dağıtılması amaçlanmamıştır. Tek yapmanız gereken koymak .bash_profilesize yazarak git gibi yoksa. Bunun "güvensiz" olduğu için fazla endişelenmiyorum. Bash'inize anlamadığınız şeyleri yapıştırırsanız (bu oneliner betiği de dahil olmak üzere), kötü bir zaman geçireceksiniz. Bunu seviyorum, çünkü basit, yazması kolay ve okunması kolay ve geliştirmesi kolay.
Umur Kontacı

2

Conemu ile Windows 7 kullandığımda, dev ortamı başlangıç ​​komut dosyasına aşağıdakileri ekledim:

doskey g=git $*

Bununla, sadece gyazmak yerine komutu kullanabilirsiniz git. Son olarak Windows 10 ve Conemu ile denedim, işe yaramadı, bir hata var, sanırım, ama denemeye değer.


2

Bir parantez editörü kullanın, kodunuzu ve git komutlarınızı kullanmak kolaydır, ayrıca birçok özelliğe sahiptir.

resim açıklamasını buraya girin

Sağ üst köşeye uzantıları yüklemek için ikinci dürbün simgesi kullanılır.

resim açıklamasını buraya girin

brackets gitYukarıdaki resimdeki gibi uzantı arayın ve yükleyin.

resim açıklamasını buraya girin

Yine sağ üst köşede dördüncü simgeyi göstereceğiz, bu yüzden sadece yukarıdaki resimde olduğu gibi tıklayın ve değişiklikleri görün.

Köşeli ayraç takmak istiyorsanız, aşağıdaki komutları kullanın:

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

Daha fazla bilgi için okuyabilir: Ubuntu Parantez Kodu Editör ve Linux Mint nasıl yüklenir üzerinde Ubuntupit .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.