Как к CD автоматически после клона мерзавца?

Это не только, что Ваш терминал должен поддерживать 256 цветов, тема в энергии будет относиться к цветам в Вашем.Xdefaults/.Xresources. Для фиксации этого необходимо использовать те же цвета в качестве автора темы или использовать gvim вместо этого.

Заглядывание на код I видит, что поддерживает gvim правильно, вот почему с помощью работ CSAprox, поскольку это берет gvim цветовые коды в ШЕСТНАДЦАТЕРИЧНОМ ЧИСЛЕ (например.:#123ABC) и переводит их в терминальные цвета, я думаю.

Пример

Vim в консольном режиме возьмет цвета от:

hi Normal ctermfg=16 ctermbg=254

в то время как в графическом режиме:

hi Normal guifg=#d0d0d0 guibg=#202020

Так, при установке некоторой "темы" для терминальных цветов, она влияла бы на цвета, которые Вы получаете в Vim. Кроме того, двойная проверка, чтобы Вы имели

set background=dark

в Вашем .vimrc

37
15.04.2016, 05:37
11 ответов

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

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

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
}
17
27.01.2020, 19:36
  • 1
    Это было точно, что я искал. После того, как я понял, что нет никаких внутренних рычагов или чего-то как этот, я записал почти точный функциональный :) –  Daniel K. 28.10.2013, 21:38
  • 2
    @Wildeyes Да: имейте a /tmp объем, который находится в RAM, как любой современный Linux делает через tmpfs. Так или иначе, почему был бы Вы заботиться о записи в диск, когда Вы только что сделали клон мерзавца, который создает каталоги и записи, возможно, сотни файлов к диску... –  Kaz 29.10.2013, 21:02
  • 3
    Вы, вероятно, правы относительно целого "nvm, если оно пишет в диск" вещь, я просто надеялся сохранять дополнительные операции. Большое спасибо Kaz. –  Daniel K. 29.10.2013, 21:24
  • 4
    Будьте осторожны. это git [flags] command [arguments], так вслепую просьба о clone в определенном положении перестанет работать. –  vonbrand 14.02.2016, 00:19
  • 5
    Был бы, добавляя "реальную" справку пути? Как: git_real_home =which git мерзавец () {... $git_real_home "$" | $tmp –  aakoch 05.01.2017, 21:31

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

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

(Работы для ссылок и с и без ".git")

19
27.01.2020, 19:36
  • 1
    я хотел бы продолжать использовать git clone из-за всех инструментов, которые я должен был бы изменить, если бы я не использовал git. Концентратор искажается, поскольку мерзавец, oh-my-zsh обеспечивает автозавершение, и т.д.... –  Daniel K. 28.10.2013, 16:44
  • 2
    @Wildeyes git не может изменить рабочий каталог Вашей оболочки, так так или иначе необходимо будет перенести его в псевдоним/функцию, который делает то, что Вы хотите, и развивает его со встроенным cd. Если Вы хотите звонить hub вместо git, сделайте так в функции. Если Вы хотите, чтобы это только влияло clone команда, проверьте на действие в функции. и т.д. –  frostschutz 28.10.2013, 17:04
  • 3
    я заметил это basename git@github.com:pckujawa/pattern-rec.git результаты в шаблоне-rec.git - Вы просто бросаете .git расширение, когда Вы клонируетесь? –  Pat 28.06.2014, 08:03
  • 4
    @Pat basename также берет суффиксный аргумент, таким образом, можно сделать: git clone $1 && cd $(basename $1 .git) –  Henrik N 13.11.2015, 22:40

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

git clone git@github.com:npm/npm.git npm-local-dir && cd $_

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

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

EDIT: Ну, я собирался поблагодарить Manav (комментарий ниже) за лаконичный

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

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

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

git clone git@github.com:npm/npm.git && cd $(basename $_ .git)

или

git clone git@github.com:npm/npm.git && cd ${${_%%.git*}##*/}
7
27.01.2020, 19:36

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

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

0
27.01.2020, 19:36

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

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

Функция:

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
}
2
27.01.2020, 19:36

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

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

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

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

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

0
27.01.2020, 19:36

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

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 , угадайте каталог из этого и перейдите в него.

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

2
27.01.2020, 19:36

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

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

и

cd -

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

2
27.01.2020, 19:36

Я сделал это на основе ответа @frederik -deweerdt.

Таким образом, пользователь может просто клонировать cloneссылку репо, которая находится в буфере обмена. Если вы сообщите репо, оно клонирует, а не вводит.

Требуется установить xclip.

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

Другая реализация также обрабатывает дополнительные аргументы команды git clone.

Правильно cdв указанную папку или имя репозитория git по умолчанию.

Использование

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

Функция удара

# 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";
}
0
05.05.2020, 12:44

Существует фундаментальная проблема с вашим запросом, которая делает почти невозможным достижение :git является дочерним процессом оболочки в этом случае, а дочерние процессы не могут изменять родительскую среду в большинстве операционных систем. Таким образом, единственный способ сделать это со стороны оболочки -путем реализации псевдонима или функции.

Дополнительную информацию можно найти здесь :https://stackoverflow.com/questions/2375003/how-do-i-set-the-working-directory-of-the-parent-process

1
06.10.2020, 05:52

Теги

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