Как автоматически cd после git clone?

Я хочу автоматически cd в каталог, созданный с помощью clone после I git clone d что-то.

Важно: Я не хочу изменять синтаксис команды (например, использовать псевдоним /функцию), потому что это приведет к поломке zsh-завершений, которые я получаю автоматически из Pretzo.

РЕДАКТИРОВАТЬ . Причина, по которой я не выбрал правильный ответ, заключается в том, что ответа не было, что соответствовало вышеприведенному условию.

Я использую ZSH, но ответ в любой другой оболочке также приемлем.

28 голосов | спросил Cat Boss 28 +04002013-10-28T18:10:07+04:00312013bEurope/MoscowMon, 28 Oct 2013 18:10:07 +0400 2013, 18:10:07

8 ответов


15

git clone принимает дополнительный аргумент: используемый каталог. Вы можете сделать его клонированным в текущий рабочий каталог с помощью git clone URL . Тогда нет необходимости менять рабочий каталог; вы уже там.

Если вы действительно хотите, чтобы команда git фактически меняла рабочий каталог, вы можете изменить ее на функцию, которая вызывает реальный ---- +: = 3 =: + ---- при необходимости:

git
ответил Kaz 28 +04002013-10-28T22:20:55+04:00312013bEurope/MoscowMon, 28 Oct 2013 22:20:55 +0400 2013, 22:20:55
13

Создайте функцию:

gclonecd() {
  git clone "$1" && cd "$(basename "$1")"
}
ответил Frederik Deweerdt 28 +04002013-10-28T18:21:42+04:00312013bEurope/MoscowMon, 28 Oct 2013 18:21:42 +0400 2013, 18:21:42
6

Если вы указали локальное имя репо, это очень просто, используя $ _ :

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

Но если вы не хотите повторно вводить длинные имена, это немного уродливо, но можно с sed:

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

EDIT: Хорошо, я собирался поблагодарить Манава (комментарий ниже) за краткий

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

, но он не работает в zsh (что-то о как zsh делает расширения заставляет его не обрабатывать первую команду в качестве входных данных для !$). Мне пришлось посмотреть, что сделал !$:t ( Переход в оболочку Bash | $ {me: -whatever} ). !$ захватывает последнюю часть предыдущей команды и :t будет «Удалить все ведущие компоненты имени файла, оставив хвост». Хорошая информация, но мне жаль, что я не смог заставить ее работать с zsh (я пробовал noglob без успеха).

EDIT: вместо использования sed или !$:t (что не работает в zsh, для меня в любом случае), я нашел еще два варианта (один адаптировался https : //unix.stackexchange.com/users/5685/frederik-deweerdt с ответом https: //unix.stackexchange.com/users/129926/henrik-n комментарий:

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

или

git clone [email protected]:npm/npm.git && cd ${${_%%.git*}##*/}
ответил Pat 28 J0000006Europe/Moscow 2014, 03:46:38
2

Ниже приведена адаптация приведенного выше ответа для OSX

  • mktemp требуется дополнительный параметр
  • git clone записывается в STDERR по умолчанию (см. здесь )

Функции:

function git {
   local tmp=$(mktemp -t git)
   local repo_name

   if [ "$1" = clone ] ; then
     command git "[email protected]" --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 "[email protected]"
   fi
}
ответил davidhq 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 21 Sep 2015 13:13:20 +0300 2015, 13:13:20
1

Простым решением для любой оболочки POSIX является указание каталога для клонирования явно (любой путь к файловой системе) и повторного использования:

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

и

cd -

, когда вы закончите.

ответил Sander Maijers 14 PMpThu, 14 Apr 2016 17:01:52 +030001Thursday 2016, 17:01:52
0

Я бы не рекомендовал его, но вы могли использовать этот однострочный шрифт:

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

ответил christianbundy 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 26 Sep 2014 03:22:23 +0400 2014, 03:22:23
0

Вы можете сделать что-то вроде:

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)

Это довольно упрощенно. Это крючок precmd (выполняется перед каждым приглашением), который проверяет, была ли последняя строка командной строки похожей на git clone .../something или git clone .../something dir, угадать каталог из этого и cd в него.

Это не работает, если вы ввели git clone foo; whatever или whatever; git clone foo или git clone --option repo ...

ответил Stéphane Chazelas 14 PMpThu, 14 Apr 2016 17:31:59 +030031Thursday 2016, 17:31:59
0

Включите это в свою оболочку:

git(){
  case "$1" in clone) git-clone "${@:2}";; *) command git "[email protected]";; esac
}
git-clone(){ 
   local tgt 
   tgt=$(command git clone "[email protected]" 2> >(tee /dev/stderr |head -n1 | cut -d \' -f2)) ||
      return $?
   cd "$tgt"
}

Это работает, тщательно скрывая цель клонирования от стандартной ошибки git и cd 'в цель, если (и только если) клонирование было успешным.

Он принимает все аргументы и опции, которые выполняет обычный git clone.

Либо вы можете использовать оболочку git, и не беспокоиться о своих завершении, либо можете избавиться от оболочки git и переустановить свой git clone до git-clone.

ответил PSkocik 14 PMpThu, 14 Apr 2016 17:48:25 +030048Thursday 2016, 17:48:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132