Desejo automaticamente cd para o diretório criado pelo clone comando após I git clone d algo.

Importante: Não quero alterar a sintaxe do comando (por exemplo, usar um alias / função) porque isso quebraria as conclusões zsh que obtenho automaticamente no projeto Pretzo.

EDITAR : A razão pela qual não escolhi nenhuma resposta como correta é porque nenhuma resposta foi visto que cumpria a condição acima.

Eu uso ZSH, mas uma resposta em qualquer outro shell também é aceitável.

Comentários

  • Gosto da resposta unix.stackexchange.com/questions/97920/… , mas precisa mencionar para escrever essa função no arquivo ~/.bashrc (por exemplo) e para mim em l a leste não ‘ funcionou, precisei corrigi-lo substituindo a linha: /usr/bin/git "$@" 2>&1 | tee $tmp

Resposta

Crie uma função:

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

(Funciona para links ambos com e sem “.git”)

Comentários

  • Eu gostaria de continuar usando git clone porque de todas as ferramentas que eu teria que mudar se não estivesse usando git. Hub tem o alias de git, oh-my-zsh fornece preenchimento automático, etc …
  • @Wildeyes git não pode ‘ alterar o diretório de trabalho de seu shell, portanto, de qualquer forma, você ‘ terá que embrulhá-lo em um alias / função que faz o que você deseja e segue com o cd integrado. Se você deseja chamar hub em vez de git, faça isso na função. Se você deseja que isso afete apenas o comando clone, verifique a ação na função. etc.
  • Notei que basename [email protected]:pckujawa/pattern-rec.git resulta em pattern-rec.git – você simplesmente deixa de fora a extensão .git quando clona?
  • @Pat basename também aceita um argumento de sufixo, então você pode fazer: git clone $1 && cd $(basename $1 .git)

Resposta

git clone recebe um argumento adicional: o diretório a ser usado. Você pode fazê-lo clonar no diretório de trabalho atual com git clone URL . Então, não há necessidade de alterar o diretório de trabalho; você já está lá.

Se você realmente deseja que o comando git mude o diretório de trabalho, você pode alterá-lo para uma função que chama o git quando necessário:

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 } 

Comentários

  • Isso foi exatamente o que eu estava procurando. Depois de perceber que não há ganchos internos ou algo parecido, escrevi uma função quase exata 🙂
  • @Wildeyes Sim: tem um /tmp volume que está em RAM, como qualquer Linux moderno via tmpfs. De qualquer forma, por que você se importaria em gravar no disco, quando ‘ acabou de fazer um clone do git, que cria diretórios e grava talvez centenas de arquivos no disco …
  • Você ‘ provavelmente está certo sobre todo o ” nvm se ele gravar no disco ” coisa, eu só estava tentando salvar operações extras. Muito obrigado, Kaz.
  • Tenha cuidado. é git [flags] command [arguments], portanto, pedir cegamente por clone em determinada posição falhará.
  • Adicionar o ” real ” ajuda para o caminho? Como: git_real_home = which git git () {… $ git_real_home ” $ @ ” | tee $ tmp

Resposta

Se você fornecer o nome local do repo, é muito fácil usar $ _ :

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

Mas se você não quiser digitar novamente por muito tempo nomes, é um pouco feio, mas factível com sed:

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

EDITAR: Bem, eu ia agradecer Manav (comentário abaixo) pelo conciso

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

mas não “funciona em zsh ( algo sobre como zsh faz as expansões faz com que ele não trate o primeiro comando como entrada para !$). Tive que pesquisar o que !$:t fez ( Avançando no Bash Shell | $ {me: -whatever} ) . !$ pega a última parte do comando anterior e :t irá “Remover todos os componentes principais do nome do arquivo, deixando a cauda.”Boas informações, mas gostaria de fazê-lo funcionar com zsh (tentei noglob sem sucesso).

EDITAR: Em vez de usar sed ou !$:t (que não funciona em zsh, pelo menos para mim), encontrei duas outras opções (uma adaptando https://unix.stackexchange.com/users/5685/frederik-deweerdt ” resposta com https://unix.stackexchange.com/users/129926/henrik-n “s comentário):

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

ou

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

Comentários

  • git clone foo/bar && cd !$:t
  • Se o url do repo terminar em .git você pode usar !$:t:r para obter o nome da pasta.

Resposta

Uma solução simples para qualquer shell POSIX é especificar o diretório para clonar explicitamente (qualquer caminho do sistema de arquivos) e reutilizá-lo:

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

e

cd - 

quando terminar.

Resposta er

Você poderia fazer algo como:

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) 

É bastante simplista. É “sa precmd hook (executado antes de cada prompt), que verifica se a última linha de comando se parecia com git clone .../something ou git clone .../something dir, adivinhe o diretório desse diretório e faça cd nele.

Não funcionará se você inserir git clone foo; whatever ou whatever; git clone foo ou git clone --option repo

Comentários

  • +1 Obrigado muito pelo código; Eu ‘ estou usando há alguns dias. Eu ‘ acabei de notar um problema; se você fechar o terminal logo após clonar algum projeto, da próxima vez que você abrir um terminal, zsh reclamará com duas mensagens de erro: CDing into <project> e clone_check:cd:17: no such file or directory: <project>. O erro desaparece assim que o último comando executado antes de fechar o terminal for diferente de $ git clone.

Resposta

Aqui está uma adaptação da resposta acima para OSX

  • mktemp requer parâmetro adicional
  • git clone grava em STDERR por padrão (consulte this )

Função:

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 } 

Comentários

  • Existem 7 respostas que exibem ” acima ” as suas. Mas isso pode mudar com o tempo. Essas referências não fazem sentido no SE, edite sua resposta e inclua um link para a resposta à qual você se referia.

Resposta

Há um problema fundamental com sua solicitação que a torna quase impossível de ser alcançada: git é um processo filho do shell neste caso, e os processos filhos são incapazes de modificar o ambiente pai na maioria dos sistemas operacionais. , a única maneira de fazer isso seria do lado do shell – implementando um alias ou função.

Você pode encontrar detalhes adicionais aqui: https://stackoverflow.com/questions/2375003/how-do-i-set-the-working-directory-of-the-parent-process

Resposta

Eu não recomendaria, mas você poderia usar esta linha única:

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

Resposta

Inclua isso em seu shell:

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

Isso funciona sub-repticiamente retirando o alvo de clonagem do erro padrão do git e cd “ing no destino se (e somente se) a clonagem for um sucesso.

Ele aceita todos os argumentos e opções que o git clone normal aceita.

Você pode usar o git wrapper e não precisa se preocupar com suas conclusões ou pode se livrar do git wrapper e religar suas git clone conclusões para git-clone.

Resposta

Fiz isso com base em @ frederik-deweerdt resposta.

Para que o usuário possa apenas clonar clone o link do repo que está na área de transferência, se você informar o repo, ele clona e depois entra.

É necessário instalar xclip.

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

Resposta

Outra implementação, também lida com argumentos adicionais para o comando git clone.

Corretamente cd “s na pasta fornecida ou no nome do repositório git padrão.

Uso

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

Função Bash

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *