Jak osadzić skrypt bash bezpośrednio w aliasie git

Czy Mogę osadzić następujący kod powłoki bash:

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***

To prowadzi z mojego poprzedniego pytania / odpowiedzi na tak, gdzie umieszczam kod w pliku. sh, a następnie aliasuję do pliku:

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

Ale w niekończącym się poszukiwaniu prostoty, musi być sposób, aby pominąć plik i wstawić kod bezpośrednio do aliasu? Nie mogę rozgryźć formatu...

Author: Community, 2009-08-21

5 answers

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

To jest zbędne w jeden sposób. Jeśli masz zamiar dodać "diffall.sh' do swojej $PATH tak czy siak, dlaczego nie zapisać go jako 'git-diffall' , i oszczędzić sobie deklarowania aliasu. Tak," git diffall " go uruchomi.

 78
Author: u0b34a0f6ae,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-21 01:29:58

Aby uruchomić polecenia wewnątrz aliasu git, a w szczególności przekazać argumenty do tych poleceń, prawdopodobnie będziesz musiał utworzyć tymczasową funkcję, którą natychmiast wywołasz:

$ 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 prawdopodobnie tym, czego potrzebujesz (i jest również bardziej elastyczna, co możesz zrobić w jednym "instrukcji"); i prawdopodobnie możesz powiedzieć, że dla obu opcji, Pozostałe args do komendy git są po prostu przekazywane jako args do aliasu, niezależnie od tego, czy jest to" echo "czy" f"; wywołanie funkcji po prostu zużywa args, ignorując to, co nie jest jawnie użyte:

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

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

Inny przykład (wyświetla wszystkie aliasy na podstawie dopasowanego wzorca) (uwaga: możesz używać ponownie tej samej nazwy funkcji "f ()" w całym .gitconfig):

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

Pierwszy zwraca alias tylko dla " 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 powłoki; używam tego z bash na Linux, Unix & Cygwin (Windows).)

 26
Author: michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-21 05:10:41

Nie mogłem znaleźć w dokumentacji, ale jeśli utworzysz skrypt "git-" W path, możesz wywołać go z "git name" w repo.

Zobacz:

$ 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
| 
...
$

Więc możesz napisać dowolny alias, który Ci się podoba, za pomocą tego (raczej niejasnego) sposobu.

Jeszcze bardziej możesz dodać autocompletion do tego nowego polecenia definiującego funkcję. Info tutaj

$ _git_logg ()
{
  # you can return anything here for the autocompletion for example all the branches
  __gitcomp_nl "$(__git_refs)" 
}
 21
Author: albfan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-25 11:44:21

Dodanie tych 2 linii do twojego .plik Git / config powinien wystarczyć.

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

Edit: prawdopodobnie wersja git-config też działa, ale lubię trzymać moje aliasy w pliku konfiguracyjnym dla ułatwienia zarządzania.

Jest fajna strona na Git wiki, która bardzo jasno wyjaśnia aliasy: http://git.or.cz/gitwiki/Aliases w szczególności, przeczytaj 'zaawansowane aliasy z argumentami'

 13
Author: David Claridge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-21 00:03:07

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

Czy próbowałeś dodać skrypt w .git / hooks?

Na przykład, jeśli tworzysz skrypt .git / hooks/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
Author: Denian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-05 13:01:25