Bash komut dosyasını doğrudan bir git takma adının içine nasıl yerleştirilir


82

Aşağıdaki bash kabuğu kodunu yerleştirebilir miyim:

for name in $(git diff --name-only $1); do git difftool $1 $name & done

doğrudan bir git takma adının oluşturulmasına:

git config --global alias.diffall ***my-bash-code-here***

Bu , kodu bir .sh dosyasına koyduğum ve ardından dosyaya takma ad verdiğim SO'daki önceki sorum / cevabımdan kaynaklanıyor:

git config --global alias.diffall '!sh diffall.sh'

Ama hiç bitmeyen basitlik arayışında, dosyayı atlamanın ve kodu doğrudan takma ada eklemenin bir yolu olmalı? Formatı çözemiyorum ...

Yanıtlar:


95
git config --global alias.diffall '!sh diffall.sh'

Bu bir şekilde gereksizdir. Eğer yine de $ PATH'ınıza 'diffall.sh' ekleyecekseniz, neden onu 'git-diffall' olarak kaydetmeyin ve kendinizi bir takma ad belirtmekten kurtarın. Evet, "git diffall" çalıştıracak.


1
Bu. Harika. Başlangıçta, git şeyler yapmak için birkaç kabuk betiği yazıp onlara 'git-' ön eki verdiğim için yanlışlıkla bir şeyi çalıştıracağımdan endişelendim, ancak kabuğum (zsh) bunları otomatik olarak tamamlamıyor, bu yüzden bunları açıkça yazmanız gerekir. Ve otomatik tamamlama davranışı istiyorsam, kendi alt komutuna bir git takma adı bildirebilirim, bu da komut dosyasından alt komuta olan bağlantıyı açık yapmam için bir gerekliliktir.
Jon Carter

1
Evet, ve bu bir ikili ! binary

1
Benim için işe yaramıyor, bir takma adın içinde kullanılmasıyla !sh git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')sonuçlanıyor /usr/lib/git-core/git: /usr/lib/git-core/git: cannot execute binary file. shBaşlangıçta hem birlikte hem de onsuz denedim .
Hi-Angel

36

Komutları bir git takma adının içinde çalıştırmak ve özellikle bu komutlara argümanlar iletmek için, daha sonra hemen çağıracağınız geçici bir işlev oluşturmanız gerekecektir:

$ vim ~/.gitconfig
...
[alias]
    # compare:
    foo = "! echo begin arg=$1/$2/end"
    foo2 = "!f() { echo "begin arg=$1/$2/end"; }; f"

Bu örnekte, işlev muhtemelen ihtiyacınız olan şeydir (ve ayrıca tek bir "ifadede" ne yapabileceğiniz konusunda daha esnektir); ve muhtemelen her iki seçenek için de git komutunun kalan argümanlarının, "echo" veya "f" olup olmadığına bakılmaksızın, basitçe diğer ada değiştirge olarak aktarıldığını anlayabilirsiniz; işlevi çağırmak, açıkça kullanılmayanları yok sayarak bağımsız değişkenleri tüketir:

$ git foo a b c
begin arg=a/b/end a b c

$ git foo2 a b c
begin arg=a/b/end

Başka bir örnek (eşleşen desene göre tüm diğer adları listeler) (not: .gitconfig içinde aynı işlev adını "f ()" yeniden kullanmaya devam edebilirsiniz):

[alias]
    alias = "!f() { git config --get-regexp "^alias.${1}$" ; }; f"

İlki sadece "foo $" için diğer adı, "foo. *" İçin döndürür:

$ git alias foo
alias.foo ! echo begin arg=$1/$2/end

$ git alias 'foo.*'
alias.foo ! echo begin arg=$1/$2/end
alias.foo2 !f() { echo begin arg=$1/$2/end; }; f

(not: gerçek sonuçlar kabuğa göre değişebilir; bunu Linux, Unix ve Cygwin (Windows) üzerinde bash ile kullanıyorum.)


git.wiki.kernel.org/index.php/Aliases#What.27s_new.3F örtük olarak kullanmanızı önerir sh -c, bu şekilde kullanıcının oturum açma kabuğunun ne olduğu konusunda endişelenmenize gerek kalmaz.
clacke

Sağladığım işlev sözdizimi kasıtlı olarak birkaç kabukta (sh / ksh / bash / zsh) taşınabilir ve bir alt işlemi başlatmaktan daha hızlı olacaktır. Belirli bir platformda belirli bir taşınabilirlik sorunu olmadığı sürece, yine de işlev sözdizimini kullanmanızı öneririm.
michael

Yorumun beni bu cevaba geri getirdi ve muhtemelen senin yolunu kullanacağım. Bir seviye teklif tasarrufu sağlar ve bu seviyeler olduğu gibi yeterince çılgın. :-)
clacke

Bu, ne yaptığınızı açıklayan güzel bir makaleye benziyor: atlassian.com/blog/git/advanced-git-aliases
Gabriel Staples

Not: Bu yanıtla ilgili bir takip sorusunu burada yayınladım: stackoverflow.com/questions/52123145/… . " git statusÖzel takma adlar gibi dahili git komutları nasıl değiştirilir? "
Gabriel Staples

24

Dokümantasyonda bulamadım, ancak yolda "git- <name>" komut dosyası oluşturursanız, deponuzda "git adı" ile çağırabilirsiniz.

Görmek:

$ cd ~/bin
$ echo "echo I love this log:
>pwd
>git log --graph  --summary --decorate --all" > git-logg
$ chmod +x git-logg
$ cd /path/to/your/repo
$ git logg
I love this log:
/path/to/your/repo
* commit 3c94be44e4119228cc681fc7e11e553c4e77ad04 (whatever-branch)
| Author: myself <my@Laptop.(none)>
| Date:   Fri Apr 1 16:47:20 2011 +0200
| 
|     would have been better not to do it at all
| 
...
$

Böylece, istediğiniz herhangi bir takma adı da bu şekilde (oldukça belirsiz) yazabilirsiniz.

Daha da fazlası, bir işlevi tanımlayan bu yeni komuta otomatik tamamlama ekleyebilirsiniz. Bilgi burada

$ _git_logg ()
{
  # you can return anything here for the autocompletion for example all the branches
  __gitcomp_nl "$(__git_refs)" 
}

+1, yalnızca git libexec klasöründen çalışacağını düşündü. bu ipucunu paylaştığınız için teşekkürler
Olivier Refalo

14

Bu 2 satırı .git / config dosyanıza eklemek hile yapacaktır.

[alias]
    diffall = '!for name in $(git diff --name-only $1); do git difftool $1 $name & done'

Düzenleme: muhtemelen git-config sürümü de çalışıyor, ancak yönetim kolaylığı için takma adlarımı yapılandırma dosyasında tutmayı seviyorum.

Git wiki'de takma adları çok net bir şekilde açıklayan güzel bir sayfa var: http://git.or.cz/gitwiki/Aliases Özellikle, 'argümanlarla gelişmiş takma adlar' bölümünü okuyun


git config --global takma adlarınızı $ HOME / .gitconfig üzerinde depolar, burada (IMO) daha kolay yönetilirler; neredeyse hiçbir takma adın depoya özgü olması gerekmez. (Repoya özgü repo / .git / config'e git)
u0b34a0f6ae

Teşekkürler David, ama benim için işe yaramayacak - bu veya dahil ettiğiniz harika bağlantının herhangi bir varyasyonu. Belki de Windows ortamında çalıştığımı söylemeliydim? Teşekkürler Kaizer, kabul etti, bu benim için 'küresel'.
Seba Illingworth

Bu günlerde git.wiki.kernel.org/index.php/Aliases#Advanced bakmak için iyi bir yer. (git ya cz bağlantı var yönlendirmeleri, ama özellikle bu bölümde karmaşık argümanlarla şeyler çalışan bahseder)
clacke

-4

(ProGit belgelerinden: http://progit.org/book/ch7-3.html )

.Git / hooks içine bir komut dosyası eklemeyi denediniz mi?

Örneğin, bir komut dosyası oluşturursanız .git / hooks / post-checkout:

#!/bin/bash

echo "This is run after a 'git checkout'"

ve sonra şu komutu çalıştırın:

$ git checkout master
Switched to branch 'master'
This is run after a 'git checkout'

3
kancaların yapılandırma, uzantılar ve takma adlarla ne ilgisi var?
Steve Buzonas
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.