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
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 aclone
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>
ésclone_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 aSTDERR
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"; }
git clone
fájlt, mert az összes olyan eszköz közül, amelyet meg kellene változtatnom, ha nem agit
-t használnám. A Hub neve alias, mint a git, az oh-my-zsh biztosítja az automatikus kitöltést stb. …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ítettcd
. Ha ahub
számot szeretné meghívni agit
helyett, tegye meg ezt a függvényben. Ha azt szeretné, hogy csak aclone
parancsot érinti, ellenőrizze, hogy van-e művelet a függvényben. stb.basename [email protected]:pckujawa/pattern-rec.git
minta-rec.git eredményt hoz – klónozáskor csak elhagyja a .git kiterjesztést?basename
szintén utótag argumentumot vesz fel, így megteheti:git clone $1 && cd $(basename $1 .git)