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

Most of my my aliases are of this form: alias p='pwd'

I want to alias git commit so that it does git 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
25

6 cevap

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

git config --global alias.civ commit -v

Bu, bir git diğer adı oluşturur, böylece git civ , git commit -v komutunu çalıştırır. Ne yazık ki, AFAIK mevcut olanı geçersiz kılmanın yolu yok git diğer adlarla komutları . Ancak, alternatif olarak yaşamak için her zaman uygun bir takma ad seçebilirsiniz.

29
katma
Bağladığınız iş parçacığının bu cevabı belirttiğinden, var olanı geçersiz kılmak mümkün code> git takma adlarla komutlar, sadece bir miktar kabuk komut dosyası ile. (Bu yorumu bir eleştiri olarak göndermiyorum, BTW. Bu cevap sizinkinden yaklaşık bir yıl sonra gönderildi! Ben sadece insanların yararlı bulacağını umuyorum.
katma yazar Mayavimmer, kaynak
git config ile ilgili cevap vermek için eklenen nota bakın, git-config
katma yazar ExpelledFromParadise, kaynak

Boşluk içeren bir komuttan bahsediyorsunuz, ancak burada komut git ve orada boşluk yok.

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

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

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

csh, tcsh veya zsh, yukarıdakilerden herhangi birine başka ad vermenize 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' ...

git komutu komutunu (yalnızca 'git komutu' (yalnızca tek tırnaklı) olarak adlandırılır) git komutu için bir takma ad yapar. commit ve -v değişkenleri. Aradığın şeyi değil sanırım.

alias yalnızca alias komutları kullanabildiğinden, buradaki diğer adların tümü git komutudur ve bunu ekleyen bir öğeye diğer ad vermeniz gerekir argümanlar listesinde "taahhüt" ettikten sonra bir "-v". En iyisi @ jw013'ün çözümüyle gitmek olacaktır, ancak bir nedenden ötürü yapamazsınız veya yapamazsanız, takma ad kullanmak yerine, işi yapmak için bir işlev kullanabilirsiniz:

git() {
  if [ "$1" = commit ]; then
    shift
    set -- commit -v "[email protected]"
  fi
  command git "[email protected]"
}
17
katma
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ı .
katma yazar Valters Vingolds, kaynak
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ı.
katma yazar Stéphane Chazelas, kaynak

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 geçici bir çözüm olarak kullanıyorum.

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

Bu nasıl çalışır: Aramak istediğiniz komutla başlayın. Benim durumumda sudo .
Ardından, hangi parametrelerin gerekli olacağını söylersiniz. Bu durumda, pacman -Syu .
Eğer tetiklenirse, hangi komutu çalıştırmalı? Yukarıdaki ifadede pacup.sh 'dır.
Aksi halde, hangi komutun yürütüleceği, sudo $ @ . $ @ , tahmin ettiğiniz gibi, komutun aldığı parametre listesidir.

Yani, kendi durumunuz için emir vermek, şöyle olurdu:

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

However, this solution is for the more general case of when you want to alias commands with whitespaces in them.
In your specific case, I would recommend you go with jw013's solution to alias your git commands using git-config

9
katma
[[$ 1 == 'Taahhüt']] ... ise demek istemiyor musunuz? $ @ Genişlemesi, gerçekte saklamak istediğiniz taahhüdünüzde daha fazla arta sahip olabilir.
katma yazar kojiro, kaynak
Sağ! Benim hatam .. Sistemim için kullandığım ifadeyi değiştirdim.
katma yazar louisgab, kaynak
Bu harika - teşekkürler - ihtiyacım olan şey için mükemmel;
katma yazar cgseller, kaynak

From the bash alias man page

Her basit komutun ilk sözcüğü, eğer alıntılanmamışsa, takma adı olup olmadığını görmek için kontrol edilir. Öyleyse, bu kelime diğer adı 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ı olan bir kelime 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 kelimeden oluşan bir takma ad kullanamazsınız. bu Süper Kullanıcı sorusu 'nda, bir işlev kullanan bir geçici çözüm sağlanır:

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

git 'e uyarlanabilir.

4
katma
@sch Bourne/POSIX, bir kelime herhangi bir şekilde belirtilirse, takma takma adı genişlemesini atlar. Örneğin, \ ls , ls için bir diğer adı atlar.
katma yazar Valters Vingolds, kaynak
@sch POSIX uygulamaların takma adlarda diğer karakterleri kullanmasına izin verir takma ad genişlemesini engelleme . Bir POSIX kabuğundaki komut konumuna 'git commit' yazarsanız, yerleşik bir yardımcı programı, işlevi veya harici komutu çağırması gerekir.
katma yazar Valters Vingolds, kaynak
Verdiğiniz bağlantı, bash davranışlarıyla çelişen ve sahip olduğum bash belgelerinden farklı. 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.
katma yazar Stéphane Chazelas, kaynak
@Gilles. Bourne kabuğu takma adları uygulamaz. POSIX, geçerli bir takma adla eşleşen (yalnızca ASCII alnum + [_!%, @] olan) bir tırnak işaretlenmemiş kelimenin genişletileceğini söylüyor. Zsh'nin '\ ls' takma adı veya ksh/dash/bash/zsh'ın a-b takma adı gibi uzantıları yasaklamaz; Sadece taşınabilir bir komut dosyası (kabuk değil) böyle bir diğer adı kullanmaması gerektiğini söylüyor.
katma yazar Stéphane Chazelas, kaynak

bu örnekten, bunun çalışması gerekir:

Öyleyse, sudo'yu diğer komutlarla yine de kullanmak istiyorsanız, ancak kapatmayla değil ve başka birşeyle kapatmayı göze alıyorsanız, şunları yapabilirsiniz:

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

Ama emirlerinle:

alias git='git '
alias commit="commit -v"
1
katma

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