Jak osadzić skrypt bash bezpośrednio w aliasie git

82

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 tworzenia aliasu git:

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

To prowadzi do mojego poprzedniego pytania / odpowiedzi na SO, gdzie umieściłem kod w pliku .sh, a następnie utworzyłem alias do pliku:

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

Ale w niekończącej się pogoni za prostotą musi być sposób, aby pominąć plik i wstawić kod bezpośrednio do aliasu? Nie mogę wymyślić formatu ...

Seba Illingworth
źródło

Odpowiedzi:

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

Z jednej strony jest to zbędne. Jeśli mimo wszystko zamierzasz dodać „diffall.sh” do swojej $ PATH, dlaczego nie zapisać go jako „git-diffall” i uchronić się przed deklarowaniem aliasu. Tak, uruchomi go „git diffall”.

u0b34a0f6ae
źródło
1
Że. Jest świetny. Początkowo martwiłem się, że przypadkowo coś uruchomię, ponieważ napisałem kilka skryptów powłoki do robienia rzeczy git i dałem im przedrostek „git-”, ale moja powłoka (zsh) nie uzupełnia ich automatycznie, więc trzeba je jawnie wpisać. A jeśli chcę zachowanie autouzupełniania, mogę zadeklarować alias git do swojej własnej podkomendy, co jest również wymaganiem, aby łącze ze skryptu do podkomendy było jawne.
Jon Carter
1
Tak, a to plik binarny, po prostu potrzebujesz huku:! binary
1
Nie działa dla mnie, użycie wewnątrz aliasu !sh git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')powoduje /usr/lib/git-core/git: /usr/lib/git-core/git: cannot execute binary file. Na początku próbowałem zarówno z, jak i bez sh.
Hi-Angel
36

Aby uruchamiać polecenia wewnątrz aliasu git, aw szczególności przekazywać argumenty do tych poleceń, prawdopodobnie będziesz musiał utworzyć tymczasową funkcję, którą następnie 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 (a także jest bardziej elastyczna, jeśli chodzi o to, co możesz zrobić w pojedynczej „instrukcji”); 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”; wywołanie funkcji po prostu zużywa argumenty, ignorując to, co nie jest jawnie używane:

$ 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 (zawiera listę wszystkich aliasów na podstawie pasującego wzorca) (uwaga: możesz nadal używać tej samej nazwy funkcji „f ()” w całym pliku .gitconfig):

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

Pierwsza zwraca alias dla samego „foo $”, a druga 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

(uwaga: rzeczywiste wyniki mogą się różnić w zależności od powłoki; używam tego z bash w systemie Linux, Unix i Cygwin (Windows).)

Michael
źródło
git.wiki.kernel.org/index.php/Aliases#What.27s_new.3F niejawnie zaleca używanie sh -c, dzięki czemu nie musisz się martwić, czym jest powłoka logowania użytkownika.
clacke
podana przeze mnie składnia funkcji jest celowo przenoszona na kilka powłok (sh / ksh / bash / zsh) i będzie szybsza niż uruchamianie podprocesu. Zalecałbym nadal używanie składni funkcji, chyba że istnieje konkretny problem z przenośnością na określonej platformie.
michael
Twój komentarz sprowadził mnie z powrotem do tej odpowiedzi i prawdopodobnie wykorzystam twój sposób. Oszczędza jeden poziom notowań, a te poziomy są wystarczająco szalone. :-)
clacke
To wygląda na fajny artykuł opisujący to, co robisz: atlassian.com/blog/git/advanced-git-aliases
Gabriel Staples
Uwaga: opublikowałem tutaj dodatkowe pytanie dotyczące tej odpowiedzi: stackoverflow.com/questions/52123145/… . „Jak zamienić wewnętrzne polecenia git, takie jak git statusniestandardowe aliasy”
Gabriel Staples,
24

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

Widzieć:

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

Możesz więc w ten (raczej niejasny) sposób napisać dowolny alias, który ci się podoba.

Co więcej, możesz dodać autouzupełnianie do tego nowego polecenia definiującego funkcję. Informacje tutaj

$ _git_logg ()
{
  # you can return anything here for the autocompletion for example all the branches
  __gitcomp_nl "$(__git_refs)" 
}
albfan
źródło
+1, myślałem, że będzie działać tylko z folderu git libexec. dzięki za podzielenie się tą wskazówką
Olivier Refalo
14

Dodanie tych dwóch wierszy do pliku .git / config powinno załatwić sprawę.

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

Edycja: prawdopodobnie działa również wersja git-config, ale lubię trzymać moje aliasy w pliku konfiguracyjnym, aby ułatwić zarządzanie.

Na wiki git znajduje się fajna strona, która bardzo jasno wyjaśnia aliasy: http://git.or.cz/gitwiki/Aliases W szczególności przeczytaj „zaawansowane aliasy z argumentami”

David Claridge
źródło
git config --global zapisze twoje aliasy w $ HOME / .gitconfig, gdzie (IMO) są jeszcze łatwiejsze w zarządzaniu; prawie żadne aliasy nie muszą być specyficzne dla repozytorium. (Specyficzne dla repozytorium przejdź do repo / .git / config)
u0b34a0f6ae
Dzięki David, ale dla mnie to po prostu nie zadziała - ta lub którakolwiek z odmian w świetnym linku, który umieściłeś. Może powinienem był wspomnieć, że pracuję w środowisku Windows? Dzięki Kaizer, zgodził się, to jest dla mnie „globalne”.
Seba Illingworth
W dzisiejszych czasach git.wiki.kernel.org/index.php/Aliases#Advanced to dobre miejsce do przeglądania. (link git lub cz przekierowuje tam, ale ta sekcja w szczególności wspomina o uruchamianiu złożonych rzeczy z argumentami)
clacke
-4

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

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

Na przykład, jeśli utworzysz 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'
Denian
źródło
3
co mają wspólnego haki z konfiguracją, rozszerzeniami i aliasami?
Steve Buzonas