Je veux automatiquement cd dans le répertoire créé par le clone commande après que je git clone d quelque chose.

Important: Je ne veux pas modifier la syntaxe de la commande (par exemple utiliser un alias / une fonction) car cela briserait les zsh-complétions que jobtiens automatiquement du projet Pretzo.

EDIT : La raison pour laquelle je nai choisi aucune réponse comme correcte, cest parce quaucune réponse nétait étant donné que cela respectait la condition ci-dessus.

Jutilise ZSH, mais une réponse dans nimporte quel autre shell est également acceptable.

Commentaires

  • Jaime la réponse unix.stackexchange.com/questions/97920/… mais elle a besoin à mentionner décrire cette fonction sur le fichier ~/.bashrc (par exemple) et pour moi en l à lest il na ‘ t fonctionné, jai dû le réparer en remplaçant la ligne: /usr/bin/git "$@" 2>&1 | tee $tmp

Réponse

Créer une fonction:

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

(Fonctionne à la fois pour les liens avec et sans « .git »)

Commentaires

  • Je souhaite continuer à utiliser git clone car de tous les outils que je devrais changer si je nutilisais pas git. Hub est alias git, oh-my-zsh fournit la saisie semi-automatique, etc …
  • @Wildeyes git ne peut ‘ t changer le répertoire de travail de votre shell, donc de toute façon vous ‘ devez lenvelopper dans un alias / fonction qui fait ce que vous voulez et le suit avec le cd intégré. Si vous souhaitez appeler hub au lieu de git, faites-le dans la fonction. Si vous souhaitez quelle naffecte que la commande clone, vérifiez laction dans la fonction. etc.
  • Jai remarqué que basename [email protected]:pckujawa/pattern-rec.git aboutit à pattern-rec.git – laissez-vous simplement lextension .git lorsque vous clonez?
  • @Pat basename prend également un argument de suffixe, vous pouvez donc faire: git clone $1 && cd $(basename $1 .git)

Réponse

git clone prend un argument supplémentaire: le répertoire à utiliser. Vous pouvez le faire cloner dans le répertoire de travail courant avec git clone URL . Ensuite, il nest pas nécessaire de changer de répertoire de travail; vous y êtes déjà.

Si vous voulez vraiment que la commande git change réellement de répertoire de travail, vous pouvez le changer en une fonction qui appelle le réel git si nécessaire:

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 } 

Commentaires

  • Cétait exactement ce que je cherchais. Après avoir réalisé quil ny avait pas de hooks internes ou quelque chose comme ça, jai écrit une fonction presque exacte 🙂
  • @Wildeyes Oui: avoir un volume /tmp qui est dans RAM, comme tout Linux moderne le fait via tmpfs. Quoi quil en soit, pourquoi voudriez-vous écrire sur le disque, alors que vous ‘ venez de faire un clone git, qui crée des répertoires et écrit peut-être des centaines de fichiers sur le disque …
  • Vous ‘ avez probablement raison à propos de l’ensemble du  » nvm sil écrit sur le disque  » chose, je cherchais juste à enregistrer des opérations supplémentaires. Merci beaucoup Kaz.
  • Soyez prudent. cest git [flags] command [arguments], donc demander aveuglément clone à une certaine position échouera.
  • Lajout de  » réel  » aide au chemin? Comme: git_real_home = which git git () {… $ git_real_home  » $ @  » | tee $ tmp

Réponse

Si vous indiquez le nom local du dépôt, cest vraiment facile à utiliser $ _ :

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

Mais si vous ne voulez pas retaper longtemps les noms, cest « un peu moche mais faisable avec sed:

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

EDIT: Eh bien, jallais remercier Manav (commentaire ci-dessous) pour le lacet

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

mais ne fonctionne pas en zsh ( quelque chose à propos de comment zsh fait des expansions lamène à ne pas traiter la première commande comme une entrée de !$). Jai dû rechercher ce que !$:t faisait ( Avancer dans le shell Bash | $ {me: -whatever} ) . !$ saisit la dernière partie de la commande précédente et :t « supprimera tous les principaux composants du nom de fichier, laissant la queue. »Bonnes informations, mais jaimerais pouvoir les faire fonctionner avec zsh (jai essayé noglob sans succès).

EDIT: Au lieu dutiliser sed ou !$:t (qui ne fonctionne pas en zsh, pour moi en tout cas), jai trouvé deux autres options (une adaptant https://unix.stackexchange.com/users/5685/frederik-deweerdt  » avec https://unix.stackexchange.com/users/129926/henrik-n « s comment):

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

ou

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

Commentaires

  • git clone foo/bar && cd !$:t
  • Si lURL de votre dépôt se termine par .git vous pouvez utiliser !$:t:r pour obtenir le nom du dossier.

Réponse

Une solution simple pour tout shell POSIX est de spécifier explicitement le répertoire à cloner (tout chemin du système de fichiers) et de le réutiliser:

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

et

cd - 

quand vous avez « terminé.

Réponse euh

Vous pourriez faire quelque chose comme:

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) 

Cest assez simpliste. Il « sa precmd hook (exécuté avant chaque invite), qui vérifie si la dernière ligne de commande ressemblait à git clone .../something ou git clone .../something dir, devinez le répertoire à partir de celui-ci et ajoutez-y un cd.

Cela ne fonctionne pas si vous entrez git clone foo; whatever ou whatever; git clone foo ou git clone --option repo

Commentaires

  • +1 Merci vous beaucoup pour le code; Je ‘ m l’utilise depuis quelques jours. ‘ je viens de remarquer un problème; si vous fermez le terminal juste après le clonage dun projet, la prochaine fois que vous ouvrirez un terminal, zsh se plaint de deux messages derreur: CDing into <project> et clone_check:cd:17: no such file or directory: <project>. Lerreur disparaît dès que la dernière commande exécutée avant la fermeture du terminal est différente de $ git clone.

Réponse

Voici une adaptation de la réponse ci-dessus pour OSX

  • mktemp nécessite un paramètre supplémentaire
  • git clone écrit dans STDERR par défaut (voir this )

Fonction:

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 } 

Commentaires

  • Il y a 7 réponses qui affichent  » au-dessus de  » la vôtre. Mais cela peut changer avec le temps. De telles références nont aucun sens sur SE, veuillez modifier votre réponse et inclure un lien vers la réponse à laquelle vous faisiez référence.

Réponse

Il y a un problème fondamental avec votre requête qui la rend presque impossible à réaliser: git est un processus enfant du shell dans ce cas, et les processus enfants sont incapables de modifier lenvironnement parent dans la plupart des systèmes dexploitation. Donc , la seule façon de faire cela serait du côté du shell – en implémentant un alias ou une fonction.

Vous pouvez trouver des détails supplémentaires ici: https://stackoverflow.com/questions/2375003/how-do-i-set-the-working-directory-of-the-parent-process

Réponse

Je ne le recommanderais pas, mais vous pourriez utiliser ce one-liner:

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

Réponse

Incluez ceci dans votre 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" } 

Cela fonctionne en glanant subreptisément la cible de clonage à partir de lerreur standard de git et cd « ing dans la cible si (et seulement si) le clonage a réussi.

Il accepte tous les arguments et options que le git clone normal fait.

Soit vous pouvez utiliser le wrapper git sans avoir à vous soucier de vos complétions, soit vous pouvez vous débarrasser du wrapper git et recâbler vos git clone complétions en git-clone.

Réponse

Jai « fait ceci basé sur @ frederik-deweerdt réponse.

Ainsi, vous pouvez simplement cloner lutilisateur vers clone le lien de dépôt qui se trouve dans le presse-papiers, si vous informez le dépôt, il clone quil entre.

Il est nécessaire dinstaller xclip.

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

Réponse

Une autre implémentation gère également des arguments supplémentaires pour la commande git clone.

Correctement cd « s dans le dossier fourni ou le nom du référentiel git par défaut.

Utilisation

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

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *