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 nicht git 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 integrierte cd verwendet. Wenn Sie hub anstelle von git aufrufen möchten, tun Sie dies in der Funktion. Wenn Sie möchten, dass sich dies nur auf den Befehl clone 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 nach clone 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> und clone_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 in STDERR (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"; }  

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.