Saya mencoba membuat alias yang menggunakan banyak perintah Git dan parameter posisi. Ada halaman Stackoverflow untuk masing-masing, dan akan tampak jelas menyakitkan untuk melakukan keduanya, tetapi saya mengalami masalah.
Sebagai contoh, saya ingin beralih ke foo cabang dan melakukan status. Jadi di saya .gitconfig
, saya punya:
[alias]
chs = !sh -c 'git checkout $0 && git status'
yang tidak bekerja Padahal hal seperti ini akan berhasil.
chs = !sh -c 'git checkout $0'
echoes = !sh -c 'echo hi && echo bye'
Wawasan apa pun akan dihargai.
Jawaban:
Ini akan berfungsi (diuji dengan zsh dan bash):
sumber
git chs foo
menjadigit checkout && git status foo
echo $1 && echo done
, ketika dipanggil dengan argumen 'foo', akan menampilkan "foo" dan "done foo".git
?!
berarti meneruskan semuanya ke shell. Jika tidak, itu mengasumsikan Anda mencoba menjalankan perintah git lain dan meneruskannya sebagai argumen kegit
biner.;:
bukan&& :
. Dan itu berfungsi dengan baik di unix juga.Ini menargetkan Windows batch / msysgit bash; mungkin tidak berfungsi di lingkungan lain.
Seperti yang dikatakan Olivier Verdier dan Lily Ballard
[alias] chs = !git checkout $1 && git status
hampir berhasil, tetapi memberikan penyisipan ekstra palsu dari argumen ...
git chs demo -> git checkout demo && git status demo
Tetapi jika Anda menambahkan
&& :
ke akhir alias Anda, maka argumen palsu dikonsumsi ke tag lokasi.Begitu
memberikan hasil yang benar ...
git chs demo -> git checkout demo && git status
sumber
&& :
emas dan membuat ini bekerja solusi untuk perintah di mana argumen ekstra akan bermasalah.&& :
?a=123;$a
kesalahan, tetapia=123; : $a
tidak. 2.: > hello.txt
mengosongkan hello.txt. 3.if [ "$a" = "hello" ];then : ;fi
berjalan baik-baik saja tetapi kesalahan tanpa ':'. Ini sepertipass
dalam python. 4.: this is a comment
, titik dua yang diikuti oleh ruang bekerja seperti#
pada baris komentar.co = !git checkout public/compiled && git checkout $1
dan ketika saya melakukannyagit co master
saya akan mendapatkan pesanerror: pathspec 'master' did not match any file(s) known to git.
. Saya tidak berpikir jawaban ini akan berguna bagi saya karena hal pertama yang disebutkan adalah Windows dan saya di Linux. Tapi Anda menjelaskan alasannya.Anda dapat mendefinisikan fungsi shell.
sumber
"
Saya dapat membuat alias git multi-line dan cukup kompleks. Mereka berfungsi dengan baik di Windows tetapi saya menganggap mereka akan bekerja di tempat lain juga, misalnya:
Saya menulis posting dan memiliki beberapa contoh lagi di sini .
sumber
!f() { : reset
untuk mendapatkan penyelesaian dari perintah atursumber
!
?!
tetapi sejauh yang saya dapat melihat git secara default akan menganggap bahwa alias adalah perintah git sehinggat = status
akan berfungsi. Namun jika Anda mencobanyat = git status
tidak akan berhasil (akan mengatakan perintah "git" tidak ditemukan). Sehingga di mana!
datang, ia memerintahkannya untuk menjalankan perintah seolah-olah itu adalah shell, dan biasanya Anda memerlukan ini ketika Anda memiliki beberapa perintah git per alias, sehingga Anda dapat memilikit = !git status && git log
misalnya dan itu akan berfungsi.Coba yang ini:
Sebut saja seperti ini:
git chs master
sumber
Dimungkinkan untuk memiliki multiline git alias dengan menambahkan
\
pada akhir setiap baris.sumber
"!git fetch --prune --all; git pull --rebase upstream master; git push origin master"
alias saya.Masalahnya di sini adalah bahwa parameter posisi tampaknya akan dikirim ke perintah shell dua kali (pada git 1.9.2). Untuk melihat apa yang saya maksud, coba ini:
Lalu, lakukan
git test this is my testing string
. Anda harus mengamati output berikut (dua baris terakhir diedit di sini untuk kejelasan):Salah satu cara untuk mengatasi ini adalah dengan
Ini akan menggunakan parameter posisi tambahan saat diterapkan pada perintah gema terakhir dan tidak berpengaruh pada hasil.
sumber