Git [action] komutu için bir boşluk adı nasıl oluşturabilirim (boşluk içeren)?


29

Takma isimlerimin çoğu bu biçimdedir: alias p='pwd'

Takma adı istiyorum git commit, öyle olsungit commit -v

Ancak boşluk içeren bir takma ad oluşturmaya çalışmak hata veriyor:

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

Yanıtlar:


31

Sorunuza doğrudan bir yanıt değil (takma ad yalnızca bir sözcük olabileceğinden), ancak git-configbunun yerine kullanmanız gerekir :

git config --global alias.civ commit -v

Bu, git civçalışacak şekilde bir git takma adı oluşturur git commit -v. Ne yazık ki, AFAIK mevcut git komutlarını takma adlarla geçersiz kılmanın bir yolu yoktur . Ancak, alternatif olarak yaşamak için her zaman uygun bir takma ad seçebilirsiniz.


git configDeğil hakkında cevap için not eklendigit-config
Michael Durrant

Gibi bu cevap size markaları temizlemek bağlantılı olduğu konuya, ise mevcut geçersiz kılmak mümkün gitkabuk script sadece birazcık takma ada sahip komutlar. (.! Btw bir eleştiri olarak bu yorumu yayınlamak değilim cevap sizinki sonra yaklaşık bir yıl yayınlanmıştır Ben sadece insanlar yararlı bulabilirsiniz umuduyla onu post ediyorum.)
sampablokuper

17

Boşluk içeren bir komuttan bahsediyorsun, ama burada komut gitve orada boşluk yok.

Bir git commit komutunu çağırmak için , onu yazmanız gerekir.

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

Genelde komutların isimlerinde boşluk bulamazlar, bu nedenle onları bir kabuğa çağırmanın hantal olduğu için sisteminizde böyle bir komut bulacağınızı sanmıyorum.

csh, tcsh veya zsh, yukarıdakilerden herhangi birini takma işlemine izin verir, ancak bash veya ksh kullanmanıza izin vermez (pdksh size izin verir ancak bunları kullanmanıza izin vermezsiniz). Zsh içinde:

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

Yapacak git command(olarak adlandırılan zaman komutu 'git command'tek tırnak () yalnızca) için bir takma ad gitile komuta commitve -vargümanlar. Aradığın şeyi değil sanırım.

Çünkü aliassadece takma ad komutları olabilir , burada takma adın tek adı gitkomuttur ve argüman listesinde "taahhüt" yaptıktan sonra "-v" ekleyen birşeye takma ihtiyacınız olacaktır. En iyisi @ jw013'ün çözümüyle gitmek olacaktır, ancak bir nedenden ötürü yapamazsınız veya yapmazsanız, bir takma ad kullanmak yerine, işi yapmak için bir işlev kullanabilirsiniz:

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

3
Boşluk veya diğer özel karakterlere sahip diğer adlara izin vermenin, Bourne tarzı kabuklarda bulunmayan bir csh özelliği olduğunu unutmayın (garip bir şekilde öykünür). Bourne tarzı mermiler, ilk kelime herhangi bir şekilde alıntı yapıldığında takma adın genişlemesini devre dışı bırakır, bkz. Renan'ın cevabı .
Gilles 'SO- kötülük olmayı'

Evet. Bu yüzden sadece csh, tcsh ve zsh ile çalıştığını söyledim. Bourne kabuğunun takma adları desteklemediğini unutmayın. Takma adlar csh tarafından tanıtıldı.
Stéphane Chazelas 23:12

9

Bash'de, içinde herhangi bir boşluk olan bir komut için takma ad oluşturamazsınız.
Ancak, aşağıdaki işlevi .bashrc dosyamda bir geçici çözüm olarak kullanıyorum.

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

Bu nasıl çalışır: Aramak istediğiniz komutla başlarsınız. Benim durumumda öyle sudo.
Ardından, hangi parametrelerin gerekli olacağını söylersiniz. Bu durumda pacman -Syu,.
Eğer tetiklenirse, hangi komutu çalıştırmalı? Yukarıdaki açıklamada öyle pacup.sh.
Aksi halde hangi komutun çalıştırılacağı sudo $@. $@, tahmin edeceğiniz gibi, komutun aldığı parametre listesidir.

Yani, kendi durumunuz için emir vermek, şöyle olacaktır:

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

Bununla birlikte, bu çözüm, içerisindeki boşluklarla komutları takmak istediğiniz zaman daha genel bir durum içindir.
Özel bir durumda, git komutlarını takma adlar için jw013'ün çözümüyle gitmenizi tavsiye ederim.git-config


Şunu yapmayın if [[ $1 == 'commit' ]]...? $ @ Genişlemesi, gerçekte saklamak istediğiniz taahhüdünüzde daha fazla sorun içerebilir.
kojiro

Sağ! Benim hatam .. Sistemim için kullandığım ifadeyi değiştirdim.
lanet

Bu harika - teşekkürler - ihtiyacım olan şey için mükemmel;
cgseller

4

Gönderen bash takma adam sayfası

Her basit komutun ilk sözcüğü, eğer belirtilmemişse, takma adı olup olmadığını görmek için kontrol edilir. Öyleyse, bu kelime diğer adın metni ile değiştirilir. Diğer ad adı ve değiştirilen metin, diğer adın `= 'içermemesi dışında, kabuk meta karakterleri de dahil olmak üzere geçerli bir kabuk girişi içerebilir.

Değiştirme metninin ilk sözcüğü takma adlar için test edilir, ancak genişletilen takma adla aynı sözcük ikinci kez genişletilmez. Bunun anlamı, örneğin, "ls -F" nin diğer adı olabilir ve Bash, değiştirilen metni tekrar tekrar genişletmeyi denemez.

Bu nedenle, yalnızca ilk kelime işaretlendiğinden, birden çok kelimeli bir takma ad kullanamazsınız. Gelen bu Super User soruya bir fonksiyonu kullanarak bir çözüm sağlanır:

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

Adapte edilebilir git.


Verdiğiniz bağlantı bash belgelerinden farklı ve bash davranışıyla çelişiyor gibi görünüyor. Yukarıda, örneğin boşluk isimlerinin takma isimlerle girilebileceğini söylüyor. Bu sayfa açıkça bash diyor olsa bile, bana zsh davranışı gibi görünüyor.
Stéphane Chazelas

2
@sch Bourne / POSIX, bir kelime herhangi bir şekilde belirtilirse, takma takma adı genişlemesini atlar. Örneğin \ls, bir diğer adını atlar ls.
Gilles 'SO- kötülük olmayı'

1
@Gilles. Bourne kabuğu takma adları uygulamaz. POSIX, geçerli bir takma adla eşleşen (sadece ASCII alnum + olan [_!%,@]) tırnaksız bir kelimenin genişletileceğini söylüyor. Zsh'nin '\ ls' takma adı gibi uzantıları ya da ksh / dash / bash / zsh'ın a-bbaşka bir takma ad kullanmasını yasaklamaz, aksi takdirde herhangi bir POSIX kabuğu bulunmaz. Sadece taşınabilir bir betiğin (kabuk değil) böyle bir takma adı kullanmaması gerektiğini belirtir.
Stéphane Chazelas 23:12

2
@sch POSIX , uygulamaların takma adlarda diğer karakterleri kullanmasına izin verir, ancak kelimenin herhangi bir bölümünü alıntılamak takma adın genişlemesini engeller . 'git commit'Bir POSIX kabuğundaki komut konumuna yazarsanız , yerleşik bir yardımcı programı, işlevi veya harici komutu çağırması gerekir.
Gilles 'SO- kötülük olmayı'

0

Doğru çözüm, jw013 tarafından önerilen takma adları kullanmak olsa da, boşluk içeren takma adlar yapmak için NEST takma adlarını kullanabilirsiniz.

Örneğin, şubeyi hem yerel olarak hem de uzaktan silmek için bir takma ad var, ancak kullanıcının her zaman dalı belirtmesini istiyorum:

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!'" 

-1

Gönderen bu örnekte, bu çalışması gerekir:

Öyleyse, sudo'yu diğer komutlarla yine de kullanmak istiyorsanız, ancak kapatma ile değil ve takma işlemin başka bir şeye kapatılmasını sağlayabiliyorsanız şunları yapabilirsiniz:

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

Ama emirlerinle:

alias git='git '
alias commit="commit -v"
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.