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
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 pasgit
. 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 lecd
intégré. Si vous souhaitez appelerhub
au lieu degit
, faites-le dans la fonction. Si vous souhaitez quelle naffecte que la commandeclone
, 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émentclone
à 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>
etclone_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 dansSTDERR
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"; }
~/.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