Ich möchte automatisch cd
in das vom clone
Befehl erstellte Verzeichnis, 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 stören 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 gegeben wurde, die der obigen Bedingung entsprach.
Ich benutze ZSH, aber eine Antwort in einer anderen Shell ist auch akzeptabel.
~/.bashrc
Datei zu schreiben (zum Beispiel) und für mich hat es zumindest nicht funktioniert, ich musste es mit dem Ersetzen der beheben line:/usr/bin/git "$@" 2>&1 | tee $tmp
Antworten:
Erstellen Sie eine Funktion:
(Funktioniert für Links mit und ohne ".git")
quelle
git clone
wegen all der Tools, die ich ändern müsste, wenn ich sie nicht verwenden würde, weiterverwendengit
. Hub ist als git aliasiert, oh-my-zsh bietet Auto-Vervollständigung, etc ...git
kann das Arbeitsverzeichnis Ihrer Shell nicht ändern, so oder so müssen Sie es in einen Alias / eine Funktion einbinden, die genau das tut, was Sie wollen, und die eingebaute Funktion verwendetcd
. Wenn Siehub
statt anrufen möchtengit
, tun Sie dies in der Funktion. Wenn Sie möchten, dass es sich nur auf denclone
Befehl auswirkt , überprüfen Sie die Aktion in der Funktion. etc.basename [email protected]:pckujawa/pattern-rec.git
sich pattern-rec.git ergibt - lassen Sie die .git-Erweiterung einfach weg, wenn Sie klonen?basename
auch ein Suffix-Argument, damit Sie Folgendes tun können:git clone $1 && cd $(basename $1 .git)
git clone
benötigt ein zusätzliches Argument: das zu verwendende Verzeichnis. Sie können es mit in das aktuelle Arbeitsverzeichnis klonen.git clone URL .
Dann müssen Sie das Arbeitsverzeichnis nicht ändern. du bist schon da.Wenn Sie wirklich möchten, dass der
git
Befehl das Arbeitsverzeichnis ändert, können Sie ihn in eine Funktion ändern, diegit
bei Bedarf den Real aufruft :quelle
/tmp
Volume, das sich im RAM befindet, wie jedes moderne Linux über tmpfs. Wie auch immer, warum sollte es Ihnen etwas ausmachen, auf die Festplatte zu schreiben, wenn Sie gerade einen Git-Klon durchgeführt haben, der Verzeichnisse erstellt und vielleicht Hunderte von Dateien auf die Festplatte schreibt ...git [flags] command [arguments]
so blind gefragtclone
in bestimmter position wird scheitern.which git
git () {... $ git_real_home "$ @" | tee $ tmpWenn Sie den lokalen Namen des Repos angeben, ist die Verwendung von $ _ ganz einfach :
Aber wenn Sie keine langen Namen erneut eingeben möchten, ist es ein wenig hässlich, aber mit sed machbar:
EDIT: Nun, ich wollte Manav (Kommentar unten) für die knappe danken
Aber es funktioniert nicht in zsh (etwas darüber, wie zsh Erweiterungen ausführt, bewirkt, dass es den ersten Befehl nicht als Eingabe für behandelt
!$
). Ich musste nachsehen, was passiert ist!$:t
( Fortschreiten in der Bash-Shell | $ {me: -whatever} ).!$
Ergreift den letzten Teil des vorherigen Befehls und entfernt:t
alle führenden Dateinamenskomponenten, wobei der Schwanz übrig bleibt. Gute Informationen, aber ich wünschte, ich könnte sie mit zsh zum Laufen bringen (ich habe esnoglob
ohne Erfolg versucht ).BEARBEITEN: Anstatt
sed
oder zu verwenden!$:t
(was in zsh sowieso nicht funktioniert), habe ich zwei andere Optionen gefunden (eine, die die Antwort von https://unix.stackexchange.com/users/5685/frederik-deweerdt mit https anpasst) : //unix.stackexchange.com/users/129926/henrik-ns Kommentar):oder
quelle
git clone foo/bar && cd !$:t
.git
, können Sie verwenden!$:t:r
, um den Ordnernamen abzurufen.Eine einfache Lösung für jede POSIX-Shell besteht darin, das Verzeichnis anzugeben, in das explizit geklont werden soll (beliebiger Dateisystempfad) und es erneut zu verwenden:
und
wenn du fertig bist.
quelle
Sie könnten etwas tun wie:
Es ist ziemlich simpel. Es ist ein
precmd
Hook (der vor jeder Eingabeaufforderung ausgeführt wird), der prüft, ob die letzte Befehlszeile so aussahgit clone .../something
odergit clone .../something dir
, errate das Verzeichnis von dort und cd hinein.Es funktioniert nicht, wenn Sie eingegeben haben
git clone foo; whatever
oderwhatever; git clone foo
odergit clone --option repo
...quelle
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 unterscheidet$ git clone
.Hier ist eine Anpassung der obigen Antwort für
OSX
mktemp
erfordert zusätzliche Parametergit clone
schreibtSTDERR
standardmäßig an (siehe dies )Funktion:
quelle
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 %'
quelle
Fügen Sie dies in Ihre Shell ein:
Dies funktioniert, indem das Klon-Ziel heimlich von seinem Standardfehler befreit wird und
cd
in das Ziel eingedrungen wird, wenn (und nur dann) das Klonen erfolgreich war.Es akzeptiert alle Argumente und Optionen, die der Reguläre
git clone
ausführt.Entweder können Sie den Git-Wrapper verwenden und müssen sich nicht um Ihre Fertigstellungen kümmern, oder Sie können den Git-Wrapper loswerden und Ihre
git clone
Fertigstellungen neu verkabelngit-clone
.quelle