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

  • Ik vind het antwoord leuk unix.stackexchange.com/questions/97920/… , maar het heeft om te vermelden dat je die functie moet schrijven op ~/.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

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 ik git 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 ingebouwde cd. Als je hub wilt aanroepen in plaats van git, doe dat dan in de functie. Als je wilt dat het alleen invloed heeft op het clone 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 naar clone 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> en clone_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 naar STDERR (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"; }  

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *