Bagaimana cara alias 'git' ke 'g' sehingga aturan bash-completion dipertahankan?

25

Jika saya melakukan ini:

alias g='git'

Saya kehilangan semua aturan penyelesaian (mis. Cabang dan remote tidak lagi diselesaikan secara otomatis ketika saya menekan TAB setelah mengetik, misalnya g push o).

Paweł Gościcki
sumber
Meskipun saya tidak punya jawaban untuk Anda, saya harus mengambil waktu sebentar dan bertanya-tanya apakah tidak mengetik kedua surat itu benar-benar memberi Anda banyak keuntungan?
Marco Ceppi
4
Tentu ya! Saya mengetik 'g' mungkin lebih dari 100 kali sehari.
Paweł Gościcki
3
Mengasingkan perintah pendek yang sering digunakan untuk alias lebih pendek menghemat saya ratusan penekanan tombol sehari. Menurut riwayat shell saya, saya telah menggunakan alias g=git756 kali dalam sebulan terakhir, yang berarti saya menghemat menekan tombol 'g' dan 'i' total 1512 kali. Itu, dikombinasikan dengan alias git saya, mungkin menyelamatkan saya dari puluhan ribu penekanan tombol sebulan.
Poin utama memperpendek penekanan tombol adalah membantu tangan Anda mengikuti perkembangan otak Anda.
Tyler Collier
Script di superuser.com/questions/436314/... bekerja dengan baik, saya pikir itu layak disebut.
brandizzi

Jawaban:

21

Menyalin dan memodifikasi dari /etc/bash_completion.d/git, tambahkan baris berikut ke Anda ~/.bashrc:

complete -o bashdefault -o default -o nospace -F _git g 2>/dev/null \
    || complete -o default -o nospace -F _git g
enzotib
sumber
Ha! Wunderbar! Bekerja seperti yang seharusnya :)
Paweł Gościcki
1
Saya juga harus menambahkan source /usr/share/bash-completion/completions/git.bashrc
pcx
Tidak yakin apakah .bashrckode di sini berfungsi, tetapi jawaban ini pasti kedaluwarsa. /etc/bash_completion.d/gitsepertinya tidak ada pada 14.04. Lihat jawaban lzap di bawah ini.
Max Wallace
18

Penyelesaian bash-up terbaru pindah dan mengubah nama beberapa hal. Bersalju:

source /usr/share/bash-completion/completions/git
__git_complete g __git_main

Gunakan ini di versi terbaru Ubuntu (mis. 14.04, juga Fedora 22+) ketika Anda menjumpai:

completion: function `_git' not found

saat menyelesaikan.

lzap
sumber
2
Sepertinya ini adalah satu-satunya jawaban yang benar di sini.
pjvandehaar
Gunakan __git_complete gc _git_checkout(atau serupa) untuk mengatur penyelesaian untuk alias yang lebih spesifik. Cari /usr/.../gitseperti di atas untuk menemukan nama yang tepat.
Max Wallace
1
@ MaxWallace - ketika Anda mengatur alias untuk metode git tertentu di .gitconfig (mis. Gc = checkout), tidak perlu mengkonfigurasi penyelesaian secara eksplisit untuk mereka.
Piotr Aleksander Chmielowski
1
@PiotrAleksanderChmielowski Terima kasih! Tapi saya tidak berpikir itu berfungsi untuk alias bash tingkat atas (misalnya gc=> git checkout) yang bertentangan dengan alias cke checkoutdalam git, dan mengatakan git c. Koreksi saya jika saya salah.
Max Wallace
@ MaxWallace Ya, Anda benar, kesalahan saya;)
Piotr Aleksander Chmielowski
2

Pertama, cari perintah penyelesaian asli. Contoh:

$ complete | grep git

complete -o bashdefault -o default -o nospace -F __git_wrap__git_main git

Sekarang tambahkan ini ke skrip startup Anda (mis. ~ / .Bashrc):

# copy the original statement, but replace the last command (git) with your alias (g)
complete -o bashdefault -o default -o nospace -F __git_wrap__git_main g

# load dynamically loaded completion functions (may not be required)
_completion_loader git

The _completion_loadergaris mungkin tidak diperlukan. Tetapi untuk beberapa situasi, fungsi penyelesaian hanya dimuat secara dinamis setelah Anda mengetik perintah dan tekan TABpertama kali. Jadi, jika Anda belum menggunakan perintah asli, dan coba alias + TAB, Anda mungkin mendapatkan kesalahan seperti "bash: completion: function not found".

wisbucky
sumber
Bagus sekali. Bagi saya ini adalah jawaban yang benar, perintah grep pada complete berguna. Tidak perlu pemuat penyelesaian.
Paul Carlton
1

Cara yang diperbarui untuk melakukan ini (selesai tidak akan bekerja untuk saya):

  1. cd - beralih ke direktori home Anda
  2. wget https://raw.github.com/git/git/master/contrib/completion/git-completion.bash
  3. Tambahkan source ~/git-completion.bashke file .bashrc Anda (jika Anda tidak membuat file ini di folder home Anda, bash akan mencarinya secara otomatis)
  4. Tambahkan alias g='git'ke file .bashrc Anda.
  5. Mulai sesi baru atau sumber perubahan Anda dengan source ~/.bashrc
Elijah Lynn
sumber
2
Anda melewatkan bagian di mana mereka benar-benar menambahkan penyelesaian dalam komentar yang Anda __git_complete g _git
tautkan
0

Demi kelengkapan, saya ingin menambahkan jawaban menggunakan ~/.bash-completionfile, yang bersumber di akhir skrip bash-completion:

_xfunc git __git_complete g __git_main
_xfunc git __git_complete gl _git_log
_xfunc git __git_complete gd _git_diff
_xfunc git __git_complete gb _git_branch

Kemudian di saya, ~/.bashrcsaya hanya punya alias. Saya mencoba untuk:

  • hindari mencemari ~/.bashrcbarang-barang saya dengan menyelesaikan-bash (simpan barang-barang di tempatnya) ✓
  • hindari sumber seluruh penyelesaian-git ke dalam shell saya ☹

Bagaimanapun juga _xfuncsumber - sumber penyelesaian git. Saya akan memperbarui jawaban ini setelah saya mengetahui cara melakukannya dengan benar (saya juga bertanya pada makan siang di sini ).

kub1x
sumber
-1

Lihat di sini: https://gist.github.com/scue/576310b7c6b7714aad05

wget https://gist.github.com/scue/576310b7c6b7714aad05/raw/459d46761c231f5c373c1cf496920b01bb6669d2/.bash_aliases.git -O ~/.bash_aliases.git
echo "test -e ~/.bash_aliases.git && source ~/.bash_aliases.git" >> ~/.bashrc

Selamat Menikmati! (^ O ^) /

scue
sumber
1
Maaf, tapi itu sesuatu yang sangat berbeda. Membuat alias sederhana seperti itu untuk seluruh perintah adalah sepele.
Paweł Gościcki
Aku hanya membuat mereka bekerja seperti Plugin git dari Oh-My-Zsh: github.com/robbyrussell/oh-my-zsh/blob/master/plugins/git/...
scue
-1

Anda bisa mendefinisikan alias seperti biasa:

alias g='git'

Kemudian instal complete-alias untuk membuat bash completion alias-aware.

Cyker
sumber