Sagen Sie, dass ich das mache:
cd subdir
git init
cd ../
Gibt es eine Möglichkeit, dies mit einem oder zwei Befehlen zu tun, anstatt in ein Verzeichnis zu wechseln und es wieder zu verlassen, um dort einen Befehl auszuführen?
(Nicht auf der Suche nach einer git-spezifischen Lösung; das ist nur ein Beispiel.)
$?
Enthält den Exit-Code des letzten Befehls, der in der Subshell ausgeführt wurde. Wenn Sie die&&
Variante verwenden (die Sie normalerweise verwenden sollten), erhalten Sie den Exit-Code des ersten fehlgeschlagenen Befehls (oder 0, wenn alles in Ordnung war).Ich suchte nach einer Möglichkeit, den Befehl git über einen Pfad auszuführen und Änderungen am Repository unter einem anderen Pfad vorzunehmen. Also bin ich hier auf diese Frage gekommen.
Aber für meine speziellen Bedürfnisse hat weder die akzeptierte Antwort noch eine der anderen geholfen.
Ich musste Git-Befehle mit
sudo -u USER /usr/bin/git
(einem anderen Benutzer, der es ausführt) ausführen . Und wie Sie vielleicht wissen, ist sudo nicht zulassen , dass ich den läuftcd
Befehl, so kann ich nicht sein , im Repository - Verzeichnis.Also ging ich zur Manpage von git . Und unter den Optionen sah ich die
--git-dir=<path>
:Wenn es also jemandem hilft, können Sie immer noch git von einem Pfad verwenden und Änderungen an einem Repository "weit von Ihnen entfernt" vornehmen. Benutz einfach:
oder, um es als ein anderer Benutzer auszuführen, mache etwas wie:
Auch aus der Manpage von git-init :
Wenn Sie das Repository also im üblichen .git-Ordner starten möchten, müssen Sie es zusammen mit der
--git-dir
Option angeben . z.B:Nach der Initialisierung des Repositorys
/path/to/repo/.git
sollten alle weiteren Befehle die Option haben--work-tree=<path>
, wie auf der Manpage von git beschrieben:Der richtige Befehl, um git als anderer Benutzer auszuführen und ein neues Repository zu initialisieren, lautet:
quelle
sudo -i
odersudo su
eine interaktive Root - Shell zu erhalten.( cd subdir && sudo -u USER /usr/bin/git init )
das nicht funktionieren würde.subdir
?Nicht genau das, was Sie fragen (Sie haben oben mit der Unterschale echte Antworten), aber schauen Sie sich
pushd
und anpopd
quelle
Sie haben ein paar Möglichkeiten. Sie können die Befehle entweder mit
&&
oder gruppieren;
. So was:oder
Der Unterschied zwischen diesen ist, dass im ersten Beispiel, wenn einer der Befehle fehlschlägt, der Rest von ihnen nicht ausgeführt wird. Im zweiten Beispiel werden alle Befehle ausgeführt, egal was passiert.
Eine andere Möglichkeit wäre, eine Funktion zu definieren und zu verwenden, zum Beispiel:
Dann können Sie den Befehl ausführen:
Und es wird automatisch
git init
in dieses Verzeichnis verschoben und aus diesem entfernt.Sie können auch eine komplexere Lösung mit einer Funktion ausführen, wenn Sie eine Reihe von Verzeichnissen haben und
git init
diese mit einem einzigen Befehl aufrufen möchten .Sie können dies dann ausführen mit:
Und es wird nicht
git init
insubdir1
,subdir2
undsubdir3
.quelle
&&
und;
hoffte auf etwas Eleganteres. Klingt so, als wäre das Schreiben eines Skripts meine beste Option.cdinit
Funktion für beliebige Befehle verallgemeinert werden kann? Ich habe versucht, nur die Argumente zu verwenden, aber das hat nicht funktioniert.;
, so dass die Dreizeilenfunktion äquivalent zu istcd $1; git init; cd ..
. (2) Sie sollten Ihre Variablen zitieren:"$1"
,"$@"
und"$arg"
. Oder Sie können abkürzenfor arg in "$@"
zufor arg
.Im Falle von
git
(zumindest in Version 2.7.0) können Sie die-C
Option nutzen, mit der sich git so verhält, als ob es im angegebenen Verzeichnis gestartet worden wäre. So könnte Ihre Lösung aussehen:Zitieren der Dokumentation:
quelle
Sie können die Befehle mit && gruppieren, dh
Wenn Sie keine Abhängigkeit vom Exit-Code der einzelnen Befehle wünschen, können Sie Folgendes verwenden: stattdessen, dh:
quelle
;
damit sie nicht vom Rückkehrcode des vorherigen abhängen.cd subdir && git init ; cd ..
kann tatsächlich am sinnvollsten sein. Wenn der Benutzer dengit init
Befehl in ausführen möchte, möchte er den Befehlsubdir
wahrscheinlich nicht im aktuellen Verzeichnis ausführen. Das heißt, sie möchten es nicht ausführen, wenn das (erste)cd
fehlschlägt. (Obwohl es möglich ist, dass dascd
scheitert, weil wir bereits in dersubdir
, aber das ist ein Eckfall.)… (Fortsetzung)cd
dann in das Startverzeichnis zurückkehren, wenn dergit init
Befehl fehlschlägt. ( Oder sie möchten möglicherweise im Unterverzeichnis bleiben und den Befehlsfehler diagnostizieren.) (2) Sie müssen das/
After nicht einschließen..
.Sie müssen in Ihr Zielverzeichnis springen, wenn der Befehl keinen Dateinamen oder Verzeichnisnamenparameter enthält.
Sie können jedoch ein Bash-Skript schreiben, das das Zielverzeichnis und den Befehl als Parameter verwendet. Hierfür können Sie einen Blick auf pushd und popd werfen: http://ss64.com/bash/pushd.html
Ich würde dieses kleine Skript für dich schreiben, aber ich habe hier keine Linux-Box :)
quelle
Programme haben verschiedene Möglichkeiten, mit Argumenten umzugehen . Einige Programme haben also die Option -folder = name . Abgesehen von dieser Ausnahme ist der Standard auch unter MS DOS einfach
$ program subdir
Manchmal brauchst du
$ program subdir /
Das Programm öffnet den Ordner, arbeitet damit wie mit einer Datei und gibt die Kontrolle an Ihre Shell zurück, die auf Ihr ursprüngliches Standardverzeichnis verweist. Programme, die auf diese Weise behandelt werden, haben das Problem, dass Fehlerausgaben (wie z. B. Core-Dumps) in eine Datei im aktuellen Verzeichnis Ihrer Shell (und nicht in ein Unterverzeichnis ) verschoben werden .
Es gibt keine Problemumgehung, es sei denn, das Programm verfügt über Befehlsschalter, um einen anderen Ort anzugeben. Einige Programmierer nehmen eine künstlerische Lizenz zwischen "Verzeichnisprogramm wurde aufgerufen von " und "Verzeichnisprogramm wurde angewiesen, in ".
quelle