Disons que j'ai un répertoire /X/Y
, qui est un référentiel git. Est-il possible d'appeler d'une manière ou d'une autre une commande comme git pull
de l'intérieur /X
, mais en ciblant le /X/Y
répertoire?
EDIT: Je suppose que je me demandais précisément: est-il possible de le faire en utilisant la commande a git, mais sans avoir à changer de répertoire?
REMARQUE: j'ai accepté la réponse de VonC car elle est beaucoup plus élégante que les options précédentes. Pour les personnes utilisant Git plus tôt que 1.8.5, veuillez voir la réponse de bstpierre ci-dessous .
Réponses:
À partir de git 1.8.5 (Q4 2013) , vous pourrez "utiliser une commande Git, mais sans avoir à changer de répertoire".
Voir commit 44e1e4 de Nazri Ramliy :
Depuis Git 2.3.4 (mars 2015), et commit 6a536e2 par Karthik Nayak (
KarthikNayak
) ,git
traitera "git -C '<path>'
" comme un no-op quand il<path>
est vide.4 ans plus tard, Git 2.23 (Q3 2019) documente que '
git -C ""
' fonctionne et ne change pas de répertoireCela signifie que la documentation comprend maintenant (enfin):
Vous pouvez voir
git -C
utilisé avec Git 2.26 (Q1 2020), à titre d'exemple.Voir commit b441717 , commit 9291e63 , commit 5236fce , commit 10812c2 , commit 62d58cd , commit b87b02c , commit 9b92070 , commit 3595d10 , commit f511bc0 , commit f6041ab , commit f46c243 , commit 99c049b , commit 3738439 , commit 77172490 , commit b8af ) par Denton Liu (
Denton-L
) .(Fusionné par Junio C Hamano -
gitster
- en commit 381e8e9 , 05 fév 2020)la source
apt-get install software-properties-common python-software-properties
puis ajoutez le git repoadd-apt-repository ppa:git-core/ppa
. La dernière étape consiste à mettre à jour git:apt-get update && apt-get upgrade
.Modifier :
Il y a soit un bug avec
git pull
, soit vous ne pouvez pas faire ce que vous essayez de faire avec cette commande. Vous pouvez cependant le faire avec l'extraction et la fusion:Réponse originale :
En supposant que vous exécutez bash ou similaire, vous pouvez le faire
(cd /X/Y; git pull)
.La page de manuel de git spécifie certaines variables (voir "Le référentiel git") qui semblent devoir aider, mais je ne peux pas les faire fonctionner correctement (avec mon référentiel dans / tmp / ggg2):
L'exécution de la commande ci-dessous pendant que mon cwd est / tmp met à jour ce dépôt, mais le fichier mis à jour apparaît dans / tmp au lieu de l'arborescence de travail / tmp / ggg2:
Voir également cette réponse à une question similaire , qui illustre les indicateurs
--git-dir
et--work-tree
.la source
.git
répertoire.git --git-dir=/tmp/ggg2/.git --work-tree=/tmp/ggg2 pull
, j'obtiens un message d'erreur. Mais si je le faisgit --git-dir=/tmp/ggg2/.git --work-tree=. pull
pendant que je suis dans / tmp, il place les fichiers mis à jour dans / tmp comme il se doit.--work-tree
ce moment--work-tree=/tmp/ggg2/
et--work-tree=/tmp/ggg2/.
comme cela pourrait être un problème avec la façon dont il analyse le chemin.Vous pouvez l'encapsuler dans un script bash ou un alias git:
la source
pushd/popd
paire au lieu decd/cd-
(cd xyz && git pull)
Ce message est un peu ancien, donc il pourrait y avoir un bug et il a été corrigé, mais je viens de le faire:
Et ça a marché. Cela m'a pris une minute pour comprendre qu'il voulait le fichier dot et le répertoire parent (dans une configuration standard, ils sont toujours parents / enfants mais pas dans TOUTES les configurations, ils doivent donc être spécifiés explicitement.
la source
Comme certains de mes serveurs sont sur une ancienne version d'Ubuntu LTS, je ne peux pas facilement mettre à niveau git vers la dernière version (qui prend en charge l'option -C comme décrit dans certaines réponses).
Cette astuce fonctionne bien pour moi, surtout parce qu'elle n'a pas l'effet secondaire d'autres réponses qui vous laissent dans un répertoire différent de celui où vous avez commencé.
Ou, en le faisant en une ligne:
Linux et Windows ont tous deux des commandes pushd et popd.
la source
En utilisant la combinaison
pushd
,git pull
etpopd
, nous pouvons atteindre cette fonctionnalité:Par exemple:
la source
Vous pouvez écrire un script comme celui-ci:
Vous pouvez le nommer quelque chose comme
gitpull
.Si vous préférez qu'il fasse des répertoires arbitraires au lieu de
/X/Y
:Ensuite, vous pouvez l'appeler avec
gitpull /X/Z
Lastly, vous pouvez essayer de trouver des référentiels. J'ai un
~/git
dossier qui contient des référentiels, et vous pouvez l'utiliser pour faire un pull sur chacun d'eux.la source
(cd /X/Y && git pull)
.Pour quelqu'un comme moi qui tentait de le faire via une commande drush (Drupal shell) sur un serveur distant, vous ne pourrez pas utiliser la solution qui vous oblige à CD dans le répertoire de travail:
Au lieu de cela, vous devez utiliser la solution qui décompose le pull en fetch & merge:
la source
Cela peut être un problème similaire, mais vous pouvez également simplement enchaîner vos commandes. par exemple
Sur une seule ligne
Ou via SSH.
la source