Jeg vil automatisk cd til den mappe, der er oprettet af clone kommando efter I git clone d noget.

Vigtigt: Jeg vil ikke ændre syntaksen for kommandoen (f.eks. bruge et alias / funktion), fordi det ville bryde de zsh-kompletteringer, jeg automatisk får fra Pretzo -projektet.

REDIGER : Årsagen til, at jeg ikke valgte noget svar som korrekt, er fordi intet svar var givet at opfyldte betingelsen ovenfor.

Jeg bruger ZSH, men et svar i en hvilken som helst anden skal er også acceptabelt.

Kommentarer

  • Jeg kan godt lide svaret unix.stackexchange.com/questions/97920/… men det har brug for at nævne at skrive den funktion på ~/.bashrc -fil (for eksempel) og for mig ved l øst fungerede det ‘, jeg havde brug for at ordne det med at erstatte linjen: /usr/bin/git "$@" 2>&1 | tee $tmp

Svar

Opret en funktion:

gclonecd() { git clone "$1" && cd "$(basename "$1" .git)" } 

(Fungerer for links begge med og uden “.git”)

Kommentarer

  • Jeg vil gerne fortsætte med at bruge git clone fordi af alle de værktøjer, som jeg skulle ændre, hvis jeg ikke brugte git. Hub er alias som git, oh-my-zsh giver automatisk udfyldelse osv …
  • @Wildeyes git kan ‘ t ændre arbejdskataloget for din shell, så uanset hvad du ‘ bliver nødt til at pakke den i et alias / funktion, der gør, hvad du vil, og følger det op med den indbyggede cd. Hvis du vil ringe til hub i stedet for git, skal du gøre det i funktionen. Hvis du kun vil have indflydelse på kommandoen clone, skal du kontrollere, om handlingen er i funktionen. osv.
  • Jeg bemærkede, at basename [email protected]:pckujawa/pattern-rec.git resulterer i mønster-rec.git – forlader du bare .git-udvidelsen, når du kloner?
  • @Pat basename tager også et suffiksargument, så du kan gøre: git clone $1 && cd $(basename $1 .git)

Svar

git clone tager et yderligere argument: den mappe, der skal bruges. Du kan få det til at klone i den aktuelle arbejdsmappe med git clone URL . Derefter er der ikke behov for at ændre arbejdsmappe; du er allerede der.

Hvis du virkelig vil have kommandoen git til at ændre arbejdsmappen, kan du ændre den til en funktion, der kalder den virkelige git når det er nødvendigt:

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 nøjagtigt hvad jeg ledte efter. Efter at jeg indså, at der ikke er nogen interne kroge eller noget lignende, skrev jeg en næsten nøjagtig funktion 🙂
  • @Wildeyes Ja: har et /tmp volumen, der er i RAM, som enhver moderne Linux gør via tmpfs. Anyway, hvorfor ville du være ligeglad med at skrive til disken, når du ‘ lige har lavet en git-klon, som opretter mapper og skriver måske hundreder af filer til disken …
  • Du ‘ har sandsynligvis ret i hele ” nvm, hvis den skriver til disk ” ting, jeg ville bare gemme ekstra operationer. Mange tak Kaz.
  • Vær forsigtig. det er git [flags] command [arguments], så blindt beder om clone i en bestemt position mislykkes.
  • Vil tilføjelse af ” rigtig ” hjælp til stien? Ligesom: git_real_home = which git git () {… $ git_real_home ” $ @ ” | tee $ tmp

Svar

Hvis du angiver det lokale navn på repoen, er det virkelig nemt at bruge $ _ :

git clone [email protected]:npm/npm.git npm-local-dir && cd $_ 

Men hvis du ikke vil gentype lang navne, det “er lidt grimt, men gennemførligt med sed:

git clone [email protected]:pckujawa/pattern-rec.git && cd `echo $_ | sed -n -e "s/^.*\/\([^.]*\)\(.git\)*/\1/p"` 

EDIT: Nå, jeg ville takke Manav (kommentar nedenfor) for kortfattet

git clone foo/bar && cd !$:t 

men det fungerer ikke i zsh ( noget om hvordan zsh udvider , får det til ikke at behandle den første kommando som input til !$). Jeg var nødt til at slå op, hvad !$:t gjorde ( Advance in the Bash Shell | $ {me: -whatever} ) . !$ griber den sidste del af den forrige kommando, og :t “Fjern alle førende filnavnskomponenter og efterlader halen.”Gode oplysninger, men jeg ville ønske, at jeg kunne få det til at arbejde med zsh (jeg prøvede noglob uden succes).

EDIT: I stedet for at bruge sed eller !$:t (hvilket alligevel ikke fungerer i zsh for mig), jeg fandt to andre muligheder (den ene tilpassede https://unix.stackexchange.com/users/5685/frederik-deweerdt ” s svar med https://unix.stackexchange.com/users/129926/henrik-n “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 din repo url ender på .git du kan bruge !$:t:r til at hente mappenavnet.

Svar

En simpel løsning til enhver POSIX-shell er at angive den mappe, der skal klones eksplicit (enhver filsystemsti) og genbruge den:

git clone <repository> <directory> && cd "$_" 

og

cd - 

når du er færdig.

Answ er

Du kan gøre noget 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 ret forenklet. Det “sa precmd krog (udført før hver prompt), der kontrollerer, om den sidste kommandolinje lignede git clone .../something eller git clone .../something dir, gæt kataloget fra det og cd ind i det.

Det fungerer ikke, hvis du har indtastet git clone foo; whatever eller whatever; git clone foo eller git clone --option repo

Kommentarer

  • +1 Tak du meget for koden; Jeg ‘ bruger det siden et par dage. Jeg ‘ har lige bemærket et problem; hvis du lukker terminalen lige efter kloning af et projekt, næste gang du åbner en terminal, klager zsh over to fejlmeddelelser: CDing into <project> og clone_check:cd:17: no such file or directory: <project>. Fejlen forsvinder, så snart den sidste kommando, du kørte, før terminalen blev lukket, er forskellig fra $ git clone.

Svar

Her er en tilpasning af ovenstående svar til OSX

  • mktemp kræver yderligere parameter
  • git clone skriver til STDERR som standard (se dette )

Funktion:

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

  • Der er 7 svar, der viser ” over ” dit. Men det kan ændre sig over tid. Sådanne referencer giver ingen mening i SE. Rediger dit svar og medtag et link til det svar, du henviste til.

Svar

Der er et grundlæggende problem med din anmodning, der gør det næsten umuligt at opnå: git er en underordnet proces af skallen i dette tilfælde, og underordnede processer kan ikke ændre forældrenes miljø i de fleste operativsystemer. Så , den eneste måde at gøre dette på ville være fra shellens side – ved at implementere et alias eller en funktion.

Du kan finde yderligere 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 bruge denne one-liner:

echo "project" | xargs -I % sh -c "git clone https://github.com/username/%.git && cd %"

Svar

Inkluder dette i din shell:

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 virker ved skjult at klone kloningsmålet fra gits standardfejl og cd “ing i målet, hvis (og kun hvis) kloningen var en succes.

Den accepterer alle argumenter og muligheder, som den almindelige git clone gør.

Enten kan du bruge git-indpakningen og ikke behøver at bekymre dig om dine færdiggørelser, eller så kan du slippe af med git-indpakningen og omtrække dine git clone -afslutninger til git-clone.

Svar

Jeg har lavet dette baseret på @ frederik-deweerdt svar.

Så du kan bare klone til clone repo-linket, der er i udklipsholderen, hvis du informerer repoen, kloner den end går ind.

Det er nødvendigt at 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 anden implementering håndterer også yderligere argumenter til git clone kommandoen.

Korrekt cd “er i den angivne mappe eller standardnavnet til git repo.

Anvendelse

gclonecd https://github.com/example/repo gclonecd https://github.com/example/repo my-custom-folder 

Bash-funktion

 # 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"; }  

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *