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

  • Jeg liker svaret unix.stackexchange.com/questions/97920/… men det trenger å nevne for å skrive den funksjonen på ~/.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

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 bruker git. 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 innebygde cd. Hvis du vil ringe hub i stedet for git, gjør du det i funksjonen. Hvis du vil at den bare skal påvirke kommandoen clone, 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 om clone 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> og clone_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 til STDERR 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"; }  

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *