Próbuję utworzyć alias, który używa zarówno wielu poleceń Git, jak i parametrów pozycyjnych. Dla każdej z nich są strony Stackoverflow, a zrobienie obu wydaje się boleśnie oczywiste, ale mam problem.
Na przykład chcę przejść do gałęzi foo i wykonać status. Więc w moim .gitconfig
mam:
[alias]
chs = !sh -c 'git checkout $0 && git status'
co nie działa. Podczas gdy coś takiego będzie działać.
chs = !sh -c 'git checkout $0'
echoes = !sh -c 'echo hi && echo bye'
Doceniony zostanie każdy wgląd.
Odpowiedzi:
To zadziała (przetestowane z zsh i bash):
źródło
git chs foo
wgit checkout && git status foo
echo $1 && echo done
po wywołaniu z argumentem „foo” wyświetli zarówno „foo”, jak i „done foo”.git
?!
oznacza przekazanie całej rzeczy do powłoki. W przeciwnym razie zakłada, że próbujesz uruchomić inne polecenie git i przekazuje je jako argumenty dogit
pliku binarnego.;:
zamiast&& :
tego. I to działa dobrze również na Uniksie.To celuje wsadowy Windows / msysgit bash; może nie działać w innych środowiskach.
Jak powiedzieli Olivier Verdier i Lily Ballard
[alias] chs = !git checkout $1 && git status
prawie działa, ale daje fałszywe dodatkowe wstawienie argumentu ...
git chs demo -> git checkout demo && git status demo
Ale jeśli dodasz
&& :
na końcu swojego aliasu, fałszywy argument zostanie wykorzystany w znaczniku lokalizacji.Więc
daje prawidłowy wynik ...
git chs demo -> git checkout demo && git status
źródło
&& :
Jest złoto i czyni tę pracę rozwiązanie dla komend gdzie dodatkowo argumentem byłoby problematyczne.&& :
robi?a=123;$a
błędy, alea=123; : $a
nie. 2.: > hello.txt
opróżnia hello.txt. 3.if [ "$a" = "hello" ];then : ;fi
działa dobrze, ale błędy bez „:”. To jest jakpass
w pythonie. 4.: this is a comment
dwukropek, po którym następuje spacja, działa jak#
w wierszu komentarza.co = !git checkout public/compiled && git checkout $1
a kiedy to zrobięgit co master
, dostanę wiadomośćerror: pathspec 'master' did not match any file(s) known to git.
. Nie sądziłem, że ta odpowiedź będzie dla mnie przydatna, ponieważ pierwszą rzeczą, o której wspomina, jest system Windows i jestem w systemie Linux. Ale wyjaśniłeś dlaczego.Możesz zdefiniować funkcję powłoki.
źródło
"
Byłem w stanie stworzyć wieloliniowe i dość złożone aliasy git. Działają dobrze w systemie Windows, ale zakładam, że działałyby także gdzie indziej, na przykład:
Napisałem post i jeszcze kilka przykładów tutaj .
źródło
!f() { : reset
aby uzyskać uzupełnienia z polecenia resetowania github.com/git/git/blob/master/contrib/completion/…źródło
!
?!
ale o ile widzę, domyślnie git zakłada, że alias jest poleceniem git, więct = status
będzie działać. Jednak jeśli spróbujesz,t = git status
to nie zadziała (powie, że nie znaleziono polecenia „git”). Tak więc, gdzie!
przychodzi, mówi mu, aby uruchomił polecenie tak, jakby to była powłoka, i zwykle jest to potrzebne, gdy masz wiele poleceń git na alias, więc możeszt = !git status && git log
na przykład mieć i będzie działać.Spróbuj tego:
Nazwij to tak:
git chs master
źródło
Możliwe jest posiadanie wielowierszowego aliasu git, dołączając go
\
na końcu każdej linii.źródło
"!git fetch --prune --all; git pull --rebase upstream master; git push origin master"
mojego aliasu.Problem polega na tym, że parametry pozycyjne wydają się być wysyłane dwukrotnie do polecenia powłoki (od git 1.9.2). Aby zobaczyć, co mam na myśli, spróbuj tego:
Więc zrób
git test this is my testing string
. Powinieneś obserwować następujące dane wyjściowe (dwa ostatnie wiersze edytowane tutaj dla przejrzystości):Jednym ze sposobów obejścia tego byłoby:
Spowoduje to zużycie dodatkowego parametru pozycyjnego, gdy zostanie zastosowany do ostatniego polecenia echa i nie będzie miało wpływu na wyniki.
źródło