Desidero cd
automaticamente creato da clone
comando dopo git clone
d qualcosa.
Importante: Non voglio alterare la sintassi del comando (es. utilizzare un alias / funzione) perché interromperebbe i completamenti zsh che ottengo automaticamente dal progetto Pretzo
.
EDIT : Il motivo per cui non ho scelto nessuna risposta come corretta è perché nessuna risposta è stata dato che era conforme alla condizione precedente.
Uso ZSH, ma è accettabile anche una risposta in qualsiasi altra shell.
Commenti
- Mi piace la risposta unix.stackexchange.com/questions/97920/… ma ha bisogno menzionare di scrivere quella funzione nel file
~/.bashrc
(ad esempio) e per me in l est non ‘ t funzionava, dovevo aggiustarlo sostituendo la riga:/usr/bin/git "$@" 2>&1 | tee $tmp
Risposta
Crea una funzione:
gclonecd() { git clone "$1" && cd "$(basename "$1" .git)" }
(Funziona sia per i collegamenti con e senza “.git”)
Commenti
Risposta
git clone
accetta un argomento aggiuntivo: la directory da utilizzare. Puoi farlo clonare nella directory di lavoro corrente con git clone URL .
Quindi, non è necessario cambiare la directory di lavoro; sei già lì.
Se vuoi davvero che il comando git
cambi effettivamente la directory di lavoro, puoi cambiarlo in una funzione che chiama il vero git
quando necessario:
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 }
Commenti
- Era esattamente quello che stavo cercando. Dopo aver realizzato che non ci sono hook interni o qualcosa del genere, ho scritto una funzione quasi esatta 🙂
- @Wildeyes Sì: avere un volume
/tmp
che si trova in RAM, come qualsiasi Linux moderno fa tramite tmpfs. Ad ogni modo, perché dovresti preoccuparti di scrivere sul disco, quando ‘ hai appena eseguito un clone di git, che crea directory e scrive forse centinaia di file sul disco … - ‘ probabilmente hai ragione sullintero ” nvm se scrive su disco ” cosa, stavo solo cercando di salvare operazioni extra. Grazie mille Kaz.
- Stai attento. è
git [flags] command [arguments]
, quindi chiedere alla ciecaclone
in una determinata posizione non andrà a buon fine. - Aggiungerebbe ” reale ” guida del percorso? Ad esempio: git_real_home =
which git
git () {… $ git_real_home ” $ @ ” | tee $ tmp
Risposta
Se fornisci il nome locale del repository, è davvero facile usarlo $ _ :
git clone [email protected]:npm/npm.git npm-local-dir && cd $_
Ma se non vuoi riscrivere a lungo nomi, è “un po brutto ma fattibile con sed:
git clone [email protected]:pckujawa/pattern-rec.git && cd `echo $_ | sed -n -e "s/^.*\/\([^.]*\)\(.git\)*/\1/p"`
EDIT: Beh, stavo per ringraziare Manav (commento sotto) per il conciso
git clone foo/bar && cd !$:t
ma non funziona in zsh ( qualcosa su come zsh esegue le espansioni fa sì che non tratti il primo comando come input per !$
). Ho dovuto cercare cosa facesse !$:t
( Avanzamento nella shell Bash | $ {me: -wwhat} ) . !$
afferra lultima parte del comando precedente e :t
rimuoverà tutti i componenti principali del nome del file, lasciando la coda.”Buone informazioni, ma vorrei riuscire a farlo funzionare con zsh (ho provato noglob
senza successo).
EDIT: invece di usare sed
o !$:t
(che non funziona in zsh, comunque per me), ho trovato altre due opzioni (una adatta https://unix.stackexchange.com/users/5685/frederik-deweerdt ” s risposta con https://unix.stackexchange.com/users/129926/henrik-n “s comment):
git clone [email protected]:npm/npm.git && cd $(basename $_ .git)
o
git clone [email protected]:npm/npm.git && cd ${${_%%.git*}##*/}
Commenti
-
git clone foo/bar && cd !$:t
- Se lURL del repository termina con
.git
puoi utilizzare!$:t:r
per ottenere il nome della cartella.
Risposta
Una soluzione semplice per qualsiasi shell POSIX è specificare la directory da clonare esplicitamente (qualsiasi percorso del file system) e riutilizzarla:
git clone <repository> <directory> && cd "$_"
e
cd -
quando hai “finito”.
Rispondi er
Potresti fare qualcosa del tipo:
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)
È abbastanza semplicistico. È “un precmd
hook (eseguito prima di ogni prompt), che controlla se lultima riga di comando era simile a git clone .../something
o git clone .../something dir
, indovina la directory da quella e inseriscici con cd.
Non funziona se hai inserito git clone foo; whatever
o whatever; git clone foo
o git clone --option repo
…
Commenti
- +1 grazie molto per il codice; Lo ‘ lo sto utilizzando da alcuni giorni. ‘ ho appena notato un problema; se chiudi il terminale subito dopo aver clonato un progetto, la prossima volta che apri un terminale, zsh si lamenta con due messaggi di errore:
CDing into <project>
eclone_check:cd:17: no such file or directory: <project>
. Lerrore scompare non appena lultimo comando eseguito prima di chiudere il terminale è diverso da$ git clone
.
Risposta
Ecco un adattamento della risposta precedente per OSX
-
mktemp
richiede un parametro aggiuntivo -
git clone
scrive inSTDERR
per impostazione predefinita (vedi this )
Funzione:
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 }
Commenti
- Ci sono 7 risposte che mostrano ” sopra ” la tua. Ma potrebbe cambiare nel tempo. Tali riferimenti non hanno senso su SE, modifica la tua risposta e includi un link alla risposta a cui ti riferivi.
Risposta
Cè un problema fondamentale con la tua richiesta che lo rende quasi impossibile da raggiungere: git è un processo figlio della shell in questo caso, ei processi figli non sono in grado di modificare lambiente genitore nella maggior parte dei sistemi operativi. Quindi , lunico modo per farlo sarebbe dal lato della shell, implementando un alias o una funzione.
Puoi trovare ulteriori dettagli qui: https://stackoverflow.com/questions/2375003/how-do-i-set-the-working-directory-of-the-parent-process
Risposta
Non lo consiglierei, ma potresti utilizzare questa frase:
echo "project" | xargs -I % sh -c "git clone https://github.com/username/%.git && cd %"
Risposta
Includilo nella tua 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" }
Funziona estraendo di nascosto lobiettivo della clonazione dallerrore standard di git e cd
“ing nella destinazione se (e solo se) la clonazione ha avuto successo.
Accetta tutti gli argomenti e le opzioni che il normale git clone
fa.
O puoi usare il wrapper git e non devi preoccuparti dei tuoi completamenti, oppure puoi sbarazzarti del wrapper git e ricablare i tuoi git clone
completamenti a git-clone
.
Risposta
Lho “fatto in base a @ frederik-deweerdt risposta.
Quindi puoi semplicemente clonare lutente in clone
il collegamento del repository che si trova negli appunti, se informi il repository, clona quello che entra.
È necessario installare xclip
.
clone() { if [ -z "$1" ] then local repo=$(xclip -o) else local repo=$1 fi git clone "$repo" && cd "$(basename "$repo" .git)" }
Risposta
Unaltra implementazione, gestisce anche argomenti aggiuntivi al comando git clone
.
Correttamente cd
“nella cartella fornita o nel nome del repository git predefinito.
Utilizzo
gclonecd https://github.com/example/repo gclonecd https://github.com/example/repo my-custom-folder
Funzione 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"; }
git clone
perché di tutti gli strumenti che dovrei cambiare se non usassigit
. Hub è alias come git, oh-my-zsh fornisce il completamento automatico, ecc …git
non puoi ‘ cambiare la directory di lavoro della tua shell, quindi in ogni caso ‘ dovrai avvolgerla in un alias / funzione che fa quello che vuoi e lo segue con ilcd
incorporato. Se desideri chiamarehub
invece digit
, fallo nella funzione. Se vuoi che influenzi solo il comandoclone
, controlla lazione nella funzione. ecc.basename [email protected]:pckujawa/pattern-rec.git
restituisce pattern-rec.git: lasci semplicemente lestensione .git quando cloni?basename
accetta anche un suffisso come argomento, quindi puoi fare:git clone $1 && cd $(basename $1 .git)