Haluan automaattisesti cd hakemistoon, jonka clone -komento I git clone jälkeen jotain.

Tärkeää: En halua muuttaa komennon syntaksia (esim. käytä aliasta / funktiota), koska se rikkoo zsh-täydennykset, jotka saan automaattisesti Pretzo -projektista.

MUOKKAA : Syy, miksi en valinnut vastausta oikeeksi, johtuu siitä, ettei vastausta koska se vastasi yllä olevaa ehtoa.

Käytän ZSH: ta, mutta myös muussa kuoressa oleva vastaus on hyväksyttävä.

Kommentit

  • Pidän vastauksesta unix.stackexchange.com/questions/97920/… , mainita tämän funktion kirjoittaminen ~/.bashrc -tiedostoon (esimerkiksi) ja minulle l itään se ei toiminut ’ ei, minun oli korjattava se korvaamalla rivi: /usr/bin/git "$@" 2>&1 | tee $tmp

vastaus

Luo funktio:

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

(Toimii molempien linkkien kanssa ”.git” -kuvakkeen kanssa ja ilman sitä)

Kommentit

  • Haluan jatkaa git clone -käyttöä, koska kaikista työkaluista, jotka minun on vaihdettava, jos en käyttäisi git. Keskitin on aliaksina git, oh-my-zsh tarjoaa automaattisen täydennyksen jne. …
  • @Wildeyes git ei voi ’ t muuttaa komentotulkin työhakemistoa, joten kummallakin tavalla ’ sinun on pakattava se aliaksessa / toiminnossa, joka tekee mitä haluat ja seuraa sitä sisäänrakennetulla cd. Jos haluat soittaa numeroon hub git -kohdan sijaan, tee se funktiossa. Jos haluat, että se vaikuttaa vain komentoon clone, tarkista toiminnon toiminto. jne.
  • Huomasin, että basename [email protected]:pckujawa/pattern-rec.git johtaa malliin rec.git – jätätkö vain .git-laajennuksen kloonatessasi?
  • @Pat basename vie myös pääte-argumentin, joten voit tehdä: git clone $1 && cd $(basename $1 .git)

Vastaus

git clone vie ylimääräinen argumentti: käytettävä hakemisto. Voit tehdä siitä kloonatun nykyiseen työkansioon hakemistolla git clone URL .. Tällöin ei tarvitse muuttaa työhakemistoa; olet jo siellä.

Jos todella haluat, että git -komento todella muuttaa työhakemistoa, voit muuttaa sen funktioksi, joka kutsuu todellista git tarvittaessa:

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 } 

kommentit

  • Se oli täsmälleen mitä etsin. Kun huomasin, ettei sisäisiä koukkuja tai jotain sellaista ole, kirjoitin melkein tarkan toiminnon 🙂
  • @Wildeyes Kyllä: sinulla on /tmp -taltio, joka on RAM, kuten mikä tahansa moderni Linux tekee tmpfs: n kautta. Joka tapauksessa, miksi välittäisit kirjoittamasta levylle, kun ’ olet juuri tehnyt git-kloonin, joka luo hakemistoja ja kirjoittaa ehkä satoja tiedostoja levylle …
  • Sinulla ’ on todennäköisesti oikeassa koko ” nvm: ssä, jos se kirjoittaa levylle ” asia, halusin vain säästää ylimääräisiä toimintoja. Kiitos paljon Kaz.
  • Ole varovainen. se on git [flags] command [arguments], joten sokeasti clone -asiakirjan pyytäminen tietyssä asennossa epäonnistuu.
  • Olisiko ” todellinen ” polun apu? Kuten: git_real_home = which git git () {… $ git_real_home ” $ @ ” | tee $ tmp

Vastaa

Jos annat repon paikallisen nimen, sen käyttö on todella helppoa $ _ :

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

Mutta jos et halua kirjoittaa pitkiä nimiä, se on vähän ruma, mutta toteutettavissa sedillä:

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

MUOKKAA: Aion kiittää Manavia (kommentti alla) jakeesta

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

mutta se ei toimi zsh ( jotain miten zsh tekee laajennuksia saa sen olemaan käsittelemättä ensimmäistä komentoa syötteenä !$). Minun piti etsiä, mitä !$:t teki ( Edistyminen Bash-kuoressa | $ {me:-mitä tahansa} ) . !$ nappaa edellisen komennon viimeisen osan ja :t ”poistaa kaikki johtavat tiedostonimen komponentit jättäen hännän.”Hyvä tieto, mutta toivon, että saisin sen toimimaan zsh: n kanssa (yritin noglob ilman menestystä).

MUOKKAA: sed tai !$:t (joka ei toimi zsh: ssä, minulle joka tapauksessa), löysin kaksi muuta vaihtoehtoa (yhden sovittamalla https://unix.stackexchange.com/users/5685/frederik-deweerdt ” vastaus sanalla https://unix.stackexchange.com/users/129926/henrik-n ”kommentti):

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

tai

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

kommentit

  • git clone foo/bar && cd !$:t
  • Jos repo-URL-osoitteesi päättyy .git voit hakea kansion nimen käyttämällä !$:t:r.

Vastaa

Yksinkertainen ratkaisu mille tahansa POSIX-kuorelle on määritellä hakemisto, johon kloonattava erikseen (mikä tahansa tiedostojärjestelmän polku), ja käyttää sitä uudelleen:

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

ja

cd - 

kun olet valmis.

Vastaa er

Voisit tehdä esimerkiksi:

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) 

Se on melko yksinkertaista. Se ”sa precmd koukku (suoritetaan ennen kutakin kehotetta), joka tarkistaa, näyttikö viimeinen komentorivi git clone .../something vai git clone .../something dir, arvaa hakemisto siitä ja cd siihen.

Se ei toimi, jos syötit git clone foo; whatever tai whatever; git clone foo tai git clone --option repo

kommentit

  • +1 kiitos todella paljon koodia varten; ’ Käytän sitä muutaman päivän ajan. Olen ’ huomannut juuri yhden ongelman; Jos suljet päätelaitteen heti jonkin projektin kloonaamisen jälkeen, seuraavan kerran, kun avaat päätelaitteen, zsh valittaa kahdella virheilmoituksella: CDing into <project> ja clone_check:cd:17: no such file or directory: <project>. Virhe häviää heti, kun viimeinen komento, jonka suoritit ennen päätelaitteen sulkemista, on erilainen kuin $ git clone.

Vastaa

Tässä on yllä olevan vastauksen mukautus kohteelle OSX

  • mktemp vaatii lisäparametrin
  • git clone kirjoittaa oletuksena STDERR (katso tämä )

Toiminto:

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 } 

kommentit

  • On 7 vastausta, jotka näyttävät ” ” sinun. Mutta se voi muuttua ajan myötä. Tällaisilla viitteillä ei ole merkitystä SE: ssä, muokkaa vastaustasi ja lisää linkki viittaamaasi vastaukseen.

Vastaa

Pyyntösi sisältää perustavanlaatuisen ongelman, jonka saavuttaminen on melkein mahdotonta: git on tässä tapauksessa kuoren lapsiprosessi, eikä lapsiprosessit kykene muokkaamaan vanhemman ympäristöä useimmissa käyttöjärjestelmissä. Joten , ainoa tapa tehdä tämä olisi kuoren puolelta – ottamalla käyttöön aliakseksi tai funktioksi.

Löydät lisätietoja täältä: https://stackoverflow.com/questions/2375003/how-do-i-set-the-working-directory-of-the-parent-process

Vastaa

En suosittele sitä, mutta voisit käyttää tätä yksilinjaa:

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

Vastaa

Sisällytä tämä komentotulkkiin:

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

Tämä toimii poimimalla kloonauskohde salaa gitin vakiovirheestä ja cd ” kohteeseen, jos (ja vain jos) kloonaus onnistui.

Se hyväksyy kaikki argumentit ja vaihtoehdot, jotka tavallinen git clone tekee.

Joko voit käyttää git-kääreä eikä sinun tarvitse huolehtia suorituksistasi, tai voit päästä eroon git-kääreestä ja johdot git clone -korjauksesi uudelleen kohtaan git-clone.

vastaus

Olen tehnyt tämän @ frederik-deweerdt: n perusteella vastaus.

Joten voit vain kloonata clone leikepöydällä olevan repolinkin. Jos ilmoitat repolle, se kloonaa kuin tulee.

Se on asennettava xclip.

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

Vastaa

Toinen toteutus käsittelee myös lisäargumentteja komentoon git clone.

Oikein cd ”toimitettuun kansioon tai oletusarvoiseen git-repo-nimeen.

Käyttö

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

Bash-toiminto

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *