Git Alias ​​- Berbagai Perintah dan Parameter

182

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.

Stella
sumber
Alias ​​saya: git config --global alias.go '! Git commit -a && git pull --rebase && git push && git status'. Catatan: Gunakan kutipan sederhana.
Marcus Becker

Jawaban:

157

Ini akan berfungsi (diuji dengan zsh dan bash):

[alias] chs = !git checkout $1 && git status
Olivier Verdier
sumber
1
Tidak, tidak akan. Git akan berubah git chs foomenjadigit checkout && git status foo
Lily Ballard
24
Menarik, git sebenarnya mengisi variabel posisi sekarang dalam alias shell. Tapi itu masih rusak, karena itu juga menyerang mereka sebagai argumen. Alias echo $1 && echo done, ketika dipanggil dengan argumen 'foo', akan menampilkan "foo" dan "done foo".
Lily Ballard
7
Untuk apa tanda seru sebelumnya pada doa pertama git?
Elijah Lynn
21
@ ElijahLynn: Dalam alias git, sebuah lead !berarti meneruskan semuanya ke shell. Jika tidak, itu mengasumsikan Anda mencoba menjalankan perintah git lain dan meneruskannya sebagai argumen ke gitbiner.
Lily Ballard
2
@ Brondahl Pandai. Saya akan merekomendasikan ;:bukan && :. Dan itu berfungsi dengan baik di unix juga.
Lily Ballard
82

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

[alias] chs = !git checkout $1 && git status && :

memberikan hasil yang benar ... git chs demo -> git checkout demo && git status

Brondahl
sumber
9
The && :emas dan membuat ini bekerja solusi untuk perintah di mana argumen ekstra akan bermasalah.
Clay
3
@ Putar (atau siapa pun) - Bisakah seseorang menjelaskan kepada BASH-challengeed apa && :?
Justin Morgan
7
@JustinMorgan && berarti jika perintah sebelumnya ternyata 0 (berhasil), kemudian jalankan perintah setelah &&. ':', titik dua, adalah perintah shell builtin, yang tidak melakukan apa-apa selain memperluas argumen dan melakukan pengalihan dan mengembalikan status 0. Berikut beberapa penggunaan: 1. a=123;$akesalahan, tetapi a=123; : $atidak. 2. : > hello.txtmengosongkan hello.txt. 3. if [ "$a" = "hello" ];then : ;fiberjalan baik-baik saja tetapi kesalahan tanpa ':'. Ini seperti passdalam python. 4. : this is a comment, titik dua yang diikuti oleh ruang bekerja seperti #pada baris komentar.
ElpieKay
2
ini seperti hack ... git harus menerima beberapa mode perintah
kchoi
1
Terima kasih @ElpieKay untuk penjelasannya. Alias ​​git lokal saya untuk satu proyek adalah co = !git checkout public/compiled && git checkout $1dan ketika saya melakukannya git co mastersaya akan mendapatkan pesan error: 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.
Tyler Collier
73

Anda dapat mendefinisikan fungsi shell.

[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"
Lily Ballard
sumber
Saya melihat ini di halaman stackoverflow lain, tetapi terminal cygwin saya mengatakan bahwa fungsinya tidak dikenali ketika saya mencoba menjalankannya.
Stella
@Stella: Saya meninggalkan kutipan penutup di sana yang tidak berguna sintaksis file konfigurasi ini. Pastikan Anda tidak memilikinya.
Lily Ballard
2
Wow ... Sayangnya, ini semua masalah versi. Saya menggunakan Git 1.7.3, dan tidak satu pun dari metode ini bekerja. Saya memperbarui ke 1.7.6 dan voila, semuanya bekerja. Terima kasih kawan!
Stella
5
jika menggunakan Windows saya pikir Anda harus mengelilingi definisi fungsi shell dengan tanda kutip ganda"
drzaus
4
Jawaban Olivier tidak berfungsi untuk saya menggunakan parameter (OSX). Ini bekerja dengan sempurna.
Ohad Schneider
25

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:

safereset = "!f() { \
                trap 'echo ERROR: Operation failed; return' ERR; \
                echo Making sure there are no changes...; \
                last_status=$(git status --porcelain);\
                if [[ $last_status != \"\" ]]; then\
                    echo There are dirty files:;\
                    echo \"$last_status\";\
                    echo;\
                    echo -n \"Enter Y if you would like to DISCARD these changes or W to commit them as WIP: \";\
                    read dirty_operation;\
                    if [ \"$dirty_operation\" == \"Y\" ]; then \
                        echo Resetting...;\
                        git reset --hard;\
                    elif [ \"$dirty_operation\" == \"W\" ]; then\
                        echo Comitting WIP...;\
                        git commit -a --message='WIP' > /dev/null && echo WIP Comitted;\
                    else\
                        echo Operation cancelled;\
                        exit 1;\
                    fi;\
                fi;\
            }; \
            f"

Saya menulis posting dan memiliki beberapa contoh lagi di sini .

VitalyB
sumber
2
satu peningkatan pada hal ini adalah menambahkan !f() { : resetuntuk mendapatkan penyelesaian dari perintah atur
pengguna
Kerja bagus! Apa lisensi artikel yang diterbitkan di bawah? Apakah Anda keberatan jika saya menerjemahkan sebagian untuk StackOverflow dalam bahasa Rusia?
Nick Volynkin
@NickVolynkin Maaf atas keterlambatan balasan. Terima kasih dan tentu saja, silakan :)
VitalyB
22
[alias]
chs = !git branch && git status
FractalSpace
sumber
8
Untuk apa !?
AutonomousApps
1
Saya tidak dapat menemukan doc untuk !tetapi sejauh yang saya dapat melihat git secara default akan menganggap bahwa alias adalah perintah git sehingga t = statusakan berfungsi. Namun jika Anda mencobanya t = git statustidak 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 memiliki t = !git status && git logmisalnya dan itu akan berfungsi.
laurent
Inilah pertanyaan StackOverflow yang berhubungan dengan tanda seru (!) Di alias Git: stackoverflow.com/questions/21083933/… .
Jacob Lockard
6

Coba yang ini:

[alias]
    chs = "!sh -c 'git checkout \"$0\" && git status'"

Sebut saja seperti ini: git chs master

brocksamson
sumber
6

Dimungkinkan untuk memiliki multiline git alias dengan menambahkan \pada akhir setiap baris.

[alias] 
   chs = "!git checkout $1 \ 
          ; git status     \
         "
gmarik
sumber
2
Terima kasih! Saya sebenarnya tidak punya masalah menggunakan "!git fetch --prune --all; git pull --rebase upstream master; git push origin master"alias saya.
Droogan
3

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:

[alias]
  test = !git echo $*

Lalu, lakukan git test this is my testing string. Anda harus mengamati output berikut (dua baris terakhir diedit di sini untuk kejelasan):

03:41:24 (release) ~/Projects/iOS$ git test this is my testing string
this is my testing string this is my testing string
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
          #1                         #2

Salah satu cara untuk mengatasi ini adalah dengan

[alias]
  chs = !git checkout $1 && git status && git echo x >/dev/null

Ini akan menggunakan parameter posisi tambahan saat diterapkan pada perintah gema terakhir dan tidak berpengaruh pada hasil.

Ben Collins
sumber