Jeg vil automatisk cd
til katalogen opprettet av clone
kommando etter at jeg git clone
d noe.
Viktig: Jeg vil ikke endre syntaksen for kommandoen (f.eks. bruke et alias / funksjon) fordi det ville ødelegge zsh-fullføringene jeg får automatisk fra Pretzo
-prosjektet.
EDIT : Årsaken til at jeg ikke valgte noe svar som riktig, er fordi det ikke var noe svar gitt som oppfylte vilkåret ovenfor.
Jeg bruker ZSH, men et svar i et hvilket som helst annet skall er også akseptabelt.
Kommentarer
Svar
Opprett en funksjon:
gclonecd() { git clone "$1" && cd "$(basename "$1" .git)" }
(Fungerer for lenker begge med og uten «.git»)
Kommentarer
- Jeg vil fortsette å bruke
git clone
fordi av alle verktøyene som jeg må endre hvis jeg ikke brukergit
. Hub er alias som git, oh-my-zsh gir automatisk utfylling, osv … - @Wildeyes
git
kan ‘ t endre arbeidskatalogen til skallet ditt, så uansett må du ‘ slå det inn i et alias / funksjon som gjør hva du vil og følger den opp med den innebygdecd
. Hvis du vil ringehub
i stedet forgit
, gjør du det i funksjonen. Hvis du vil at den bare skal påvirke kommandoenclone
, må du se etter handlingen i funksjonen. osv. - Jeg la merke til at
basename [email protected]:pckujawa/pattern-rec.git
resulterer i mønster-rec.git – slipper du bare .git-utvidelsen når du kloner? - @Pat
basename
tar også et suffiksargument, så du kan gjøre:git clone $1 && cd $(basename $1 .git)
Svar
git clone
tar et ekstra argument: katalogen som skal brukes. Du kan få det til å klone i den nåværende arbeidskatalogen med git clone URL .
Deretter er det ikke nødvendig å endre arbeidskatalog; du er allerede der.
Hvis du virkelig vil at kommandoen git
skal endre arbeidskatalog, kan du endre den til en funksjon som kaller den virkelige git
når det er nødvendig:
git() { local tmp=$(mktemp) local repo_name if [ "$1" = clone ] ; then /usr/bin/git "$@" | tee $tmp repo_name=$(awk -F\" "/Cloning into/ {print $2}" $tmp) rm $tmp printf "changing to directory %s\n" "$repo_name" cd "$repo_name" else /usr/bin/git "$@" fi }
Kommentarer
- Det var akkurat det jeg lette etter. Etter at jeg innså at det ikke er noen interne kroker eller noe sånt, skrev jeg en nesten eksakt funksjon 🙂
- @Wildeyes Ja: ha et
/tmp
volum som er i RAM, som enhver moderne Linux gjør via tmpfs. Uansett, hvorfor ville du bry deg om å skrive til disken når du ‘ nettopp har gjort en git-klon, som oppretter kataloger og skriver kanskje hundrevis av filer til disken … - Du ‘ har sannsynligvis rett om hele » nvm hvis den skriver til disk » ting, jeg var bare ute etter å spare ekstra operasjoner. Tusen takk Kaz.
- Vær forsiktig. det er
git [flags] command [arguments]
, så blindt ber omclone
i en viss posisjon vil mislykkes. - Ville å legge til » ekte » path help? Som: git_real_home =
which git
git () {… $ git_real_home » $ @ » | tee $ tmp
Svar
Hvis du oppgir repoets lokale navn, er det veldig enkelt å bruke $ _ :
git clone [email protected]:npm/npm.git npm-local-dir && cd $_
Men hvis du ikke vil skrive inn lang navn, det «er litt stygt, men gjennomførbart med sed:
git clone [email protected]:pckujawa/pattern-rec.git && cd `echo $_ | sed -n -e "s/^.*\/\([^.]*\)\(.git\)*/\1/p"`
EDIT: Vel, jeg skulle takke Manav (kommentar nedenfor) for kortfattet
git clone foo/bar && cd !$:t
men det fungerer ikke i zsh ( noe om hvordan zsh utvidelser fører til at den ikke behandler den første kommandoen som inngang til !$
). Jeg måtte slå opp hva !$:t
gjorde ( Advancing in the Bash Shell | $ {me: -whatever} ) . !$
tar tak i den siste delen av forrige kommando, og :t
vil «Fjern alle ledende filnavnkomponenter og etterlater halen.»God informasjon, men jeg skulle ønske jeg kunne få den til å fungere med zsh (jeg prøvde noglob
uten hell).
EDIT: I stedet for å bruke sed
eller !$:t
(som ikke fungerer i zsh, for meg uansett), jeg fant to andre alternativer (en som tilpasser https://unix.stackexchange.com/users/5685/frederik-deweerdt » svar med https://unix.stackexchange.com/users/129926/henrik-n sin kommentar:
git clone [email protected]:npm/npm.git && cd $(basename $_ .git)
eller
git clone [email protected]:npm/npm.git && cd ${${_%%.git*}##*/}
Kommentarer
-
git clone foo/bar && cd !$:t
- Hvis repo-url din ender på
.git
du kan bruke!$:t:r
for å få navnet på mappen.
Svar
En enkel løsning for ethvert POSIX-skall er å spesifisere katalogen som skal klones eksplisitt (hvilken som helst filsystembane) og bruke den på nytt:
git clone <repository> <directory> && cd "$_"
og
cd -
når du er ferdig.
Answ er
Du kan gjøre noe sånt som:
clone_check() { (($? != 0)) && return local cmd=$history[$((HISTCMD-1))] cmd=("${(@Q)${(z)cmd}}") if [[ $cmd = "git clone "* ]]; then local dir if (($#cmd == 3)); then dir=${cmd[3]:t} dir=${dir%.git} dir=${dir#*:} elif (($#cmd > 3)); then dir=$cmd[-1] else return fi print -r CDing into $dir > /dev/tty cd -- $dir fi } precmd_functions+=(clone_check)
Det er ganske forenklet. Det «sa precmd
krok (utført før hver ledetekst), som sjekker om den siste kommandolinjen så ut som git clone .../something
eller git clone .../something dir
, gjett katalogen fra den og cd inn i den.
Den fungerer ikke hvis du skrev inn git clone foo; whatever
eller whatever; git clone foo
eller git clone --option repo
…
Kommentarer
- +1 Takk du veldig mye for koden; Jeg bruker ‘ siden noen få dager. Jeg ‘ har nettopp lagt merke til ett problem; hvis du lukker terminalen rett etter kloning av et prosjekt, neste gang du åpner en terminal, klager zsh med to feilmeldinger:
CDing into <project>
ogclone_check:cd:17: no such file or directory: <project>
. Feilen forsvinner så snart den siste kommandoen du kjørte før du lukket terminalen, er forskjellig fra$ git clone
.
Svar
Her er en tilpasning av svaret ovenfor for OSX
-
mktemp
krever ekstra parameter -
git clone
skriver tilSTDERR
som standard (se dette )
Funksjon:
function git { local tmp=$(mktemp -t git) local repo_name if [ "$1" = clone ] ; then command git "$@" --progress 2>&1 | tee $tmp repo_name=$(awk -F\" "/Cloning into/ {print $2}" $tmp) rm $tmp printf "changing to directory %s\n" "$repo_name" cd "$repo_name" else command git "$@" fi }
Kommentarer
- Det er 7 svar som viser » over » dine. Men det kan endres over tid. Slike referanser gir ingen mening i SE. Vennligst rediger svaret og inkluder en lenke til svaret du henviste til.
Svar
Det er et grunnleggende problem med forespørselen din som gjør det nesten umulig å oppnå: git er en barneprosess av skallet i dette tilfellet, og barneprosesser klarer ikke å endre foreldrenes miljø i de fleste operativsystemer. Så , den eneste måten å gjøre dette på, er fra skallets side – ved å implementere et alias eller en funksjon.
Du finner ytterligere detaljer her: https://stackoverflow.com/questions/2375003/how-do-i-set-the-working-directory-of-the-parent-process
Svar
Jeg vil ikke anbefale det, men du kunne bruke denne enlinjeren:
echo "project" | xargs -I % sh -c "git clone https://github.com/username/%.git && cd %"
Svar
Inkluder dette i skallet ditt:
git(){ case "$1" in clone) git-clone "${@:2}";; *) command git "$@";; esac } git-clone(){ local tgt tgt=$(command git clone "$@" 2> >(tee /dev/stderr |head -n1 | cut -d \" -f2)) || return $? cd "$tgt" }
Dette fungerer ved å skjule kloningsmålet skjult fra gitts standardfeil og cd
«ing i målet hvis (og bare hvis) kloningen var en suksess.
Den godtar alle argumenter og alternativer som den vanlige git clone
gjør.
Enten kan du bruke git-innpakningen og ikke trenger å bekymre deg for fullførelsene dine, eller så kan du bli kvitt git-innpakningen og koble git clone
til git-clone
.
Svar
Jeg har laget dette basert på @ frederik-deweerdt svar.
Så du kan bare klone til clone
repolinken som er i utklippstavlen. Hvis du informerer repoen, kloner den enn den kommer inn.
Det kreves å installere xclip
.
clone() { if [ -z "$1" ] then local repo=$(xclip -o) else local repo=$1 fi git clone "$repo" && cd "$(basename "$repo" .git)" }
Svar
En annen implementering håndterer også flere argumenter til git clone
-kommandoen.
Korrekt cd
«er i den oppgitte mappen eller standard git repo navn.
Bruk
gclonecd https://github.com/example/repo gclonecd https://github.com/example/repo my-custom-folder
Bash-funksjon
# Clones git repo and cd"s into it gclonecd() { git_dir="$(basename "$1" .git)" git_dir_resolved=${2:-$git_dir} git clone "$@" && cd "$git_dir_resolved"; }
~/.bashrc
-filen (for eksempel) og for meg på l øst fungerte det ikke ‘, jeg trengte å fikse det med å erstatte linjen:/usr/bin/git "$@" 2>&1 | tee $tmp