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
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 porclone
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>
eclone_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 emSTDERR
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"; }
git clone
porque de todas as ferramentas que eu teria que mudar se não estivesse usandogit
. Hub tem o alias de git, oh-my-zsh fornece preenchimento automático, etc …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 ocd
integrado. Se você deseja chamarhub
em vez degit
, faça isso na função. Se você deseja que isso afete apenas o comandoclone
, verifique a ação na função. etc.basename [email protected]:pckujawa/pattern-rec.git
resulta em pattern-rec.git – você simplesmente deixa de fora a extensão .git quando clona?basename
também aceita um argumento de sufixo, então você pode fazer:git clone $1 && cd $(basename $1 .git)