Bagaimana saya bisa membuat alias untuk perintah git [aksi] (yang termasuk spasi)?

29

Sebagian besar alias saya adalah dalam bentuk ini: alias p='pwd'

Saya ingin alias git commitsehingga tidakgit commit -v

Tetapi mencoba membuat alias dengan spasi memberikan kesalahan:

$ alias 'git commit'='git commit -v'
-bash: alias: `git commit': invalid alias name
Michael Durrant
sumber

Jawaban:

31

Bukan jawaban langsung untuk pertanyaan Anda (karena alias hanya bisa satu kata), tetapi Anda harus menggunakan git-config:

git config --global alias.civ commit -v

Ini menciptakan alias git sehingga git civberjalan git commit -v. Sayangnya, AFAIK tidak ada cara untuk mengganti perintah git yang ada dengan alias . Namun, Anda selalu dapat memilih nama alias yang cocok untuk ditinggali sebagai alternatif.

jw013
sumber
Lihat catatan yang ditambahkan untuk menjawab tentang git configtidakgit-config
Michael Durrant
Sebagai jawaban ini ke thread yang terkait merek jelas, itu adalah mungkin untuk mengesampingkan ada gitperintah dengan alias, dengan hanya sedikit script shell. (Saya tidak memposting komentar ini sebagai kritik, BTW. Jawaban itu diposting hampir setahun setelah Anda! Saya hanya mempostingnya dengan harapan orang-orang akan merasa
terbantu
17

Anda sedang berbicara tentang perintah yang termasuk spasi, tetapi di sini perintah itu gitdan tidak ada ruang di sana.

Untuk memanggil perintah git commit , Anda harus menulisnya

git\ commit ...
'git commit' ...
"git commit" ...

Umumnya perintah tidak memiliki ruang dalam nama mereka karena alasan itu rumit untuk memanggil mereka dalam shell, jadi saya tidak berpikir Anda akan menemukan perintah seperti itu di sistem Anda.

csh, tcsh atau zsh akan memungkinkan Anda untuk alias salah satu dari yang di atas, tetapi tidak bash atau ksh (meskipun pdksh akan memungkinkan Anda tetapi Anda tidak akan membiarkan Anda menggunakannya). Dalam zsh:

alias "'git commit'=git commit -v"
'git commit' ...

Akan membuat git commandperintah (ketika dipanggil hanya 'git command'(dengan tanda kutip tunggal)) alias untuk gitperintah dengan commitdan -vargumen. Tidak apa yang Anda cari, saya kira.

Karena aliashanya bisa alias perintah , yang Anda bisa alias di sini adalah gitperintah, dan Anda perlu alias untuk sesuatu yang memasukkan "-v" setelah "komit" di daftar argumennya. Yang terbaik adalah menggunakan solusi @ jw013 tetapi jika karena alasan tertentu Anda tidak bisa atau tidak, alih-alih menggunakan alias, Anda bisa menggunakan fungsi untuk melakukan pekerjaan:

git() {
  if [ "$1" = commit ]; then
    shift
    set -- commit -v "$@"
  fi
  command git "$@"
}
Stéphane Chazelas
sumber
3
Perhatikan bahwa membolehkan alias dengan spasi atau karakter khusus lainnya adalah fitur csh yang tidak ada di shell gaya Bourne (yang zsh emulasi dengan cara yang aneh). Kerang gaya Bourne menonaktifkan alias ekspansi ketika kata pertama dikutip dengan cara apa pun, lihat jawaban Renan .
Gilles 'SO- stop being evil'
Iya nih. Itu sebabnya saya katakan itu hanya bekerja di csh, tcsh dan zsh yang tidak memiliki bug itu. Perhatikan bahwa shell Bourne tidak mendukung alias. Alias ​​diperkenalkan oleh csh.
Stéphane Chazelas
9

Di Bash Anda tidak bisa membuat alias untuk untuk perintah dengan spasi kosong di dalamnya.
Namun, saya menggunakan fungsi berikut di .bashrc saya sebagai solusinya.

sudo() { if [[ $@ == "pacman -Syu" ]]; then command pacup.sh; else command sudo "$@"; fi; }

Cara kerjanya adalah: Anda mulai dengan perintah yang ingin Anda panggil. Dalam kasus saya itu sudo.
Kemudian, Anda menyebutkan parameter apa yang diperlukan. Dalam hal ini pacman -Syu,.
Jika, dipicu, perintah apa yang harus dijalankan? Dalam pernyataan di atas itu pacup.sh.
Lain, perintah apa yang harus dieksekusi sudo $@,. $@adalah, seperti yang akan Anda tebak oleh, daftar parameter yang diambil oleh perintah.

Jadi, membuat perintah untuk kasus khusus Anda, itu akan menjadi:

git() { if [[ $1 == "commit" ]]; then command git commit -v; else command git "$@"; fi; }

Namun, solusi ini adalah untuk kasus yang lebih umum ketika Anda ingin alias perintah dengan spasi putih di dalamnya.
Dalam kasus spesifik Anda, saya akan merekomendasikan Anda pergi dengan solusi jw013 untuk alias menggunakan perintah git Andagit-config

darnir
sumber
Bukankah maksud Anda if [[ $1 == 'commit' ]]...? Ekspansi $ @ mungkin memiliki lebih banyak argumen untuk komit yang sebenarnya ingin Anda pertahankan.
kojiro
Kanan! Buruk saya .. Saya hanya mengubah pernyataan yang saya gunakan untuk sistem saya.
darnir
Ini luar biasa - terima kasih - sempurna untuk apa yang saya butuhkan;
cgseller
4

Dari halaman bash alias man

Kata pertama dari setiap perintah sederhana, jika tidak dikutip, diperiksa untuk melihat apakah ada alias. Jika demikian, kata itu diganti dengan teks alias. Nama alias dan teks pengganti mungkin mengandung input shell yang valid, termasuk karakter meta shell, dengan pengecualian bahwa nama alias mungkin tidak mengandung `= '.

Kata pertama dari teks pengganti diuji untuk alias, tetapi kata yang identik dengan alias yang diperluas tidak diperluas untuk kedua kalinya. Ini berarti bahwa seseorang mungkin alias ls ke "ls-F", misalnya, dan Bash tidak mencoba memperluas teks pengganti secara rekursif.

Jadi, karena hanya kata pertama yang diperiksa, Anda tidak dapat memiliki alias dengan banyak kata. Dalam pertanyaan Pengguna Super ini , solusi yang menggunakan fungsi disediakan:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

Itu bisa disesuaikan dengan git.

Renan
sumber
Tautan yang Anda berikan berbeda dari dokumentasi bash yang saya miliki dan tampaknya bertentangan dengan perilaku bash. Dikatakan di atas bahwa spasi misalnya diizinkan dalam nama alias. Itu lebih mirip perilaku zsh bagi saya bahkan jika halaman itu secara eksplisit mengatakan bash.
Stéphane Chazelas
2
@sch Bourne / POSIX shells bypass alias expansion jika sebuah kata dikutip dengan cara apa pun. Misalnya \lsmemintas alias untuk ls.
Gilles 'SO- stop being evil'
1
@Gilles. Shell Bourne tidak mengimplementasikan alias. POSIX mengatakan kata yang tidak dikutip yang cocok dengan nama alias yang valid (hanya ASCII alnum + [_!%,@]) harus diperluas. Itu tidak melarang ekstensi seperti aliasing zsh dari '\ ls', atau aliasing ksh / dash / bash / zsh a-bjika tidak, tidak akan ada shell POSIX tunggal. Itu hanya mengatakan skrip portabel (bukan shell) tidak boleh menggunakan alias semacam itu.
Stéphane Chazelas
2
@sch POSIX memungkinkan implementasi untuk menggunakan karakter lain dalam alias tetapi mengutip setiap bagian dari kata menghambat ekspansi alias . Jika Anda menulis 'git commit'dalam posisi perintah dalam shell POSIX, ia harus menjalankan utilitas bawaan, fungsi, atau perintah eksternal.
Gilles 'SO- stop being evil'
0

Meskipun solusi yang benar adalah dengan menggunakan alias seperti yang disarankan jw013, untuk membuat alias dengan spasi Anda dapat membuat NEST alias.

Sebagai contoh, saya memiliki alias untuk menghapus cabang baik secara lokal maupun jarak jauh, tetapi saya ingin pengguna selalu menentukan cabang:

remrem = "!sh -c 'if [ $# -ne 1 ]; then git specBranch; else git push origin :$1 && git branch -d $1; fi' -"

#echoing aliases
specBranch = "!sh -c 'echo Specify branch please!'" 
Empus
sumber
-1

Dari contoh ini , ini seharusnya berfungsi:

Jadi, jika Anda masih ingin menggunakan sudo dengan perintah lain tetapi tidak dengan shutdown dan jika Anda mampu melakukan alias shutdown ke sesuatu yang lain, Anda dapat memiliki:

alias sudo='sudo '
alias shutdown="echo nope"

Tetapi dengan perintah Anda:

alias git='git '
alias commit="commit -v"
Pureferret
sumber