331 votes

git pull sans être dans un répertoire git

Disons que j'ai un répertoire, /X/Y qui est un dépôt git. Est-il possible d'appeler une commande comme git pull de l'intérieur /X mais en ciblant les /X/Y répertoire ?

EDIT : Je me demandais plus précisément s'il était possible de le faire en utilisant la commande git, mais sans avoir à changer de répertoire.

NOTE : J'ai accepté Réponse de VonC car elle est beaucoup plus élégante que les options précédentes. Pour les utilisateurs de Git antérieurs à la version 1.8.5, voir Réponse de bstpierre ci-dessous .

2 votes

J'aimerais ajouter que l'utilisation de git-pull dans un hook ne fonctionnera pas à moins que vous ne désactiviez GIT_DIR. Pertinent.

0 votes

À partir de git 1.8.5 (Q4 2013), vous pourrez "utiliser une commande git, mais sans avoir à changer de répertoire". Voir ma réponse ci-dessous

484voto

VonC Points 414372

Démarrage git 1.8.5 (Q4 2013) vous pourrez "utiliser une commande Git, mais sans avoir à changer de répertoire".

Tout comme " make -C <directory> ", " git -C <directory> ... "dit à Git de s'y rendre avant de faire quoi que ce soit d'autre .

Voir commit 44e1e4 por Nazri Ramliy :

Il faut plus de touches pour invoquer la commande Git dans un répertoire différent sans quitter le répertoire actuel :

  1. (cd ~/foo && git status) git --git-dir=~/foo/.git --work-tree=~/foo status GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d && git svn rebase); done

Les méthodes présentées ci-dessus sont acceptables pour l'écriture de scripts, mais sont trop lourdes pour des invocations rapides en ligne de commande.

Grâce à cette nouvelle option, les opérations ci-dessus peuvent être effectuées avec moins de frappes :

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done

Depuis Git 2.3.4 (mars 2015), et commit 6a536e2 por Karthik Nayak ( KarthikNayak ) , git traitera " git -C '<path>' "en tant que no-op lorsque <path> est vide.

' git -C "" ' meurt inutilement avec une erreur " Cannot change to '' ", alors que le shell traite cd ""' comme un no-op.
En prenant le comportement de l'obus comme précédent, enseigner git de traiter -C ""' comme un no-op, également.


4 ans plus tard, Git 2.23 (Q3 2019) documente que ' git -C "" ' fonctionne et ne change pas de répertoire

Il se comporte ainsi depuis 6a536e2 ( git : traiter " git -C '<path>' " comme un no-op lorsque <path> est vide, 2015-03-06, Git v2.3.4).

Cela signifie que la documentation comprend désormais (enfin) :

Si ' <path> est présent mais vide, par exemple -C "" le répertoire de travail actuel reste inchangé.


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 , commettre 3738439 , comm. 7717242 , commit b8afb90 (20 déc. 2019) par Denton Liu ( Denton-L ) .
(fusionné par Junio C Hamano -- gitster -- en commit 381e8e9 , 05 Feb 2020)

t1507 : inline full_name()

Signé par : Denton Liu

Auparavant, nous faisions fonctionner test_must_fail full_name . Cependant, test_must_fail ne doit être utilisé que pour les commandes git.
En ligne full_name() afin que nous puissions utiliser test_must_fail sur le git directement.

En full_name() a été introduite en 28fb84382b ("Introduire <branch>@{upstream} notation", 2009-09-10, Git v1.7.0-rc0 -- fusionner ), le git -C n'était pas encore disponible (puisqu'elle a été introduite en 44e1e4d67d (" git : s'exécuter dans un répertoire donné avec l'option -C", 2013-09-09, Git v1.8.5-rc0 -- fusionner figurant sur la liste des lot n° 5 )).
Par conséquent, la fonction d'assistance a supprimé la nécessité d'effectuer manuellement les opérations suivantes cd à chaque fois. Toutefois, étant donné que les git -C est désormais disponible, nous pouvons l'utiliser à la place et intégrer la ligne full_name() .

1 votes

Ne fonctionne pas pour moi : # git --version && git -C ~/.m2/ checkout master git version 1.8.3.4 (Apple Git-47) Option inconnue : -C utilisation : git [--version] [--help] [-c name=value] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] [-p|--paginate|--no-pager] [--no-replace-objects] [--bare] [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] <commande> [<args>]

7 votes

@JanGalinski Mais j'ai bien mentionné "Démarrer git 1.8.5". Donc git 1.8.3.x ne connaît pas encore cette option.

2 votes

Sur Ubuntu 12.04, j'ai dû installer une version plus récente de git. J'ai procédé comme suit : apt-get install software-properties-common python-software-properties puis ajouter le repo git add-apt-repository ppa:git-core/ppa . La dernière étape consiste à mettre à jour git : apt-get update && apt-get upgrade .

59voto

bstpierre Points 12616

Editar :

Il s'agit soit d'un bogue avec git pull ou vous ne pouvez pas faire ce que vous essayez de faire avec cette commande. Vous avez peut cependant, le faire avec fetch et merge :

cd /X
git --git-dir=/X/Y/.git fetch
git --git-dir=/X/Y/.git --work-tree=/X/Y merge origin/master

Réponse originale :

En supposant que vous utilisiez bash ou un logiciel similaire, vous pouvez faire (cd /X/Y; git pull) .

Les page de manuel git spécifie quelques variables (voir "Le dépôt git") qui semblent devoir aider, mais je n'arrive pas à les faire fonctionner correctement (avec mon dépôt dans /tmp/ggg2) :

GIT_WORK_TREE=/tmp/ggg2 GIT_DIR=/tmp/ggg2/.git git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.

L'exécution de la commande ci-dessous alors que mon cwd est /tmp met à jour ce repo, mais le fichier mis à jour apparaît dans /tmp au lieu de l'arborescence de travail /tmp/ggg2 :

GIT_DIR=/tmp/ggg2/.git git pull

Voir aussi cette réponse à une question similaire qui démontre l'efficacité de la --git-dir y --work-tree drapeaux.

0 votes

Avez-vous essayé d'utiliser uniquement GIT_WORK_TREE ?

0 votes

@Arrowmaster : oui, si vous faites cela, git ne peut pas trouver le fichier .git répertoire.

0 votes

Ah oui, la page de manuel dit que GIT_WORK_TREE n'est pas utilisé si GIT_DIR n'est pas défini. Il semble étrange que cela ne fonctionne pas alors que les deux sont utilisés.

34voto

takeshin Points 16579

Vous pouvez l'intégrer dans un script bash ou un alias git :

cd /X/Y && git pull && cd -

1 votes

Cela fonctionne sans aucun doute, mais je me demande s'il n'y a pas un moyen d'utiliser la commande git sans changer de répertoire. Je commence à penser qu'il n'y en a pas.

1 votes

Et utiliser le pushd/popd au lieu de cd/cd-

1 votes

Vous pouvez également utiliser un sous-shell pour éviter d'avoir à revenir en arrière : (cd xyz && git pull)

31voto

samtresler Points 326

Cet article est un peu ancien, il se peut donc qu'il y ait eu un bug et qu'il ait été corrigé, mais c'est ce que je viens de faire :

git --work-tree=/X/Y --git-dir=/X/Y/.git pull origin branch

Et cela a fonctionné. Il m'a fallu une minute pour comprendre qu'il voulait le fichier point et le répertoire parent (dans une configuration standard, ceux-ci sont toujours parent/enfant, mais pas dans TOUTES les configurations, ils doivent donc être spécifiés explicitement).

0 votes

J'aime cette solution parce qu'elle fonctionne avec des répertoires comme \\remotemachine\C $ \folder\etc

4voto

jonescb Points 5500

Vous pouvez écrire un script comme suit :

cd /X/Y
git pull

Vous pouvez lui donner un nom comme gitpull .
Si vous préférez qu'il traite des répertoires arbitraires au lieu de /X/Y :

cd $1
git pull

Vous pouvez alors l'appeler avec gitpull /X/Z
Enfin, vous pouvez essayer de trouver des dépôts. J'ai un ~/git qui contient des dépôts, et vous pouvez l'utiliser pour faire un pull sur chacun d'entre eux.

g=`find /X -name .git`
for repo in ${g[@]}
do
    cd ${repo}
    cd ..
    git pull
done

2 votes

Si vous voulez le faire à partir de la ligne de commande, faites-le dans un sous-shell : (cd /X/Y && git pull) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X