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
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 sokeasticlone
-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>
jaclone_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 oletuksenaSTDERR
(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"; }
git clone
-käyttöä, koska kaikista työkaluista, jotka minun on vaihdettava, jos en käyttäisigit
. Keskitin on aliaksina git, oh-my-zsh tarjoaa automaattisen täydennyksen jne. …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äänrakennetullacd
. Jos haluat soittaa numeroonhub
git
-kohdan sijaan, tee se funktiossa. Jos haluat, että se vaikuttaa vain komentoonclone
, tarkista toiminnon toiminto. jne.basename [email protected]:pckujawa/pattern-rec.git
johtaa malliin rec.git – jätätkö vain .git-laajennuksen kloonatessasi?basename
vie myös pääte-argumentin, joten voit tehdä:git clone $1 && cd $(basename $1 .git)