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
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ș folosigit
. 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-ulcd
. Dacă doriți să apelațihub
în loc degit
, faceți acest lucru în funcție. Dacă doriți să afecteze numai comandaclone
, 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șteclone
î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>
șiclone_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 înSTDERR
î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"; }
~/.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