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
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 omclone
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>
ogclone_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 tilSTDERR
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"; }
git clone
fordi af alle de værktøjer, som jeg skulle ændre, hvis jeg ikke brugtegit
. Hub er alias som git, oh-my-zsh giver automatisk udfyldelse osv …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 indbyggedecd
. Hvis du vil ringe tilhub
i stedet forgit
, skal du gøre det i funktionen. Hvis du kun vil have indflydelse på kommandoenclone
, skal du kontrollere, om handlingen er i funktionen. osv.basename [email protected]:pckujawa/pattern-rec.git
resulterer i mønster-rec.git – forlader du bare .git-udvidelsen, når du kloner?basename
tager også et suffiksargument, så du kan gøre:git clone $1 && cd $(basename $1 .git)