Vreau să cd automat în directorul creat de clone comanda după ce am git clone d ceva.

Important: Nu vreau să modific sintaxa pentru comandă (de exemplu, folosesc un alias / funcție) deoarece ar rupe completările zsh pe care le obțin automat din proiectul Pretzo.

EDIT : Motivul pentru care nu am ales vreun răspuns ca fiind corect este că nu a fost răspuns dat fiind faptul că a respectat condiția de mai sus.

Folosesc ZSH, dar este acceptabil și un răspuns în orice alt shell.

Comentarii

  • Îmi place răspunsul unix.stackexchange.com/questions/97920/… , dar are nevoie să menționez să scriu acea funcție pe fișierul ~/.bashrc (de exemplu) și pentru mine la l la est nu a funcționat ‘, a trebuit să o repar cu înlocuirea liniei: /usr/bin/git "$@" 2>&1 | tee $tmp

Răspuns

Creați o funcție:

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

(Funcționează atât pentru legături cu și fără „.git”)

Comentarii

  • Aș dori să continui să folosesc git clone dintre toate instrumentele pe care ar trebui să le schimb dacă nu aș folosi git. Hub este aliasat ca git, oh-my-zsh oferă completarea automată, etc …
  • @Wildeyes git nu poate ‘ să schimbe directorul de lucru al shell-ului dvs., așa că în orice mod ‘ va trebui să îl înfășurați într-un alias / funcție care face ceea ce doriți și îl urmează cu built-in-ul cd. Dacă doriți să apelați hub în loc de git, faceți acest lucru în funcție. Dacă doriți să afecteze numai comanda clone, verificați acțiunea din funcție. etc.
  • Am observat că basename [email protected]:pckujawa/pattern-rec.git are ca rezultat pattern-rec.git – lăsați doar extensia .git când clonați?
  • @Pat basename acceptă, de asemenea, un argument pentru sufix, deci puteți face: git clone $1 && cd $(basename $1 .git)

Răspuns

git clone ia un argument suplimentar: directorul de utilizat. Puteți face clona în directorul de lucru curent cu git clone URL . Apoi, nu este nevoie să schimbați directorul de lucru; sunteți deja acolo.

Dacă doriți cu adevărat ca comanda git să schimbe direct directorul de lucru, îl puteți schimba într-o funcție care numește git atunci când este necesar:

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 } 

Comentarii

  • A fost exact ce căutam. După ce mi-am dat seama că nu există cârlige interne sau ceva de genul acesta, am scris o funcție aproape exactă 🙂
  • @Wildeyes Da: aveți un volum /tmp RAM, la fel ca orice Linux modern prin intermediul tmpfs. Oricum, de ce ți-ar păsa să scrii pe disc, când ‘ tocmai ai făcut o clonă git, care creează directoare și scrie poate sute de fișiere pe disc …
  • ‘ probabil că aveți dreptate în legătură cu întregul ” nvm dacă scrie pe disc ” lucru, căutam doar să economisesc operațiuni suplimentare. Mulțumesc mult Kaz.
  • Fii atent. este git [flags] command [arguments], așa că cererea orbește clone într-o anumită poziție va eșua.
  • Ar adăuga ” real ” ajutor de cale? Ca: git_real_home = which git git () {… $ git_real_home ” $ @ ” | tee $ tmp

Răspuns

Dacă furnizați numele local al repo, este foarte ușor de utilizat $ _ :

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

Dar dacă nu doriți să tastați din nou nume, este „puțin urât, dar realizabil cu sed:

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

EDIT: Ei bine, aveam să-i mulțumesc lui Manav (comentariu mai jos) pentru concordanță

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

dar nu funcționează în zsh ( ceva despre cum zsh face expansiunile îl determină să nu trateze prima comandă ca intrare în !$). A trebuit să caut ce a făcut !$:t ( Avansând în Bash Shell | $ {me: -whatever} ) . !$ apucă ultima parte a comenzii anterioare și :t va „Elimina toate componentele principale ale numelui fișierului, lăsând coada.„Informații bune, dar mi-aș dori să pot funcționa cu zsh (am încercat noglob fără succes).

EDIT: În loc să folosesc sed sau !$:t (care nu funcționează în zsh, oricum pentru mine), am găsit alte două opțiuni (una adaptând https://unix.stackexchange.com/users/5685/frederik-deweerdt ” cu https://unix.stackexchange.com/users/129926/henrik-n „comentariu):

git clone [email protected]:npm/npm.git && cd $(basename $_ .git) 

sau

git clone [email protected]:npm/npm.git && cd ${${_%%.git*}##*/} 

Comentarii

  • git clone foo/bar && cd !$:t
  • Dacă adresa URL de repo se termină cu .git puteți utiliza !$:t:r pentru a obține numele folderului.

Răspuns

O soluție simplă pentru orice shell POSIX este să specificați directorul pentru care să clonați explicit (orice cale de sistem de fișiere) și să îl refolosiți:

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

și

cd - 

când ați terminat.

Răspundeți er

Ai putea face ceva de genul:

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) 

Este destul de simplist. „Sa precmd cârlig (executat înainte de fiecare prompt), care verifică dacă ultima linie de comandă arăta ca git clone .../something sau git clone .../something dir, ghiciți directorul din acesta și cd-l în el.

Nu funcționează dacă ați introdus git clone foo; whatever sau whatever; git clone foo sau git clone --option repo

Comentarii

  • +1 Mulțumesc tu foarte mult pentru cod; ‘ îl folosesc de câteva zile. ‘ tocmai am observat o problemă; dacă închideți terminalul imediat după clonarea unui proiect, data viitoare când deschideți un terminal, zsh se plânge de două mesaje de eroare: CDing into <project> și clone_check:cd:17: no such file or directory: <project>. Eroarea dispare imediat ce ultima comandă pe care ați executat-o înainte de a închide terminalul este diferită de $ git clone.

Răspuns

Iată o adaptare a răspunsului de mai sus pentru OSX

  • mktemp necesită parametru suplimentar
  • git clone scrie în STDERR în mod implicit (consultați this )

Funcție:

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 } 

Comentarii

  • Există 7 răspunsuri care afișează ” deasupra ” a ta. Dar se poate schimba în timp. Astfel de referințe nu au sens în SE, vă rugăm să editați răspunsul și să includeți un link către răspunsul la care v-ați referit.

Răspuns

Există o problemă fundamentală cu solicitarea dvs. care face aproape imposibilă realizarea: git este un proces secundar al shell-ului în acest caz, iar procesele secundare nu pot modifica mediul părintelui în majoritatea sistemelor de operare. , singurul mod de a face acest lucru ar fi din partea shell – prin implementarea unui alias sau funcție.

Puteți găsi detalii suplimentare aici: https://stackoverflow.com/questions/2375003/how-do-i-set-the-working-directory-of-the-parent-process

Răspunde

Nu aș recomanda, dar ai putea utiliza acest singur liner:

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

Răspuns

Includeți acest lucru în 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" } 

Acest lucru funcționează prin culegerea subreptă a țintei de clonare din eroarea standard a git și cd „ing în țintă dacă (și numai dacă) clonarea a avut succes.

Acceptă toate argumentele și opțiunile pe care le face git clone obișnuit.

Fie puteți utiliza git wrapper și nu trebuie să vă faceți griji cu privire la completările dvs., fie puteți scăpa de git wrapper și reconectați completările git clone la git-clone.

Răspuns

Am făcut acest lucru pe baza @ frederik-deweerdt răspuns.

Deci, puteți să clonați doar pe clone linkul repo care se află în clipboard, dacă informați repo, acesta clonează decât intră.

Este necesar să instalați xclip.

clone() { if [ -z "$1" ] then local repo=$(xclip -o) else local repo=$1 fi git clone "$repo" && cd "$(basename "$repo" .git)" } 

Răspuns

O altă implementare gestionează, de asemenea, argumente suplimentare la comanda git clone.

În mod corect cd „se află în folderul furnizat sau numele implicit al repozitiei git.

Utilizare

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

Funcția Bash

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *