Ik wil automatisch cd
naar de directory die is gemaakt door de clone
commando nadat ik git clone
iets heb gegeven.
Belangrijk: Ik wil de syntaxis voor het commando niet wijzigen (gebruik bijvoorbeeld een alias / functie) omdat het de zsh-aanvullingen zou breken die ik automatisch krijg van het Pretzo
project.
EDIT : De reden waarom ik geen antwoord als juist heb gekozen, is omdat er geen antwoord was gezien dat voldeed aan de bovenstaande voorwaarde.
Ik gebruik ZSH, maar een antwoord in een andere shell is ook acceptabel.
Opmerkingen
Answer
Maak een functie:
gclonecd() { git clone "$1" && cd "$(basename "$1" .git)" }
(Werkt voor links zowel met en zonder “.git”)
Reacties
- Ik zou
git clone
willen blijven gebruiken omdat van alle tools die ik zou moeten veranderen als ikgit
niet zou gebruiken. Hub heeft de alias git, oh-my-zsh zorgt voor automatische aanvulling, enz … - @Wildeyes
git
kan ‘ de werkdirectory van je shell niet wijzigen, dus je ‘ moet het in beide gevallen inpakken in een alias / functie die doet wat je wilt en deze opvolgt met het ingebouwdecd
. Als jehub
wilt aanroepen in plaats vangit
, doe dat dan in de functie. Als je wilt dat het alleen invloed heeft op hetclone
commando, controleer dan de actie in de functie. etc. - Ik heb gemerkt dat
basename [email protected]:pckujawa/pattern-rec.git
resulteert in pattern-rec.git – laat je de .git extensie gewoon weg als je klonen? - @Pat
basename
heeft ook een achtervoegselargument, dus je kunt het volgende doen:git clone $1 && cd $(basename $1 .git)
Answer
git clone
heeft een extra argument nodig: de directory die moet worden gebruikt. U kunt het laten klonen naar de huidige werkmap met git clone URL .
. Dan is het niet nodig om de werkmap te wijzigen; je bent er al.
Als je echt wilt dat het git
commando de werkdirectory daadwerkelijk verandert, kun je het veranderen in een functie die de echte git
indien nodig:
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 }
Opmerkingen
- Dat was precies wat ik zocht. Nadat ik me realiseerde dat er geen interne hooks of iets dergelijks zijn, schreef ik een bijna exacte functie 🙂
- @Wildeyes Ja: heb een
/tmp
-volume dat in RAM, zoals elke moderne Linux doet via tmpfs. Hoe dan ook, waarom zou het je iets schelen om naar de schijf te schrijven, als je ‘ zojuist een git-kloon hebt gedaan, die mappen maakt en misschien wel honderden bestanden naar de schijf schrijft … - Je ‘ hebt waarschijnlijk gelijk over de hele ” nvm als het naar schijf schrijft ” ding, ik was gewoon op zoek naar extra bewerkingen. Heel erg bedankt Kaz.
- Wees voorzichtig. het is
git [flags] command [arguments]
, dus blindelings vragen naarclone
in een bepaalde positie zal mislukken. - Zou het toevoegen van de ” echte ” padhulp? Zoals: git_real_home =
which git
git () {… $ git_real_home ” $ @ ” | tee $ tmp
Answer
Als je de lokale naam van de opslagplaats opgeeft, is het heel gemakkelijk te gebruiken $ _ :
git clone [email protected]:npm/npm.git npm-local-dir && cd $_
Maar als u niet lang opnieuw wilt typen namen, het is een beetje lelijk, maar goed te doen met sed:
git clone [email protected]:pckujawa/pattern-rec.git && cd `echo $_ | sed -n -e "s/^.*\/\([^.]*\)\(.git\)*/\1/p"`
EDIT: Nou, ik wilde Manav (commentaar hieronder) bedanken voor het korte
git clone foo/bar && cd !$:t
maar het werkt niet “in zsh ( iets over hoe zsh uitbreidingen uitvoert zorgt ervoor dat het het eerste commando niet behandelt als invoer voor !$
). Ik moest opzoeken wat !$:t
deed ( Doorgaan in de Bash Shell | $ {me: -whatever} ) . !$
pakt het laatste deel van het vorige commando en :t
zal “alle leidende bestandsnaamcomponenten verwijderen, de staart achterlatend.”Goede informatie, maar ik wou dat ik het kon laten werken met zsh (ik probeerde noglob
zonder succes).
EDIT: in plaats van sed
of !$:t
(wat voor mij toch niet werkt in zsh), ik vond twee andere opties (een aanpassing van https://unix.stackexchange.com/users/5685/frederik-deweerdt ” s antwoord met https://unix.stackexchange.com/users/129926/henrik-n “s commentaar):
git clone [email protected]:npm/npm.git && cd $(basename $_ .git)
of
git clone [email protected]:npm/npm.git && cd ${${_%%.git*}##*/}
Reacties
-
git clone foo/bar && cd !$:t
- Als je repo-url eindigt op
.git
je kunt!$:t:r
gebruiken om de mapnaam op te halen.
Antwoord
Een eenvoudige oplossing voor elke POSIX-shell is om de directory te specificeren waarnaar expliciet moet worden gekloond (elk bestandssysteempad) en deze opnieuw te gebruiken:
git clone <repository> <directory> && cd "$_"
en
cd -
als je klaar bent.
Antwoord er
Je zou zoiets kunnen doen als:
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)
Het is nogal simplistisch. Het is “sa precmd
hook (uitgevoerd voor elke prompt), die controleert of de laatste opdrachtregel eruitzag als git clone .../something
of git clone .../something dir
, raad de directory daaruit en cd erin.
Het werkt niet” als je git clone foo; whatever
of whatever; git clone foo
of git clone --option repo
…
Reacties
- +1 bedanken je heel erg voor de code; Ik ‘ gebruik het sinds een paar dagen. Ik ‘ heb net een probleem opgemerkt; als je de terminal sluit direct na het klonen van een project, klaagt zsh de volgende keer dat je een terminal opent met twee foutmeldingen:
CDing into <project>
enclone_check:cd:17: no such file or directory: <project>
. De fout verdwijnt zodra het laatste commando dat je hebt uitgevoerd voordat je de terminal sluit, verschilt van$ git clone
.
Antwoord
Hier is een aanpassing van het bovenstaande antwoord voor OSX
-
mktemp
vereist extra parameter -
git clone
schrijft standaard naarSTDERR
(zie this )
Functie:
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 }
Reacties
- Er zijn 7 antwoorden die ” boven ” de jouwe weergeven. Maar het kan in de loop van de tijd veranderen. Dergelijke verwijzingen slaan nergens op bij SE, bewerk uw antwoord en voeg een link toe naar het antwoord waarnaar u verwees.
Antwoord
Er is een fundamenteel probleem met je verzoek dat het bijna onmogelijk maakt om dit te bereiken: git is in dit geval een kindproces van de shell, en kindprocessen kunnen in de meeste besturingssystemen de omgeving van de ouders niet wijzigen. , de enige manier om dit te doen is vanaf de kant van de shell – door een alias of functie te implementeren.
Je kunt hier aanvullende details vinden: https://stackoverflow.com/questions/2375003/how-do-i-set-the-working-directory-of-the-parent-process
Antwoord
Ik zou het niet aanbevelen, maar je zou deze oneliner kunnen gebruiken:
echo "project" | xargs -I % sh -c "git clone https://github.com/username/%.git && cd %"
Antwoord
Neem dit op in je 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" }
Dit werkt door stiekem het kloondoel op te halen uit de standaardfout van Git en cd
“ing in het doelwit als (en alleen als) het klonen een succes was.
Het accepteert alle argumenten en opties die de reguliere git clone
doet.
Of je kunt de git wrapper gebruiken en je hoeft je geen zorgen te maken over je aanvullingen, of je kunt de git wrapper verwijderen en je git clone
aanvullingen opnieuw bedraden naar git-clone
.
Antwoord
Ik heb dit gemaakt op basis van @ frederik-deweerdt antwoord.
Dus je kunt de gebruiker gewoon klonen naar clone
de repo-link die op het klembord staat, als je de repo informeert, kloneert het en komt het binnen.
Het is vereist om xclip
te installeren.
clone() { if [ -z "$1" ] then local repo=$(xclip -o) else local repo=$1 fi git clone "$repo" && cd "$(basename "$repo" .git)" }
Antwoord
Een andere implementatie, verwerkt ook aanvullende argumenten voor het git clone
commando.
Juist cd
“s in de opgegeven map of de standaard git-repo-naam.
Gebruik
gclonecd https://github.com/example/repo gclonecd https://github.com/example/repo my-custom-folder
Bash-functie
# 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
bestand (bijvoorbeeld) en voor mij op l east het werkte niet ‘, ik moest het repareren door de regel te vervangen:/usr/bin/git "$@" 2>&1 | tee $tmp