2009-08-20 13 views
63

mogę osadzić następujący kod powłoki bash:Jak osadzić skrypt bash bezpośrednio wewnątrz aliasu git

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

bezpośrednio do utworzenia aliasu git:

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

Prowadzi to dalej od mojego previous question/answer na tak, to gdzie mogę umieścić kod do pliku, a następnie .sh aliasem do pliku:

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

Ale w nev er-ending quest for simplicity, musi być jakiś sposób na pominięcie pliku i wstawienie kodu bezpośrednio do aliasu? Nie mogę wymyślić formatu ...

Odpowiedz

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

ten jest zbędny w jeden sposób. Jeśli zamierzasz dodać "diffall.sh" do swojej $ PATH, to dlaczego nie zapisać go jako "git-diffall", i uratować się od deklarowania aliasu. Tak, uruchomi go "git diffall".

+0

To. Jest super. Początkowo obawialiśmy się, że bym przypadkowo uruchomić coś, ponieważ pisałem kilka skrypt zrobić git rzeczy, i dał im przedrostek „git-”, Ale moja shell (zsh) nie je uzupełni, więc musiałem wpisać je jawnie. A jeśli chcę zachować autouzupełnianie, mogę zadeklarować alias git dla jego własnej podkomendy, co jest również wymogiem, że utworzę odnośnik ze skryptu do podkomendy jawnie. –

+0

Yup, i jest to plik binarny, którego potrzebujesz po prostu huk: '! binary' –

13

Dodanie tych 2 linii do pliku .git/config powinno załatwić sprawę.

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

Edit: przypuszczalnie wersja git-config działa zbyt, ale chciałbym, aby moje aliasy w pliku konfiguracyjnym dla łatwości zarządzania.

Jest miły stronę na wiki git, który wyjaśnia aliasy bardzo wyraźnie: http://git.or.cz/gitwiki/Aliases W szczególności, czytać „zaawansowanych aliasów z argumentów”

+0

git config --global będzie przechowywać twoje aliasy w $ HOME/.gitconfig, gdzie (IMO) są jeszcze łatwiejsze w zarządzaniu; prawie żadne aliasy nie muszą być specyficzne dla repozytorium. (Specyficzne dla repo przejdź do repo/.git/config) – u0b34a0f6ae

+0

Dzięki David, ale to po prostu nie zadziała dla mnie - ta lub jakakolwiek z odmian świetnego linku, który zawierałeś. Może powinienem wspomnieć, że pracuję w środowisku Windows? Dzięki Kaizer, zgodził się, to dla mnie "globalne". –

+0

Obecnie https://git.wiki.kernel.org/index.php/Aliases#Advanced jest dobrym miejscem do obejrzenia. (przekierowania git lub cz link tam, ale ta sekcja w szczególności wspomina o uruchomieniu skomplikowanych rzeczy z argumentami) – clacke

20

Nie mogłem znaleźć w dokumentacji, ale jeśli utworzysz skrypt "git- < nazwa>" w ścieżce, możesz wywołać go z "nazwą git" w repozytorium.

Patrz:

$ 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 <[email protected](none)> 
| Date: Fri Apr 1 16:47:20 2011 +0200 
| 
|  would have been better not to do it at all 
| 
... 
$ 

Tak, można napisać dowolny alias chcesz z tym (a) zbyt niejasne.

Jeszcze więcej można dodać autouzupełnianie do tego nowego polecenia definiującego funkcję. Informacje here

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

+1, pomyślałem, że działa tylko z folderu git libexec. dziękuję za podzielenie się tą podpowiedzią. –

-3

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

Próbowałeś dodać skrypt w .git/haków?

Na przykład, jeśli utworzysz skrypt.git/haki/post-checkout:

#!/bin/bash 

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

a następnie uruchom polecenie:

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

Co mają zrobić podpięcia z konfiguracją, rozszerzeniami i aliasami? –

20

uruchamianie poleceń wewnątrz aliasu git, aw szczególności przekazywać argumenty do tych poleceń, będzie prawdopodobnie stworzyć tymczasową funkcję, która następnie niezwłocznie powołać:

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

w tym przykładzie funkcja jest chyba to, co trzeba (i jest bardziej elastyczny, co można zrobić w jednym „stat ement "); i prawdopodobnie możesz powiedzieć, że dla obu opcji pozostałe argumenty polecenia git są po prostu przekazywane jako argumenty do aliasu, niezależnie od tego, czy jest to "echo", czy "f"; powołując funkcja po prostu zużywa args, ignorując to, co nie jest wyraźnie stosowane:

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

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

Innym przykładem (wymienia wszystkie pseudonimy, na podstawie dopasowywania wzoru) (uwaga: można zachować ponowne użycie tej samej nazwy funkcji „f()” w całym .gitconfig):

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

pierwsze powroty alias tylko "foo $", drugi dla "foo *.":

$ 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 

(nb: rzeczywiste wyniki mogą się różnić w zależności od skorupy ; Używam to z bash na Linux, Unix & Cygwin (Windows).)

+0

https://git.wiki.kernel.org/index.php/Aliases#What.27s_new.3F domyślnie zaleca używanie 'sh -c', w ten sposób nie musisz się martwić, jaka jest powłoka logowania użytkownika. – clacke

+0

Podana przeze mnie składnia funkcji jest celowo przenośna przez kilka powłok (sh/ksh/bash/zsh) i będzie szybsza niż uruchomienie podprocesu. Polecam nadal używać składni funkcji, chyba że istnieje specyficzny problem z przenośnością na konkretnej platformie. – michael

+0

Twój komentarz doprowadził mnie z powrotem do tej odpowiedzi i prawdopodobnie wykorzystam twoją drogę. Zapisuje jeden poziom cytatu, a te poziomy są wystarczająco szalone, jak to jest. :-) – clacke