2017-12-29 34 views
0

Ich versuche ein Repo als Ausgangspunkt für verschiedene Projekte zu verwenden.git alias wartet nicht auf den klon, der vor cd ins projekt beendet wird?

ich diesen Kern hier taten folgen: https://gist.github.com/mdentinho/6258238

Und vom Kern ausgehend habe ich einen Alias ​​erstellt, die wie folgt aussieht:

boilerplate-website = !git clone -o website-boilderplate https://[email protected]/user/website-boilderplate.git "$1" && cd "$1" && rm readme.md && touch readme.md && rm -rf .git && git init && git add -A && git commit -m 'First Commit' 

Aber es sieht aus wie der CD Teil nicht funktioniert, Da ich immer noch im Verzeichnis bin, führe ich den Befehl aus und nicht innerhalb des neu geklonten Verzeichnisses.

Auch deshalb, bekomme ich diesen Fehler und der Alias ​​vervollständigt nicht alle Befehle (es klont nur und das ist es).

Cloning into 'test2'... 
remote: Counting objects: 19, done. 
remote: Compressing objects: 100% (18/18), done. 
Unpacking objects: 100% (19/19), done. 
remote: Total 19 (delta 1), reused 0 (delta 0) 
rm: readme.md: No such file or directory 

Warum wartet nicht auf den Klon zu Ende? Ich habe regelmäßig Benutzer

git clone {repo} {folder name} && cd {folder name} 

und das funktioniert gut.

Danke für jede Hilfe

+2

'cd' sollte sich auf die neue erzeugte Shell auswirken, aber nicht auf die Shell, aus der Sie den Befehl ausführen. – PetSerAl

+0

Gibt es eine Möglichkeit, das zu erreichen, was ich vom Alias ​​erreichen will? – Nick

+0

Die einzige Möglichkeit besteht darin, den aktuellen Verzeichnispfad zurück zur aktuellen Shell und 'cd' in der aktuellen Shell zu bringen. So etwas wie "cd" $ (git boilerplate) "' wobei "boilerplate" mit einem Aufruf von 'pwd' endet, um den aktuellen Pfad wiederzugeben. – phd

Antwort

1

Als PetSerAl noted in a comment, cd die Schale wirkt, die die cd Befehl ausführt, und alle Sub-Befehle/Unterschalen, die die Schale selbst hervorbringt; Es wirkt sich jedoch nicht auf "Außenschicht" -Schalen aus, wie die, in der Sie git boilerplate-website eingeben. (Die ! im Alias ​​bedeutet: "Führen Sie dies durch eine Unterschale.")

Was dies für Sie bedeutet, ist, dass Sie auf diese Weise nicht erreichen können, was Sie wollen. Sie benötigen Ihre Shell - die, in die Sie einen Befehl eingeben -, um den Befehl cd auszuführen.

Die Art und Weise zu tun, ist eine Funktion Schale oder Shell alias zu verwenden (letztere unterscheidet sich von einem Git alias). Die Einzelheiten für die Definition einer Shell-Funktion oder Shell-alias leicht variieren je nachdem, welche Shell Sie verwenden, aber es ist in bash und bash artigen Schalen gemeinsam zu haben:

func() { 
    commands 
} 

der Weg zu sein, eine Funktion zu definieren (in $HOME/.bashrc zum Beispiel) und:

alias name='expansion with arguments' 

um die Möglichkeit zu sein, einen Alias ​​zu definieren. Daher könnten Sie schreiben:

newwebsite() { 
    case $# in 
    1) ;; 
    *) echo "usage: newwebsite <name>" 1>&2; return 1;; 
    esac 
    git clone -o website-boilderplate \ 
     https://[email protected]/user/website-boilderplate.git \ 
     "$1" || { echo "git clone step failed, aborting" 1>&2; return 1; } 
    cd "$1" && 
    rm readme.md && 
    touch readme.md && 
    rm -rf .git && 
    git init && 
    git add -A && 
    git commit -m 'First Commit' 
} 

(ich dies als eine Funktion geschrieben habe, zu versuchen, es so lesbar wie möglich zu machen, während die Struktur intakt zu halten.) Beachten Sie, dass dies ohne den git Befehl vor laufen würden davon, dh newwebsite foo und nicht git newwebsite foo.

+0

Danke für die Erklärung. Wie würde ich dann den Alias-Befehl ausführen? wäre es nur wie das Echo sagt "NewWebsite ? – Nick

+0

@Nick: Ja, ich muss die Bearbeitung getan haben, um das in, während Sie gefragt wurden :-) – torek

+0

Vielen Dank, ich werde es versuchen :) – Nick