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

  • Vorrei continuare a utilizzare git clone perché di tutti gli strumenti che dovrei cambiare se non usassi git. Hub è alias come git, oh-my-zsh fornisce il completamento automatico, ecc …
  • @Wildeyes 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 il cd incorporato. Se desideri chiamare hub invece di git, fallo nella funzione. Se vuoi che influenzi solo il comando clone, controlla lazione nella funzione. ecc.
  • Ho notato che basename [email protected]:pckujawa/pattern-rec.git restituisce pattern-rec.git: lasci semplicemente lestensione .git quando cloni?
  • @Pat basename accetta anche un suffisso come argomento, quindi puoi fare: git clone $1 && cd $(basename $1 .git)

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 cieca clone 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> e clone_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 in STDERR 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"; }  

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *