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

  • Jag vill fortsätta använda git clone eftersom av alla verktyg som jag måste ändra om jag inte använder git. Hub är alias som git, oh-my-zsh ger automatisk komplettering osv …
  • @Wildeyes 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 inbyggda cd. Om du vill ringa hub istället för git, gör det i funktionen. Om du vill att det bara ska påverka kommandot clone, leta efter funktionen i funktionen. etc.
  • Jag märkte att basename [email protected]:pckujawa/pattern-rec.git resulterar i mönster-rec.git – lämnar du bara .git-tillägget när du klonar?
  • @Pat basename tar också ett suffixargument, så du kan göra: git clone $1 && cd $(basename $1 .git)

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 om clone 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> och clone_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 till STDERR 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"; }  

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *