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 ...
! binary
!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 bezsh
.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:
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).)
źródło
sh -c
, dzięki czemu nie musisz się martwić, czym jest powłoka logowania użytkownika.git status
niestandardowe aliasy”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)" }
źródło
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”
źródło
(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'
źródło