Jag vill automatiskt cd
till katalogen som skapats av clone
kommando efter jag git clone
d något.
Viktigt: Jag vill inte ändra syntaxen för kommandot (t.ex. använda ett alias / funktion) eftersom det skulle bryta de zsh-kompletteringar jag får automatiskt från Pretzo
-projektet.
EDIT : Anledningen till att jag inte valde något svar som korrekt är att inget svar var givet som uppfyllde villkoret ovan.
Jag använder ZSH, men ett svar i något annat skal är också acceptabelt.
Kommentarer
- Jag gillar svaret unix.stackexchange.com/questions/97920/… men det behöver att nämna att skriva den funktionen på
~/.bashrc
-fil (till exempel) och för mig vid l öst fungerade det inte ’, jag behövde fixa det med att ersätta raden:/usr/bin/git "$@" 2>&1 | tee $tmp
Svar
Skapa en funktion:
gclonecd() { git clone "$1" && cd "$(basename "$1" .git)" }
(Fungerar för länkar båda med och utan ”.git”)
Kommentarer
Svar
git clone
tar ytterligare ett argument: katalogen som ska användas. Du kan få den att klona i den aktuella arbetskatalogen med git clone URL .
Då finns det inget behov av att ändra arbetskatalog; du är redan där.
Om du verkligen vill att kommandot git
faktiskt ska ändra arbetskatalogen kan du ändra det till en funktion som kallar det verkliga git
vid behov:
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 exakt vad jag letade efter. Efter att jag insåg att det inte finns några interna krokar eller något liknande skrev jag en nästan exakt funktion 🙂
- @Wildeyes Ja: ha en
/tmp
volym som finns i RAM, som alla moderna Linux gör via tmpfs. Hur som helst, varför skulle du bry dig om att skriva till disken när du ’ precis har gjort en git-klon, som skapar kataloger och skriver kanske hundratals filer till disken … - Du ’ har förmodligen rätt om hela ” nvm om den skriver till disk ”, jag ville bara spara extra operationer. Tack så mycket Kaz.
- Var försiktig. det är
git [flags] command [arguments]
, så blindt ber omclone
i viss position kommer att misslyckas. - Skulle lägga till ” riktig ” sökhjälp? Gilla: git_real_home =
which git
git () {… $ git_real_home ” $ @ ” | tee $ tmp
Svar
Om du anger repos lokala namn är det väldigt enkelt att använda $ _ :
git clone [email protected]:npm/npm.git npm-local-dir && cd $_
Men om du inte vill skriva om lång namn, det är ”lite ful men genomförbart med sed:
git clone [email protected]:pckujawa/pattern-rec.git && cd `echo $_ | sed -n -e "s/^.*\/\([^.]*\)\(.git\)*/\1/p"`
EDIT: Nåväl, jag skulle tacka Manav (kommentar nedan) för kortare
git clone foo/bar && cd !$:t
men det fungerar inte i zsh ( något om hur zsh gör utvidgningar får det att inte behandla det första kommandot som inmatning till !$
). Jag var tvungen att slå upp vad !$:t
gjorde ( Advancing in the Bash Shell | $ {me: -whatever} ) . !$
tar tag i den sista delen av föregående kommando och :t
tar bort alla ledande filnamnskomponenter och lämnar svansen.”Bra information, men jag önskar att jag kunde få den att fungera med zsh (jag försökte noglob
utan framgång).
EDIT: Istället för att använda sed
eller !$:t
(vilket inte fungerar i zsh, för mig ändå), jag hittade två andra alternativ (en anpassning https://unix.stackexchange.com/users/5685/frederik-deweerdt ” 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
- Om din repo-webbadress slutar med
.git
du kan använda!$:t:r
för att få mappnamnet.
Svar
En enkel lösning för alla POSIX-skal är att ange katalogen som ska klonas uttryckligen (vilken filsystem som helst) och återanvända den:
git clone <repository> <directory> && cd "$_"
och
cd -
när du är klar.
Answ er
Du kan göra något 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 är ganska enkelt. Det ”sa precmd
krok (körs före varje uppmaning), som kontrollerar om den sista kommandoraden såg ut som git clone .../something
eller git clone .../something dir
, gissa katalogen från den och cd till den.
Det fungerar inte om du angav git clone foo; whatever
eller whatever; git clone foo
eller git clone --option repo
…
Kommentarer
- +1 Tack du väldigt mycket för koden; Jag ’ använder det sedan några dagar. Jag ’ har just märkt ett problem; om du stänger terminalen direkt efter kloning av något projekt, nästa gång du öppnar en terminal, klagar zsh på två felmeddelanden:
CDing into <project>
ochclone_check:cd:17: no such file or directory: <project>
. Felet försvinner så snart det sista kommandot du körde innan terminalen stängdes skiljer sig från$ git clone
.
Svar
Här är en anpassning av ovanstående svar för OSX
-
mktemp
kräver ytterligare parameter -
git clone
skriver tillSTDERR
som standard (se detta )
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
- Det finns 7 svar som visar ” ovanför ” ditt. Men det kan förändras med tiden. Sådana referenser är inte meningsfulla i SE, redigera ditt svar och inkludera en länk till svaret du hänvisade till.
Svar
Det finns ett grundläggande problem med din begäran som gör det nästan omöjligt att uppnå: git är en underprocess av skalet i detta fall, och underordnade processer kan inte ändra föräldrars miljö i de flesta operativsystem. Så , det enda sättet att göra detta skulle vara från skalets sida – genom att implementera ett alias eller en funktion.
Du hittar ytterligare information här: https://stackoverflow.com/questions/2375003/how-do-i-set-the-working-directory-of-the-parent-process
Svar
Jag skulle inte rekommendera det, men du kan använda den här linjen:
echo "project" | xargs -I % sh -c "git clone https://github.com/username/%.git && cd %"
Svar
Inkludera detta i ditt skal:
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" }
Detta fungerar genom att på ett smidigt sätt klena kloningsmålet från gits standardfel och cd
”ing i målet om (och endast om) kloning var en framgång.
Den accepterar alla argument och alternativ som den vanliga git clone
gör.
Antingen kan du använda git-omslaget och inte behöva oroa dig för dina slutföranden, eller så kan du bli av med git-omslaget och koppla om dina git clone
kompletteringar till git-clone
.
Svar
Jag har gjort detta baserat på @ frederik-deweerdt svara.
Så att du bara kan klona till clone
repolänken som finns i urklipp, om du informerar repo klonar den än går in.
Det krävs att xclip
installeras.
clone() { if [ -z "$1" ] then local repo=$(xclip -o) else local repo=$1 fi git clone "$repo" && cd "$(basename "$repo" .git)" }
Svar
En annan implementering, hanterar också ytterligare argument till git clone
-kommandot.
Korrekt cd
”i den angivna mappen eller standardnamnet för git repo.
Användning
gclonecd https://github.com/example/repo gclonecd https://github.com/example/repo my-custom-folder
Basfunktion
# 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
eftersom av alla verktyg som jag måste ändra om jag inte användergit
. Hub är alias som git, oh-my-zsh ger automatisk komplettering osv …git
kan ’ t ändra arbetskatalogen för ditt skal, så på något sätt måste du ’ slå in det i ett alias / funktion som gör vad du vill och följer upp det med den inbyggdacd
. Om du vill ringahub
istället förgit
, gör det i funktionen. Om du vill att det bara ska påverka kommandotclone
, leta efter funktionen i funktionen. etc.basename [email protected]:pckujawa/pattern-rec.git
resulterar i mönster-rec.git – lämnar du bara .git-tillägget när du klonar?basename
tar också ett suffixargument, så du kan göra:git clone $1 && cd $(basename $1 .git)