Chci automaticky cd
do adresáře vytvořeného clone
po něčem git clone
d něco.
Důležité: Nechci měnit syntaxi příkazu (např. použít alias / funkci), protože by to rozbilo zsh-dokončení, které dostávám automaticky z projektu Pretzo
.
EDIT : Důvod, proč jsem žádnou odpověď nevybral jako správnou, je ten, že žádná odpověď nebyla vzhledem k tomu, že splňoval výše uvedenou podmínku.
Používám ZSH, ale přijatelná je také odpověď v jakémkoli jiném prostředí.
Komentáře
Odpověď
Vytvořit funkci:
gclonecd() { git clone "$1" && cd "$(basename "$1" .git)" }
(Funguje pro oba odkazy sa bez „.git“)
Komentáře
- Chtěl bych nadále používat
git clone
protože ze všech nástrojů, které bych musel změnit, kdybych nepoužívalgit
. Centrum je aliasováno jako git, oh-my-zsh poskytuje automatické dokončování atd … - @Wildeyes
git
nelze ‚ změnit pracovní adresář vašeho shellu, takže ‚ jej budete muset zabalit v alias / funkci, která dělá to, co chcete, a navazuje na integrovanýcd
. Pokud chcete volathub
místogit
, udělejte to ve funkci. Pokud chcete, aby to ovlivnilo pouze příkazclone
, zkontrolujte akci ve funkci. atd. - Všiml jsem si, že
basename [email protected]:pckujawa/pattern-rec.git
má za následek pattern-rec.git – stačí při klonování vynechat příponu .git? - @Pat
basename
také vezme argument přípony, takže můžete udělat:git clone $1 && cd $(basename $1 .git)
Odpověď
git clone
vyžaduje další argument: adresář, který se má použít. Můžete jej klonovat do aktuálního pracovního adresáře pomocí git clone URL .
Potom není nutné pracovní adresář měnit; už jste tam.
Pokud opravdu chcete, aby příkaz git
skutečně změnil pracovní adresář, můžete jej změnit na funkci, která volá skutečný git
v případě potřeby:
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 }
Komentáře
- To bylo přesně co jsem hledal. Poté, co jsem si uvědomil, že neexistují žádné vnitřní háčky nebo něco takového, jsem napsal téměř přesnou funkci 🙂
- @Wildeyes Ano: mít
/tmp
svazek, který je v RAM, jako každý moderní Linux prostřednictvím tmpfs. Proč by vás vůbec zajímalo psaní na disk, když jste ‚ právě provedli git klon, který vytváří adresáře a na disk zapisuje možná stovky souborů … - Máte ‚ pravděpodobně pravdu o celé “ nvm, pokud zapisuje na disk “ věc, jen jsem hledal záchranu dalších operací. Díky moc Kaz.
- Buďte opatrní. je
git [flags] command [arguments]
, takže slepě požadujícíclone
na určité pozici selže. - Přidání “ skutečná “ nápověda k cestě? Líbí se: git_real_home =
which git
git () {… $ git_real_home “ $ @ “ | tee $ tmp
Odpověď
Pokud zadáte místní název repo, je jeho použití opravdu snadné $ _ :
git clone [email protected]:npm/npm.git npm-local-dir && cd $_
Pokud ale nechcete psát dlouho jména, je to „ošklivé, ale proveditelné se sed:
git clone [email protected]:pckujawa/pattern-rec.git && cd `echo $_ | sed -n -e "s/^.*\/\([^.]*\)\(.git\)*/\1/p"`
EDIT: No, chtěl jsem poděkovat Manavovi (komentář níže) za strohý
git clone foo/bar && cd !$:t
ale nefunguje v zsh ( něco o jak zsh dělá expanze způsobí, že nebude zacházet s prvním příkazem jako se vstupem !$
). Musel jsem vyhledat, co !$:t
udělal ( Postup v Bash Shell | $ {me: -everever} ) . !$
popadne poslední část předchozího příkazu a :t
odebere všechny hlavní komponenty názvu souboru a ponechá ocas.„Dobré informace, ale přál bych si, aby se mi podařilo pracovat se zsh (zkusil jsem noglob
bez úspěchu).
EDIT: Místo použití sed
nebo !$:t
(což pro mě každopádně nefunguje v zsh), našel jsem dvě další možnosti (jednu přizpůsobení https://unix.stackexchange.com/users/5685/frederik-deweerdt “ odpověď s https://unix.stackexchange.com/users/129926/henrik-n „s komentář):
git clone [email protected]:npm/npm.git && cd $(basename $_ .git)
nebo
git clone [email protected]:npm/npm.git && cd ${${_%%.git*}##*/}
Komentáře
-
git clone foo/bar && cd !$:t
- Pokud vaše adresa URL úložiště končí
.git
můžete použít!$:t:r
k získání názvu složky.
Odpovědět
Jednoduchým řešením pro libovolný shell POSIX je specifikovat adresář, do kterého se má klonovat (libovolná cesta k souborovému systému), a znovu jej použít:
git clone <repository> <directory> && cd "$_"
a
cd -
až budete hotovi.
Answ er
Dalo by se udělat něco jako:
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)
Je to docela zjednodušující. Je to „sa precmd
zavěšení (provedeno před každou výzvou), které kontroluje, zda poslední příkazový řádek vypadal jako git clone .../something
nebo git clone .../something dir
, hádejte z toho adresář a do něj cd.
Nepracuje, pokud jste zadali git clone foo; whatever
nebo whatever; git clone foo
nebo git clone --option repo
…
Komentáře
- +1 Děkuji moc za kód; ‚ používám to již několik dní. ‚ jsem si právě všiml jednoho problému; pokud terminál zavřete hned po klonování nějakého projektu, při příštím otevření terminálu si zsh stěžuje na dvě chybové zprávy:
CDing into <project>
aclone_check:cd:17: no such file or directory: <project>
. Chyba zmizí, jakmile se poslední příkaz, který jste spustili před zavřením terminálu, liší od$ git clone
.
Odpovědět
Zde je úprava výše uvedené odpovědi pro OSX
-
mktemp
vyžaduje další parametr -
git clone
ve výchozím nastavení zapíše doSTDERR
(viz toto )
Funkce:
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 }
Komentáře
- Existuje 7 odpovědí, které zobrazují “ nad “ vaší. Ale to se může časem změnit. Takové odkazy nemají pro SE smysl, upravte prosím svou odpověď a uveďte odkaz na odpověď, na kterou jste odkazovali.
Odpověď
Ve vašem požadavku je zásadní problém, díky kterému je téměř nemožné ho dosáhnout: git je v tomto případě podřízený proces prostředí a podřízené procesy ve většině operačních systémů nejsou schopny upravit prostředí rodičů. Takže , jediný způsob, jak to udělat, by bylo ze strany prostředí – implementací aliasu nebo funkce.
Další podrobnosti naleznete zde: https://stackoverflow.com/questions/2375003/how-do-i-set-the-working-directory-of-the-parent-process
Odpověď
Nedoporučuji to, ale můžete použít tuto jednorázovou linku:
echo "project" | xargs -I % sh -c "git clone https://github.com/username/%.git && cd %"
Odpovědět
Zahrňte to do svého shellu:
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" }
Funguje to tak, že tajně získáte klonovací cíl ze standardní chyby gitu a cd
„ing do cíle, pokud (a pouze pokud) bylo klonování úspěšné.
Přijímá všechny argumenty a možnosti, které běžný git clone
dělá.
Buď můžete použít obal git a nemusíte se starat o své dokončení, nebo se můžete zbavit obalu git a znovu zapojit své git clone
dokončení div id = „05cddf7296“>
.
Odpověď
Vyrobil jsem to na základě @ frederik-deweerdt odpověď.
Takže můžete uživatele klonovat do clone
repo odkazu, který je ve schránce, pokud o tom informujete, klonuje, než vstoupí.
Je nutné nainstalovat xclip
.
clone() { if [ -z "$1" ] then local repo=$(xclip -o) else local repo=$1 fi git clone "$repo" && cd "$(basename "$repo" .git)" }
Odpovědět
Další implementace také zpracovává další argumenty k příkazu git clone
.
Správně cd
„do poskytnuté složky nebo výchozího názvu úložiště git.
Použití
gclonecd https://github.com/example/repo gclonecd https://github.com/example/repo my-custom-folder
Bash funkce
# 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"; }
~/.bashrc
souboru (například) a pro mě na l na východ to ‚ nefungovalo, potřeboval jsem to opravit nahrazením řádku:/usr/bin/git "$@" 2>&1 | tee $tmp