Я хочу автоматически cd
в каталог, созданный clone
командой после того, как я git clone
что-то сделал.
Важно: я не хочу изменять синтаксис команды (например, использовать псевдоним / функцию), потому что это нарушит zsh-дополнения, которые я получаю автоматически из Pretzo
проекта.
РЕДАКТИРОВАТЬ : Причина, по которой я не выбрал ни одного ответа как правильный, заключается в том, что не было дано ответа, который отвечал бы условию выше
Я использую ZSH, но ответ в любой другой оболочке также приемлем.
~/.bashrc
файле (например), и для меня, по крайней мере, это не сработало, мне нужно было исправить это с заменой строка:/usr/bin/git "$@" 2>&1 | tee $tmp
Ответы:
Создать функцию:
(Работает для ссылок как с ".git", так и без него)
источник
git clone
из-за всех инструментов, которые мне пришлось бы изменить, если бы я не использовалgit
. Hub имеет псевдоним git, oh-my-zsh обеспечивает автозаполнение и т. Д.git
не может изменить рабочий каталог вашей оболочки, поэтому в любом случае вам придется обернуть его в псевдоним / функцию, которая делает то, что вы хотите, и следует за ней со встроенной функциейcd
. Если вы хотите позвонитьhub
вместоgit
, сделайте это в функции. Если вы хотите, чтобы это влияло только наclone
команду, проверьте действие в функции. и т.д.basename git@github.com:pckujawa/pattern-rec.git
приводит к pattern-rec.git - вы просто отключаете расширение .git при клонировании?basename
также принимает аргумент суффикса, так что вы можете сделать:git clone $1 && cd $(basename $1 .git)
git clone
принимает дополнительный аргумент: каталог для использования. Вы можете сделать его клонированным в текущий рабочий каталог с помощьюgit clone URL .
Затем, нет необходимости менять рабочий каталог; ты уже тамЕсли вы действительно хотите, чтобы
git
команда фактически изменила рабочий каталог, вы можете изменить ее на функцию, котораяgit
при необходимости вызывает реальный :источник
/tmp
том, который находится в оперативной памяти, как любой современный Linux через tmpfs. В любом случае, зачем вам записывать на диск, когда вы только что сделали git-клон, который создает каталоги и записывает, возможно, сотни файлов на диск ...git [flags] command [arguments]
так, слепо проситьclone
в определенной позиции не удастся.which git
git () {... $ git_real_home "$ @" | tee $ tmpЕсли вы укажете локальное имя репо, использовать $ _ очень просто :
Но если вы не хотите повторно вводить длинные имена, это немного уродливо, но выполнимо с помощью sed:
РЕДАКТИРОВАТЬ: Ну, я собирался поблагодарить Манав (комментарий ниже) за краткий
но он не работает в zsh (что-то из-за того, как zsh делает расширения, заставляет его не рассматривать первую команду как вход
!$
). Я должен был посмотреть, что!$:t
сделал ( Продвижение в Bash Shell | $ {me: -whither} ).!$
берет последнюю часть предыдущей команды и:t
удаляет все ведущие компоненты имени файла, оставляя хвост. Хорошая информация, но хотелось бы, чтобы она работала с zsh (я пыталсяnoglob
безуспешно).РЕДАКТИРОВАТЬ: Вместо использования
sed
или!$:t
(который не работает в zsh, для меня в любом случае), я нашел два других варианта (один адаптирует https://unix.stackexchange.com/users/5685/frederik-deweerdt с https : //unix.stackexchange.com/users/129926/henrik-n 's комментарий):или
источник
git clone foo/bar && cd !$:t
.git
вы можете использовать,!$:t:r
чтобы получить имя папки.Простое решение для любой оболочки POSIX состоит в том, чтобы явно указать каталог для клонирования (любой путь файловой системы) и использовать его повторно:
а также
когда вы закончите.
источник
Вы могли бы сделать что-то вроде:
Это довольно упрощенно. Это
precmd
хук (выполняется перед каждым приглашением), который проверяет, выглядела ли последняя командная строкаgit clone .../something
илиgit clone .../something dir
угадывает каталог из этого и вставляет в него компакт-дискЭто не работает, если вы вошли
git clone foo; whatever
илиwhatever; git clone foo
илиgit clone --option repo
...источник
CDing into <project>
иclone_check:cd:17: no such file or directory: <project>
. Ошибка исчезает, как только последняя команда, которую вы выполнили перед закрытием терминала, отличается от$ git clone
.Вот адаптация приведенного выше ответа для
OSX
mktemp
требуется дополнительный параметрgit clone
пишетSTDERR
по умолчанию (см. это )Функция:
источник
Я бы не советовал, но вы могли бы использовать эту строку:
echo 'project' | xargs -I % sh -c 'git clone https://github.com/username/%.git && cd %'
источник
Включите это в вашу оболочку:
Это работает путем тайной очистки цели клонирования от стандартной ошибки git и
cd
попадания в цель, если (и только если) клонирование прошло успешно.Он принимает все аргументы и опции, которые
git clone
делает обычный пользователь .Либо вы можете использовать оболочку git и не беспокоиться о своих завершениях, либо вы можете избавиться от оболочки git и переназначить свои
git clone
завершенияgit-clone
.источник