Szeretnék automatikusan cd átjutni a clone parancs I git clone d után.

Fontos: Nem akarom megváltoztatni a parancs szintaxisát (pl. használjunk álnevet / függvényt), mert ez megszakítaná azokat a zsh-kiegészítéseket, amelyeket automatikusan kapok a Pretzo projektből.

SZERKESZTÉS : Annak oka, hogy egyetlen választ sem választottam helyesnek, az az, hogy nem mivel ez megfelelt a fenti feltételnek.

ZSH-t használok, de bármely más shellben is elfogadható a válasz.

Megjegyzések

  • Tetszik a válasz unix.stackexchange.com/questions/97920/… megemlíteni, hogy ezt a függvényt például a ~/.bashrc fájlba írjam, nekem pedig az l keletre nem működött, ‘ nem működött, javítanom kellett a sor helyettesítésével: /usr/bin/git "$@" 2>&1 | tee $tmp

Válasz

Funkció létrehozása:

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

(Mindkét linkre működik “.git” nélkül és nélkül)

Megjegyzések

  • Szeretném továbbra is használni a git clone fájlt, mert az összes olyan eszköz közül, amelyet meg kellene változtatnom, ha nem a git -t használnám. A Hub neve alias, mint a git, az oh-my-zsh biztosítja az automatikus kitöltést stb. …
  • @Wildeyes git ‘ nem tudja megváltoztatni a shell munkakönyvtárát, így ‘ mindkét esetben be kell csomagolnia egy álnévben / függvényben, amely megteszi, amit akar, és követi a beépített cd. Ha a hub számot szeretné meghívni a git helyett, tegye meg ezt a függvényben. Ha azt szeretné, hogy csak a clone parancsot érinti, ellenőrizze, hogy van-e művelet a függvényben. stb.
  • Észrevettem, hogy a basename [email protected]:pckujawa/pattern-rec.git minta-rec.git eredményt hoz – klónozáskor csak elhagyja a .git kiterjesztést?
  • @Pat basename szintén utótag argumentumot vesz fel, így megteheti: git clone $1 && cd $(basename $1 .git)

Válasz

git clone további argumentumot vesz fel: a használandó könyvtárat. A git clone URL . paranccsal klónozhatja az aktuális munkakönyvtárba. Ekkor nincs szükség a munkakönyvtár megváltoztatására; már ott vagy.

Ha valóban azt akarod, hogy a git parancs valóban megváltoztassa a munkakönyvtárat, megváltoztathatja egy olyan függvényre, amely a valós git ha szükséges:

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 } 

megjegyzések

  • Pontosan így volt amit kerestem. Miután rájöttem, hogy nincsenek belső horgok, vagy valami ilyesmi, majdnem pontos függvényt írtam 🙂
  • @Wildeyes Igen: legyen /tmp kötet, amely A RAM, mint minden modern Linux a tmpf-eken keresztül. Egyébként miért érdekelne a lemezre történő írás, amikor ‘ éppen egy git klónt készített, amely könyvtárakat hoz létre, és talán több száz fájlt ír a lemezre …
  • Ön ‘ valószínűleg igaza van az egész ” nvm-mel kapcsolatban, ha a lemezre ír ” dolog, csak arra törekedtem, hogy extra műveleteket spóroljak meg. Nagyon köszönöm Kaz.
  • Legyen óvatos. ez git [flags] command [arguments], ezért a clone vakon történő kérése bizonyos pozícióban kudarcot vall.
  • A ” valós ” elérési út? Például: git_real_home = which git git () {… $ git_real_home ” $ @ ” | tee $ tmp

Válasz

Ha megadod a repo helyi nevét, akkor nagyon könnyű használni $ _ :

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

De ha nem akar újból gépelni nevek, ez “kicsit csúnya, de a sed-kel megvalósítható:

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

SZERKESZTÉS: Nos, köszönetet mondtam Manavnak (az alábbi megjegyzés) a rövidítésért

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

de nem működik a zsh ( valami arról, hogy hogyan hajtja végre a zsh a bővítéseket , az azt eredményezi, hogy az első parancsot nem az !$ bemenetként kezeli. Meg kellett vizsgálnom, mit csinált a !$:t ( Haladás a Bash Shellben | $ {me:-bármi} ) . !$ megragadja az előző parancs utolsó részét, és :t “eltávolítja az összes vezető fájlnév-összetevőt, a farok marad.”Jó információ, de bárcsak elérhetném, hogy működjön együtt a zsh-vel (megpróbáltam noglob -t sikertelenül).

SZERKESZTÉS: A sed vagy !$:t (ami egyébként nem működik zsh-ben, nekem egyébként), találtam két másik opciót (az egyik a https://unix.stackexchange.com/users/5685/frederik-deweerdt válasz a következővel: https://unix.stackexchange.com/users/129926/henrik-n “megjegyzés):

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

vagy

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

megjegyzések

  • git clone foo/bar && cd !$:t
  • Ha a repo URL .git a !$:t:r paranccsal megkaphatja a mappa nevét.

Válasz

Egyszerű megoldás bármely POSIX-héjra, ha megadja a klónozni kívánt könyvtárat (bármilyen fájlrendszer-elérési utat), és újból felhasználja:

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

és

cd - 

amikor végzett.

Válasz er

Ilyen lehet:

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) 

Elég egyszerű. “Sa precmd kampó (minden egyes parancs előtt végrehajtva) ellenőrzi, hogy az utolsó parancssor git clone .../something vagy git clone .../something dir, találd ki onnan a könyvtárat és a cd-t.

Nem működik, ha a következőt adta meg: git clone foo; whatever vagy whatever; git clone foo vagy git clone --option repo

megjegyzések

  • +1 köszönöm nagyon kéred a kódot; ‘ Néhány nap óta használom. ‘ Épp most vettem észre egy kérdést; ha valamilyen projekt klónozása után azonnal bezárja a terminált, a következő alkalommal, amikor megnyit egy terminált, a zsh két hibaüzenettel panaszkodik: CDing into <project> és clone_check:cd:17: no such file or directory: <project>. A hiba eltűnik, amint az utolsó parancs, amelyet a terminál bezárása előtt futtatott, eltér a $ git clone -től.

Válasz

Íme a fenti válasz adaptációja a következőhöz: OSX

  • mktemp további paraméterre van szükség
  • git clone alapértelmezés szerint a STDERR címre ír (lásd: ez )

Funkció:

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 } 

megjegyzések

  • 7 válasz van, amely ” -et jelenít meg ” felett. De idővel változhat. Az ilyen hivatkozásoknak nincs értelme az SE-n, kérjük, szerkessze a válaszát, és mellékeljen egy hivatkozást arra a válaszra, amelyre hivatkozott.

Válasz

A kérésével egy olyan alapvető probléma merül fel, amely szinte lehetetlenné teszi a megvalósítását: a git ebben az esetben a shell gyermekfolyamata, és a gyermekfolyamatok a legtöbb operációs rendszerben nem képesek módosítani a szülő környezetét. , ennek egyetlen módja a héj felől lenne – álnév vagy függvény megvalósításával.

További részletek itt találhatók: https://stackoverflow.com/questions/2375003/how-do-i-set-the-working-directory-of-the-parent-process

Válasz

Nem ajánlanám, de használhatná ezt az egyvonalas vonalat:

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

Válasz

Ezt vegye fel a shelljébe:

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

Ez úgy működik, hogy a klónozó célt a git szokásos hibájából titokban lehúzza. és cd “ing a célba, ha (és csak akkor), ha a klónozás sikeres volt.

Minden olyan argumentumot és beállítást elfogad, amelyet a szokásos git clone.

Vagy használhatja a git burkolót, és nem kell aggódnia a befejezései miatt, vagy megszabadulhat a git burkolótól, és újból bekötheti a git clone befejezéseket div id = “05cddf7296”>

.

Válasz

Ezt a @ frederik-deweerdt alapján készítettem válasz.

Így a felhasználó egyszerűen klónozhatja a clone vágólapon lévő repo linket, ha tájékoztatja a repót, akkor klónoz, mint belép.

A xclip telepítése szükséges.

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

Válasz

Egy másik megvalósítás további argumentumokat is kezel a git clone parancshoz.

Helyesen cd “s a megadott mappába vagy az alapértelmezett git repo név.

Használat

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

Bash funkció

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük