Ich möchte automatisch cd
in das Verzeichnis wechseln, das von clone
Befehl, nachdem ich git clone
etwas getan habe.
Wichtig: Ich möchte die Syntax für den Befehl nicht ändern (z. B. einen Alias / eine Funktion verwenden), da dies die zsh-Vervollständigungen unterbrechen würde, die ich automatisch aus dem Pretzo
-Projekt erhalte.
BEARBEITEN : Der Grund, warum ich keine Antwort als richtig ausgewählt habe, ist, dass keine Antwort war vorausgesetzt, dies entsprach der obigen Bedingung.
Ich verwende ZSH, aber eine Antwort in jeder anderen Shell ist ebenfalls akzeptabel.
Kommentare
- Ich mag die Antwort unix.stackexchange.com/questions/97920/… , aber sie muss zu erwähnen, diese Funktion in die Datei
~/.bashrc
(zum Beispiel) und für mich unter l zu schreiben Im Osten funktionierte es nicht ‚, ich musste es durch Ersetzen der Zeile beheben:/usr/bin/git "$@" 2>&1 | tee $tmp
Antwort
Erstellen Sie eine Funktion:
gclonecd() { git clone "$1" && cd "$(basename "$1" .git)" }
(Funktioniert für beide Links mit und ohne „.git“)
Kommentare
- Ich möchte weiterhin
git clone
verwenden, weil aller Tools, die ich ändern müsste, wenn ich nichtgit
verwenden würde. Hub ist als Git aliasiert, oh-my-zsh bietet automatische Vervollständigung usw. - @Wildeyes
git
‚ kann das Arbeitsverzeichnis Ihrer Shell nicht ändern, sodass Sie es in beiden Fällen ‚ umbrechen müssen in einem Alias / einer Funktion, die das tut, was Sie wollen, und anschließend das integriertecd
verwendet. Wenn Siehub
anstelle vongit
aufrufen möchten, tun Sie dies in der Funktion. Wenn Sie möchten, dass sich dies nur auf den Befehlclone
auswirkt, überprüfen Sie die Funktion auf die Aktion. usw. - Ich habe festgestellt, dass
basename [email protected]:pckujawa/pattern-rec.git
zu pattern-rec.git führt. Lassen Sie die .git-Erweiterung beim Klonen einfach weg? - @Pat
basename
verwendet ebenfalls ein Suffix-Argument, sodass Sie Folgendes tun können:git clone $1 && cd $(basename $1 .git)
Antwort
git clone
benötigt ein zusätzliches Argument: das zu verwendende Verzeichnis. Sie können es mit git clone URL .
in das aktuelle Arbeitsverzeichnis klonen. Dann müssen Sie das Arbeitsverzeichnis nicht ändern. Sie sind bereits dort.
Wenn Sie wirklich möchten, dass der Befehl git
das Arbeitsverzeichnis tatsächlich ändert, können Sie ihn in eine Funktion ändern, die die echte git
bei Bedarf:
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 }
Kommentare
- Genau das war was ich gesucht habe. Nachdem ich festgestellt hatte, dass es keine internen Hooks oder ähnliches gibt, habe ich eine fast exakte Funktion geschrieben 🙂
- @Wildeyes Ja: Haben Sie ein
/tmp
Volume, das sich in befindet RAM, wie es jedes moderne Linux über tmpfs tut. Wie auch immer, warum sollten Sie auf die Festplatte schreiben, wenn Sie ‚ gerade einen Git-Klon erstellt haben, der Verzeichnisse erstellt und möglicherweise Hunderte von Dateien auf die Festplatte schreibt … - Sie ‚ haben wahrscheinlich Recht mit dem gesamten “ nvm, wenn es auf die Festplatte „, ich wollte nur zusätzliche Operationen sparen. Vielen Dank Kaz.
- Sei vorsichtig. Es ist
git [flags] command [arguments]
, daher schlägt das blinde Nachfragen nachclone
in einer bestimmten Position fehl. - Das Hinzufügen der “ echte “ Pfadhilfe? Wie: git_real_home =
which git
git () {… $ git_real_home “ $ @ “ | tee $ tmp
Antwort
Wenn Sie den lokalen Namen des Repos angeben, ist die Verwendung sehr einfach $ _ :
git clone [email protected]:npm/npm.git npm-local-dir && cd $_
Wenn Sie jedoch nicht lange neu eingeben möchten Namen, es ist „ein wenig hässlich, aber machbar mit sed:
git clone [email protected]:pckujawa/pattern-rec.git && cd `echo $_ | sed -n -e "s/^.*\/\([^.]*\)\(.git\)*/\1/p"`
EDIT: Nun, ich wollte Manav (Kommentar unten) für die knappe
git clone foo/bar && cd !$:t
aber funktioniert nicht in zsh ( Etwas über , wie zsh Erweiterungen ausführt , führt dazu, dass der erste Befehl nicht als Eingabe für !$
behandelt wird. Ich musste nachschlagen, was !$:t
tat ( Fortschritte in der Bash-Shell | $ {me: -whatever} ) . !$
greift nach dem letzten Teil des vorherigen Befehls und :t
„entfernt alle führenden Dateinamenkomponenten und lässt den Schwanz übrig.“Gute Informationen, aber ich wünschte, ich könnte sie mit zsh zum Laufen bringen (ich habe noglob
ohne Erfolg versucht).
BEARBEITEN: Anstatt sed
oder !$:t
(was in zsh für mich sowieso nicht funktioniert), ich habe zwei andere Optionen gefunden (eine, die https://unix.stackexchange.com/users/5685/frederik-deweerdt antwortet mit https://unix.stackexchange.com/users/129926/henrik-n „s Kommentar):
git clone [email protected]:npm/npm.git && cd $(basename $_ .git)
oder
git clone [email protected]:npm/npm.git && cd ${${_%%.git*}##*/}
Kommentare
-
git clone foo/bar && cd !$:t
- Wenn Ihre Repo-URL mit
.git
Sie können!$:t:r
verwenden, um den Ordnernamen abzurufen.
Antwort
Eine einfache Lösung für jede POSIX-Shell besteht darin, das Verzeichnis anzugeben, in das explizit geklont werden soll (beliebiger Dateisystempfad), und es wiederzuverwenden:
git clone <repository> <directory> && cd "$_"
und
cd -
wenn Sie fertig sind.
Antwort er
Sie könnten Folgendes tun:
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)
Es ist ziemlich simpel. Es „sa precmd
-Hook (vor jeder Eingabeaufforderung ausgeführt), der prüft, ob die letzte Befehlszeile wie git clone .../something
oder , erraten Sie das Verzeichnis daraus und cd es hinein.
Es funktioniert nicht, wenn Sie git clone foo; whatever
oder whatever; git clone foo
oder git clone --option repo
…
Kommentare
- +1 Danke Sie sehr für den Code; Ich ‚ benutze es seit einigen Tagen. Ich ‚ habe gerade ein Problem bemerkt. Wenn Sie das Terminal direkt nach dem Klonen eines Projekts schließen, beklagt sich zsh beim nächsten Öffnen eines Terminals mit zwei Fehlermeldungen:
CDing into <project>
undclone_check:cd:17: no such file or directory: <project>
. Der Fehler verschwindet, sobald sich der letzte Befehl, den Sie vor dem Schließen des Terminals ausgeführt haben, von$ git clone
unterscheidet.
Antwort
Hier ist eine Anpassung der obigen Antwort für OSX
-
mktemp
erfordert zusätzlichen Parameter -
git clone
schreibt standardmäßig inSTDERR
(siehe this )
Funktion:
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 }
Kommentare
- Es gibt 7 Antworten, in denen “ über “ angezeigt wird. Aber es kann sich im Laufe der Zeit ändern. Solche Verweise sind in SE nicht sinnvoll. Bearbeiten Sie Ihre Antwort und fügen Sie einen Link zu der Antwort hinzu, auf die Sie sich bezogen haben.
Antwort
Es gibt ein grundlegendes Problem mit Ihrer Anfrage, das es fast unmöglich macht, es zu erreichen: git ist in diesem Fall ein untergeordneter Prozess der Shell, und untergeordnete Prozesse können die übergeordnete Umgebung in den meisten Betriebssystemen nicht ändern Dies kann nur von der Seite der Shell aus erfolgen, indem ein Alias oder eine Funktion implementiert wird.
Weitere Details finden Sie hier: https://stackoverflow.com/questions/2375003/how-do-i-set-the-working-directory-of-the-parent-process
Antwort
Ich würde es nicht empfehlen, aber Sie könnten diesen Einzeiler verwenden:
echo "project" | xargs -I % sh -c "git clone https://github.com/username/%.git && cd %"
Antwort
Fügen Sie dies in Ihre Shell ein:
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" }
Dies funktioniert, indem das Klonziel heimlich aus dem Standardfehler von git ermittelt wird und cd
„ing in das Ziel, wenn (und nur wenn) das Klonen erfolgreich war.
Es akzeptiert alle Argumente und Optionen, die das reguläre git clone
tut.
Entweder können Sie den Git-Wrapper verwenden und müssen sich nicht um Ihre Vervollständigungen kümmern, oder Sie können den Git-Wrapper entfernen und Ihre git clone
Vervollständigungen auf git-clone
.
Antwort
Ich habe dies basierend auf @ frederik-deweerdt gemacht Antwort.
Sie können also einfach auf clone
den Repo-Link klonen, der sich in der Zwischenablage befindet. Wenn Sie das Repo informieren, wird es geklont und dann eingegeben.
Es ist erforderlich, xclip
zu installieren.
clone() { if [ -z "$1" ] then local repo=$(xclip -o) else local repo=$1 fi git clone "$repo" && cd "$(basename "$repo" .git)" }
Antwort
Eine andere Implementierung verarbeitet auch zusätzliche Argumente für den Befehl git clone
.
Richtig cd
„s in den bereitgestellten Ordner oder den Standard-Git-Repo-Namen.
Verwendung
gclonecd https://github.com/example/repo gclonecd https://github.com/example/repo my-custom-folder
Bash-Funktion
# 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"; }