Dis que je fais ça:
cd subdir
git init
cd ../
Y a-t-il un moyen de faire cela avec une seule commande, ou peut-être deux, plutôt que de devoir entrer et sortir d'un répertoire pour y exécuter une commande?
(Ne cherchez pas une solution spécifique à Git, ce n'est qu'un exemple.)
$?
contiendra le code de sortie de la dernière commande exécutée dans le sous-shell. Si vous utilisez la&&
variante (ce que vous devriez habituellement), vous obtiendrez le code de sortie de la première commande ayant échoué (ou 0 si tout s'est bien passé).Je cherchais un moyen d'exécuter la commande git à partir d'un chemin et d'apporter des modifications au référentiel dans un chemin différent. Donc je me suis retrouvé dans cette question ici.
Mais pour mes besoins spécifiques, ni la réponse acceptée ni aucune des autres ne m'aident.
J'avais besoin d'exécuter des commandes git en utilisant
sudo -u USER /usr/bin/git
(un autre utilisateur qui l'exécute). Et comme vous le savez peut-être, sudo ne me permet pas d’exécuter lacd
commande, je ne peux donc pas être dans le répertoire du référentiel.Donc, je suis allé à la page de manuel de git . Et parmi les options, j'ai vu le
--git-dir=<path>
:Donc, si cela aide quelqu'un, vous pouvez toujours utiliser git depuis un chemin et apporter des modifications à un dépôt "loin de vous". Il suffit d'utiliser:
ou, pour l'exécuter en tant qu'utilisateur différent, procédez comme suit:
Également sur la page de manuel de git-init :
Ainsi, si vous souhaitez initialiser le référentiel sous le dossier .git habituel, vous devez le spécifier avec l'
--git-dir
option. par exemple:Après l’initialisation du référentiel
/path/to/repo/.git
, toutes les commandes ultérieures devraient avoir l’option--work-tree=<path>
, comme décrit sur la page de manuel de git:Ainsi, la bonne commande pour exécuter git en tant qu'utilisateur différent et initialiser un nouveau référentiel est la suivante:
la source
sudo -i
ousudo su
obtenir un shell racine interactif.( cd subdir && sudo -u USER /usr/bin/git init )
ne marcherait pas.subdir
?Pas exactement ce que vous demandez (vous avez les vraies réponses ci-dessus avec le sous-shell) mais regardez
pushd
etpopd
la source
Vous avez quelques options. Vous pouvez grouper les commandes avec
&&
ou;
. Comme ça:ou
La différence entre ceux-ci est que dans le premier exemple, si l'une des commandes échoue, elle n'exécutera pas le reste. Dans le deuxième exemple, toutes les commandes seront exécutées quoi qu'il arrive.
Une autre option serait de définir une fonction et de l’utiliser, par exemple:
Ensuite, vous pouvez exécuter la commande:
Et ce sera automatiquement
git init
dans ce répertoire et sortir de celui-ci.Vous pouvez également faire une solution plus complexe en utilisant une fonction si vous avez plusieurs répertoires et que vous voulez les utiliser
git init
avec une seule commande.Vous pouvez ensuite exécuter ceci avec:
Et il le fera
git init
danssubdir1
,subdir2
etsubdir3
.la source
&&
et;
espérais quelque chose de plus élégant. On dirait que l'écriture d'un script est ma meilleure option.cdinit
fonction peut être généralisée pour des commandes arbitraires? J'ai essayé d'utiliser uniquement les arguments, mais cela n'a pas fonctionné.;
, de sorte que la fonction à trois lignes est équivalente àcd $1; git init; cd ..
. (2) Vous devez citer vos variables:"$1"
,"$@"
et"$arg"
. Ou vous pouvez abrégezfor arg in "$@"
àfor arg
.Dans le cas de
git
(au moins dans la version 2.7.0), vous pouvez utiliser l'-C
option qui fait que git se comporte comme si elle avait été démarrée dans le répertoire donné. Votre solution peut donc ressembler à:Citer la documentation:
la source
Vous pouvez regrouper les commandes avec &&, c.-à-d.
Si vous ne souhaitez aucune dépendance sur le code de sortie de chaque commande, vous pouvez utiliser; à la place, à savoir:
la source
;
pour qu'ils ne dépendent pas du code de retour du précédent.cd subdir && git init ; cd ..
peut réellement avoir le plus de sens. Si l'utilisateur veut exécuter lagit init
commande dans lesubdir
, il ne veut probablement pas exécuter la commande dans le répertoire en cours; c'est-à-dire qu'ils ne veulent pas l'exécuter si le (premier)cd
échoue. (Bien qu'il soit possible que celacd
échoue parce que nous sommes déjà dans lesubdir
, mais c'est un cas en coin.)… (Suite)cd
sauvegarder dans le répertoire de départ même si lagit init
commande échoue. ( Ou, ils pourraient vouloir rester dans le sous - répertoire et diagnostiquer la panne de commande.) (2) Vous n'avez pas besoin d'inclure l'/
après..
.Vous devez accéder à votre répertoire cible si la commande n'a pas de paramètre nom de fichier ou nom de répertoire.
Mais vous pouvez écrire un script bash qui prend comme paramètres le répertoire cible et la commande. Pour cela, vous pouvez jeter un oeil à pushd et popd: http://ss64.com/bash/pushd.html
J'écrirais ce petit script pour vous, mais je n'ai pas de machine Linux ici :)
la source
Les programmes ont différentes manières de gérer les arguments, ainsi quelques-uns auront une option équivalente de l' option -folder = name . Au-delà de cette exception, le standard, même sous MS-DOS, est simplement
$ programme subdir
Parfois vous avez besoin
$ programme subdir /
Le programme ouvrira le dossier, le travaillera de la même manière que vous le feriez avec un fichier, et une fois terminé, vous rendrez le contrôle à votre shell, qui est dirigé vers votre répertoire standard d'origine. Les programmes gérés de cette manière ont pour problème que les sorties d'erreur (telles que les vidages principaux ) sont dirigées vers un fichier du répertoire actuel de votre shell (plutôt que sous- répertoire ).
Il n'y a pas de solution de contournement à moins que le programme dispose de commutateurs de commande permettant de spécifier un emplacement différent. Certains programmeurs prennent une licence artistique entre "programme de répertoire appelé depuis " et "programme de répertoire chargé de travailler ".
la source