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

  • Líbí se mi odpověď unix.stackexchange.com/questions/97920/… , ale je potřeba zmínit napsat tuto funkci na ~/.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

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žíval git. 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 volat hub místo git, udělejte to ve funkci. Pokud chcete, aby to ovlivnilo pouze příkaz clone, 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> a clone_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 do STDERR (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"; }  

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *