Je souhaite accéder automatiquement cd
au répertoire créé par la clone
commande après git clone
quelque chose.
Important: je ne souhaite pas modifier la syntaxe de la commande (par exemple, utiliser un alias / une fonction), car cela briserait les compléments zsh que je recevrais automatiquement du Pretzo
projet.
EDIT : La raison pour laquelle je n’ai retenu aucune réponse comme étant correcte, c’est qu’aucune réponse n’a été donnée qui soit conforme à la condition ci-dessus.
J'utilise ZSH, mais une réponse dans un autre shell est également acceptable.
~/.bashrc
fichier (par exemple) et pour moi au moins cela ne fonctionnait pas, je devais le corriger en remplaçant le ligne:/usr/bin/git "$@" 2>&1 | tee $tmp
Réponses:
Créer une fonction:
(Fonctionne pour les liens avec et sans ".git")
la source
git clone
cause de tous les outils que je devrais changer si je n'utilisais pasgit
. Hub est aliasé comme git, oh-my-zsh fournit l'auto-complétion, etc.git
ne peut pas changer le répertoire de travail de votre shell, vous devrez donc le placer dans un alias / une fonction qui fera ce que vous voulez et qui le suivra avec la commande intégréecd
. Si vous souhaitez appelerhub
au lieu degit
, faites-le dans la fonction. Si vous souhaitez qu'il affecte uniquement laclone
commande, vérifiez l'action dans la fonction. etc.basename [email protected]:pckujawa/pattern-rec.git
résultats dans pattern-rec.git - ne vous laissez pas l'extension .git lorsque vous clonez?basename
prend également un argument de suffixe, vous pouvez donc:git clone $1 && cd $(basename $1 .git)
git clone
prend un argument supplémentaire: le répertoire à utiliser. Vous pouvez le faire cloner dans le répertoire de travail actuel avecgit clone URL .
Ensuite, il n'est pas nécessaire de changer de répertoire de travail; vous êtes déjà là.Si vous voulez vraiment que la
git
commande change réellement le répertoire de travail, vous pouvez la changer pour une fonction qui appelle le réelgit
si nécessaire:la source
/tmp
volume en RAM, comme tout Linux moderne le fait via tmpfs. Quoi qu'il en soit, pourquoi voudriez-vous écrire sur le disque, alors que vous venez de créer un clone git, qui crée des répertoires et écrit peut-être des centaines de fichiers sur le disque ...git [flags] command [arguments]
, donc demander à l' aveugletteclone
dans une certaine position échouera.which git
git () {... $ git_real_home "$ @" | tee $ tmpSi vous fournissez le nom local du référentiel, c'est très simple avec $ _ :
Mais si vous ne voulez pas retaper des noms longs, c'est un peu moche mais faisable avec sed:
EDIT: Eh bien, je vais remercier Manav (commentaire ci-dessous) pour le terse
mais cela ne fonctionne pas dans zsh (quelque chose sur la façon dont zsh fait des expansions fait qu'il ne traite pas la première commande comme une entrée
!$
). Je devais regarder ce!$:t
qui se passait ( Avancer dans le shell Bash | $ {me:-importe quoi} ).!$
saisit la dernière partie de la commande précédente et:t
"supprime tous les composants de nom de fichier principaux en laissant la queue". Bonne information, mais j'aimerais pouvoir le faire fonctionner avec zsh (j'ai essayénoglob
sans succès).EDIT: Au lieu d’utiliser
sed
or!$:t
(qui ne fonctionne pas dans zsh, pour moi en tout cas), j’ai trouvé deux autres options (l’une adaptant https://unix.stackexchange.com/users/5685/frederik-deweerdt avec https : //unix.stackexchange.com/users/129926/ Commentaire dehenrik-n ):ou
la source
git clone foo/bar && cd !$:t
.git
vous pouvez utiliser!$:t:r
pour obtenir le nom du dossier.Une solution simple pour tout shell POSIX consiste à spécifier le répertoire à cloner explicitement (n'importe quel chemin de système de fichiers) et à le réutiliser:
et
quand tu as fini.
la source
Vous pourriez faire quelque chose comme:
C'est assez simpliste. C'est un
precmd
crochet (exécuté avant chaque invite), qui vérifie si la dernière ligne de commande ressemble àgit clone .../something
ougit clone .../something dir
, devine le répertoire à partir de celui-ci et y est inséré.Cela ne fonctionne pas si vous entrez
git clone foo; whatever
ouwhatever; git clone foo
ougit clone --option repo
...la source
CDing into <project>
etclone_check:cd:17: no such file or directory: <project>
. L'erreur disparaît dès que la dernière commande exécutée avant la fermeture du terminal est différente de$ git clone
.Voici une adaptation de la réponse ci-dessus pour
OSX
mktemp
nécessite un paramètre supplémentairegit clone
écritSTDERR
par défaut (voir ceci )Une fonction:
la source
Je ne le recommanderais pas, mais vous pouvez utiliser ce one-liner:
echo 'project' | xargs -I % sh -c 'git clone https://github.com/username/%.git && cd %'
la source
Incluez ceci dans votre shell:
Cela fonctionne en éliminant subrepticement la cible de clonage de l'erreur standard de git et
cd
l'incroyant dans la cible si (et seulement si) le clonage a été un succès.Il accepte tous les arguments et options proposés par le standard
git clone
.Soit vous pouvez utiliser le wrapper git sans avoir à vous soucier de vos achèvements, soit vous pouvez vous en débarrasser et rewire vos
git clone
achèvementsgit-clone
.la source