Git Alias ​​- Çoklu Komutlar ve Parametreler


182

Birden çok Git komutunu ve konum parametrelerini kullanan bir diğer ad oluşturmaya çalışıyorum. Her biri için Stackoverflow sayfaları vardır ve her ikisini de yapmak çok acı verici görünecektir, ancak sorun yaşıyorum.

Örnek olarak, şube foo'suna geçmek ve bir durum gerçekleştirmek istiyorum. Yani .gitconfigbenimde:

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

ki bu işe yaramıyor. Halbuki böyle bir şey işe yarayacaktır.

chs = !sh -c 'git checkout $0'

echoes = !sh -c 'echo hi && echo bye'

Herhangi bir içgörü takdir edilecektir.


Takma adım: git config --global alias.go '! Git commit -a && git pull --rebase && git push && git status'. Not: Basit tırnak işaretleri kullanın.
Marcus Becker

Yanıtlar:


157

Bu işe yarayacaktır (zsh ve bash ile test edilmiştir):

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

1
Hayır olmaz. Git git chs foodönüşecekgit checkout && git status foo
Lily Ballard

24
İlginçtir, git aslında kabuk takma adlarındaki konumsal değişkenleri dolduruyor. Ama yine de kırık, çünkü aynı zamanda onları argüman olarak ele alıyor. Bir diğer adı echo $1 && echo done, argüman 'foo', irade çıkışı hem "foo" ve "bitti foo" ile çağrıldığında.
Lily Ballard

7
İlk çağırmada önceki ünlem işareti nedir git?
Elijah Lynn

21
@ElijahLynn: Git takma adında, önde gelen bir !araç her şeyi kabuğa geçirir . Aksi takdirde, başka bir git komutunu çalıştırmaya çalıştığınızı varsayar ve bunu ikiliye bağımsız değişken olarak gitiletir.
Lily Ballard

2
@Brondahl Clever. Ben tavsiye ederim ;:yerine && :gerçi. Ve bu unix üzerinde de iyi çalışıyor.
Lily Ballard

82

Bu, Windows toplu iş / msysgit bash'ı hedefler; diğer ortamlarda çalışmayabilir.

Olivier Verdier ve Lily Ballard'ın dediği gibi

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

neredeyse işe yarıyor, ama argümanın sahte bir şekilde eklenmesini sağlıyor ...

git chs demo -> git checkout demo && git status demo

Ancak && :takma adınızın sonuna eklerseniz sahte argüman bir konum etiketine alınır.

Yani

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

doğru çıktıyı verir ... git chs demo -> git checkout demo && git status


9
Bu && :altındır ve bu çözümü fazladan argümanın sorunlu olacağı komutlar için çalışır hale getirir.
Clay

3
@Clay (ya da bir başkası) - Birisi BASH'e meydan okudu ne açıklayabilir && :?
Justin Morgan

7
@JustinMorgan &&, önceki komutun 0 (başarılı) olması durumunda && komutundan sonra komutu çalıştırın. ':', iki nokta üst üste, bir kabuk yerleşik komutudur, bağımsız değişkenleri genişletmek ve yeniden yönlendirmeler yapmaktan ve 0 durumunu döndürmekten başka bir şey yapmaz. İşte bazı kullanımlar: 1. a=123;$ahatalar, ancak a=123; : $adeğil. 2. : > hello.txthello.txt dosyasını boşaltır. 3. iyi if [ "$a" = "hello" ];then : ;fiçalışır ama ':' olmadan hatalar. passPython'daki gibi . 4. : this is a comment, kolon ve ardından boşluk #yorum satırında olduğu gibi çalışır .
ElpieKay

2
Bu böyle bir hack ... git birden fazla komut modunu kabul etmeli
kchoi 17:06

1
Açıklama için @ElpieKay teşekkürler. Bir proejct için benim yerel git takma ad oldu co = !git checkout public/compiled && git checkout $1ve ne zaman ı-cekti yapmak git co masterben mesajı almak error: pathspec 'master' did not match any file(s) known to git.. Bu cevabın benim için yararlı olacağını düşünmedim çünkü bahsettiğim ilk şey Windows ve Linux'tayım. Ama nedenini açıkladın.
Tyler Collier

73

Bir kabuk işlevi tanımlayabilirsiniz.

[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"

Bunu başka bir yığın akışı sayfasında gördüm, ancak cygwin terminalim çalıştırmayı denediğimde işlevin tanınmadığını söylüyor.
Stella

@Stella: Orada bu yapılandırma dosyası sözdizimi yararlı olmayan bir kapanış teklifi bıraktı. Sahip olmadığından emin ol.
Lily Ballard

2
Vay be ... Ne yazık ki, bunların hepsi bir sürüm problemiydi. Git 1.7.3 kullanıyordum ve bu yöntemlerin hiçbiri işe yaramadı. 1.7.6'ya güncelledim ve voila, her şey işe yaradı. Teşekkürler beyler!
Stella

5
Windows kullanıyorsanız kabuk işlevi tanımını çift tırnak işareti ile çevrelemeniz gerektiğini düşünüyorum"
drzaus

4
Olivier'nin cevabı benim için parametreleri (OSX) kullanarak işe yaramadı. Bu mükemmel çalıştı.
Ohad Schneider

25

Çok satırlı ve oldukça karmaşık git takma adları oluşturabildim. Windows'da iyi çalışıyorlar, ancak başka bir yerde de çalışacaklarını varsayıyorum, örneğin:

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"

Bir yazı yazdım ve burada birkaç örnek daha var .


2
Bunun tek imrovement eklemek olacaktır !f() { : resetsıfırlama komutu gelen tamamlamaları almak için github.com/git/git/blob/master/contrib/completion/...
bir kullanıcı

İyi iş! Bu makale hangi lisansta yayınlanmaktadır? StackOverflow için bir kısmını Rusça çevirirsem sakıncası olur mu?
Nick Volynkin

@ NickVolynkin Geç cevap verdiğim için üzgünüm. Teşekkür ederim ve elbette, devam edin :)
VitalyB

22
[alias]
chs = !git branch && git status

8
Ne !için?
AutonomousApps

1
Ben doc için bulamadım !ama görebildiğim kadarıyla varsayılan olarak takma ad git komut olduğunu varsayar böylece t = statusçalışır. Ancak denerseniz t = git statusişe yaramaz ("git" komutu bulunamadı). Böylece !içeri geldiği zaman, komutu bir kabukmuş gibi çalıştırmasını söyler ve normalde diğer ad başına birden fazla git komutunuz olduğunda buna ihtiyacınız vardır, böylece t = !git status && git logörneğin sahip olabilirsiniz ve çalışır.
laurent

Git takma adlarındaki ünlem noktalarıyla (!) İlgilenen bir StackOverflow sorusu: stackoverflow.com/questions/21083933/… .
Jacob Lockard

6

Bunu dene:

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

Buna şöyle deyin: git chs master


6

\Her satırın sonuna ekleyerek çok satırlı git takma adına sahip olmak mümkündür .

[alias] 
   chs = "!git checkout $1 \ 
          ; git status     \
         "

2
Teşekkürler! "!git fetch --prune --all; git pull --rebase upstream master; git push origin master"Takma adım için kullanırken hiçbir sorun yaşamadım .
Droogans

3

Buradaki sorun, konumsal parametrelerin kabuk komutuna iki kez gönderiliyor gibi görünmesidir (git 1.9.2'den itibaren). Ne demek istediğimi görmek için şunu deneyin:

[alias]
  test = !git echo $*

Sonra yap git test this is my testing string. Aşağıdaki çıktıya dikkat etmelisiniz (netlik için burada düzenlenmiş son iki satır):

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

Bu sorunu çözmenin bir yolu

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

Bu, son yankı komutuna uygulandığı ve sonuçlar üzerinde hiçbir etkisi olmadığı için ekstra konum parametresini tüketecektir.

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.