IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GIT Discussion :

Dépôt bare et fichiers de travail.


Sujet :

GIT

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 207
    Points : 107
    Points
    107
    Par défaut Dépôt bare et fichiers de travail.
    Bonjour à tous,

    J'utilise rarement git et comme un idiot je n'ai pas explicitement commenté la façon dont je m'y suis pris pour créer un dépôt.
    L'idée était de créer un site internet en local et grâce à git pousser les fichiers en ligne.
    Ça fonctionne merveilleusement bien et je voudrais utiliser à nouveau ce principe. Mais aucune idée de comment faire.

    Ci-dessous l’arborescence du projet fonctionnel :

    Nom : gitgit.jpg
Affichages : 302
Taille : 6,1 Ko

    Dans mes souvenirs (qui valent ce qu'ils valent), remote.git est un dépôt bare et contient les dossiers / fichiers habituels (branches, hooks, config, HEAD...).
    Lorsque j'effectue un push en local, remote.git est bien mis à jour et les fichiers de travail sont téléversés / modifiés dans le dossier git-php. Le site web est fonctionnel à l'adresse https://mon_domaine/git/git-php.
    Un git remote -v en local me retourne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    origin identifiant@host:path/git/remote.git (fetch)
    origin identifiant@host:path/git/remote.git (push)
    J'ai essayé plusieurs fois en local (dépôt et clone sur ma machine) de retrouver ce comportement, sans succès.
    Pas de problème pour créer et cloner un dépôt bare et y "pusher" mes modifications, mais impossible de me souvenir comment profiter de mes fichiers de travail dans un dossier adjacent.


    Merci d'avance pour votre aide !

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Salut,

    C'est effectivement un cas assez récurrent. Par contre, je n'ai pas connaissance d'un paramètre explicite permettant de faire un fetch+checkout automatique sur un dépôt distant. Surtout que, dans ton cas, le contenu de « git-php » doit être limité à ce qui doit réellement être rendu public ou mis à la disposition du serveur Web. Pas question, par exemple, d'exposer le répertoire « .git » même s'il peut être explicitement interdit à l'aide d'une directive dans « .htaccess » ou dans la configuration du serveur.

    Je pense qu'il s'agit d'un hook, tout simplement, et qui fait ces opérations à chaque fois que tu effectues une poussée.

    Il faudrait voir le contenu des fichiers remote-git/config et git-php/.git/config.

    Bon courage.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 207
    Points : 107
    Points
    107
    Par défaut
    Hello Obsidian, merci pour ta réponse.

    Le plus rageant c'est d'avoir su le faire mais de ne pas être capable de reproduire
    J'ai bien un fichier README rempli par mes soins censé m'aider à comprendre, mais j'ai du oublier un truc. J'y indique cette marche à suivre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    _ Créer un dossier sur le domaine
    _ Y faire un git init (dépôt non bare, pas à partager, dépôt initial utilisé pour travailler et d'ici on push les modifications vers le dépôt partagé)
    _ Faire un git remote add origin ~/chemin/vers/le/dossier/
    _ En local, faire un git clone user@domaine:~/chemin/vers/le/dossier/
    Citation Envoyé par Obsidian Voir le message
    Je pense qu'il s'agit d'un hook, tout simplement, et qui fait ces opérations à chaque fois que tu effectues une poussée.
    Peut-être.
    Que dois je regarder pour confirmer ta pensée ?

    Citation Envoyé par Obsidian Voir le message
    Il faudrait voir le contenu des fichiers remote-git/config et git-php/.git/config.
    Le fichier config de remote-git est très succinct :

    [core]
    repositoryformatversion = 0
    filemode = true
    bare = true
    Quant au dossier git-php/, il ne semble pas contenir de dossier .git.
    La commande ls -a me retourne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .  ..  css  git-php.html  images  scripts  tmp-json
    Citation Envoyé par Obsidian Voir le message
    Bon courage.
    Merci bien 🤞

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Bonsoir,

    Citation Envoyé par themoye Voir le message
    Hello Obsidian, merci pour ta réponse.

    Le plus rageant c'est d'avoir su le faire mais de ne pas être capable de reproduire
    J'ai bien un fichier README rempli par mes soins censé m'aider à comprendre, mais j'ai du oublier un truc. J'y indique cette marche à suivre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    _ Créer un dossier sur le domaine
    _ Y faire un git init (dépôt non bare, pas à partager, dépôt initial utilisé pour travailler et d'ici on push les modifications vers le dépôt partagé)
    _ Faire un git remote add origin ~/chemin/vers/le/dossier/
    _ En local, faire un git clone user@domaine:~/chemin/vers/le/dossier/
    Attention, si le message ci-dessus est complet, il y a peut-être une petite erreur : « git clone » se charge en lui-même de créer un dossier, de l'initialiser, d'ajouter lui-même la référence distante sous le nom « origin » et de rapatrier son contenu avec fetch. Bien veiller à ne pas déclarer un dépôt Git au sein d'un autre dépôt Git… mais peu importe, ce n'est pas ce qui nous concerne pour l'instant.

    Quant au dossier git-php/, il ne semble pas contenir de dossier .git.
    La commande ls -a me retourne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .  ..  css  git-php.html  images  scripts  tmp-json
    Ok, donc git-php n'est pas du tout un dépôt Git. Ça me conforte dans l'idée que le serveur doit être équipé d'un hook qui fait les copies nécessaires vers ce répertoire à chaque fois qu'on le met à jour.


    Peut-être.
    Que dois je regarder pour confirmer ta pensée ?
    Il faudrait vérifier le contenu de « <remote-git>/hooks » et voir s'il s'y trouve des fichiers dont le nom ne se termine PAS en « *.sample » (ces fichiers-là sont des exemples pour aider l'administrateur à en écrire rapidement. Ils sont générés automatiquement à l'initialisation et sont ensuite ignorés par Git).

    En particulier, regarde si tu vois un fichier nommé « post-update » (sans l'extension *.sample), mais il peut y en avoir d'autres.

    La doc officielle concernant les hooks :
    https://git-scm.com/book/en/v2/Custo...-Git-Git-Hooks
    https://git-scm.com/book/fr/v2/Perso...t-Crochets-Git

    Merci bien 🤞
    À ton service.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 207
    Points : 107
    Points
    107
    Par défaut
    Bonjour bonjour,

    Citation Envoyé par Obsidian Voir le message
    Il faudrait vérifier le contenu de « <remote-git>/hooks » et voir s'il s'y trouve des fichiers dont le nom ne se termine PAS en « *.sample » (ces fichiers-là sont des exemples pour aider l'administrateur à en écrire rapidement. Ils sont générés automatiquement à l'initialisation et sont ensuite ignorés par Git).

    En particulier, regarde si tu vois un fichier nommé « post-update » (sans l'extension *.sample), mais il peut y en avoir d'autres.
    Ton cheminement semble se confirmer.
    Dans remote.git se trouve bel et bien un fichier sans .sample : post-receive.
    L'intégralité de son contenu se résume à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/bin/sh
    GIT_WORK_TREE=../git-php git checkout -f
    Je ne me souviens pas n'avoir jamais mis les pieds dans le dossier hook. 🤷
    Si je comprends bien cette ligne, git considère que le dossier de travail est ../git-php et met automatiquement à jour son contenu pour correspondre à la branche en cours lorsque je fais un push depuis mon dépôt local, clone de remote.git ?
    Si cette explication se confirme, quelle est la méthode pour réitérer ce comportement pour un autre dépôt ? Simplement ajouter un fichier post-receive du même type dans hook ? Existe t-il une ou un ensemble de commandes git pour arriver à ce résultat ?


    Merci !

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Citation Envoyé par themoye Voir le message
    Bonjour bonjour,

    Ton cheminement semble se confirmer.
    Dans remote.git se trouve bel et bien un fichier sans .sample : post-receive.
    Tous les hooks fonctionnent en fait grosso-modo de la même façon, mais il y a une demi-douzaine de cas de figures définis par Git qui te permettent de faire une première distinction sans avoir à tout mettre dans un seul script. Ensuite, tu peux utiliser les arguments passés au script pour faire une discrimination plus fine.

    Tout est détaillé dans la doc des liens ci-dessus.

    L'intégralité de son contenu se résume à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/bin/sh
    GIT_WORK_TREE=../git-php git checkout -f
    Je ne me souviens pas n'avoir jamais mis les pieds dans le dossier hook. 🤷
    Si c'est toi qu'il l'a écrit quand même, il est probable que tu aies cherché à ce moment-là la solution en ligne sur Internet et que tu aies copié-collé celle qui était la plus satisfaisante. Il se peut également que tu aies utilisé tout au départ un environnement de développement intégré ou un outil graphique de haut niveau manipulant Git en arrière-plan, et que c'est lui qui soit à l'origine de ce hook.

    Si je comprends bien cette ligne, git considère que le dossier de travail est ../git-php et met automatiquement à jour son contenu pour correspondre à la branche en cours lorsque je fais un push depuis mon dépôt local, clone de remote.git ?
    C'est presque cela : post-receive est appelé côté serveur après l'exécution complète d'un processus de réception, quel que soit ce qui a été envoyé. Le script lui-même est un « exécutable », donc quelque chose qui peut être lancé depuis le Shell. Ça peut donc être un script Shell, du Python, du Ruby, ou n'importe quoi d'autre, y compris un exécutable binaire compilé en C, par exemple. Ce script peut faire également ce qui lui chante : écrire « bonjour » à l'écran, envoyer un mail pour accuser bonne réception du commit, éteindre la machine, etc. Il bénéficie simplement, pour cela, d'informations transmises par Git via ses arguments et les variables d'environnement.

    Cela signifie donc que le script sera appelé chaque fois que le dépôt « remote » recevra quelque chose, quelle qu'en soit la source.

    Par défaut, le répertoire de travail d'un dépôt Git est celui qui contient « .git » ou est inexistant dans le cas d'un dépôt bare. Il reste cependant possible, dans les deux cas, d'en spécifier un explicitement et c'est ce que l'on fait en positionnant la variable GIT_WORK_TREE avant d'appeler la commande qui la suit. Donc, ici, on lance la commande « git -f checkout » sur le serveur, depuis le dépôt remote, en indiquant que le répertoire de travail est « git-php ». On utilise « -f » (pour « --force ») pour forcer la mise à jour puisque par nature, son contenu sera différent de la dernière version en date. La plupart du temps, ce n'est pas nécessaire, mais ça le devient si tu réécris l'histoire avec push -f ou si tu fais de gros changements sur la branche. Ça fonctionne exactement comme lorsque tu travailles dans un working tree ordinaire.

    Si cette explication se confirme, quelle est la méthode pour réitérer ce comportement pour un autre dépôt ? Simplement ajouter un fichier post-receive du même type dans hook ?
    À priori oui, mais ça dépend du contexte. Il faut d'abord vérifier que le dépôt Git concerné ne contient rien d'autre que l'historique du projet que tu veux déployer, sinon il faudra raffiner le script.

    Existe t-il une ou un ensemble de commandes git pour arriver à ce résultat ?
    Comme tu as pu le voir, le script concerné contient en fait une commande Git ordinaire.

    À dire vrai, si tu veux faire exactement la même chose, tu peux mettre te permettre de créer un dépôt ordinaire (non-bare) côté serveur et faire pointer ton serveur web dessus, tout en utilisant un hook pour faire un checkout dans le working tree normal plutôt que vers une cible dédiée. Ça reste tout de même plus propre de le faire tel que c'est construit actuellement.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 207
    Points : 107
    Points
    107
    Par défaut
    Hello,

    Des explications claires et précises, je passe le sujet en résolu.
    Je crois que j'ai retrouvé le (un des ?) tutos que j'ai suivi à l'époque (en novembre 2019, merci l'historique de navigation) : https://neurobin.org/docs/web/using-...nage-a-website.
    C'est bien ma mémoire qui me joue des tours

    Merci encore pour ton aide Obsidian.

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Citation Envoyé par themoye Voir le message
    Je crois que j'ai retrouvé le (un des ?) tutos que j'ai suivi à l'époque (en novembre 2019, merci l'historique de navigation) : https://neurobin.org/docs/web/using-...nage-a-website.
    C'est bien ma mémoire qui me joue des tours
    Novembre dernier, ce n'est pas si vieux ! Par contre, la mise en place du hook est bien cachée. Elle se trouve dans le deuxième bloc de la section 4.1… Il fallait la voir.

    J'ai juste omis un détail dans mes commentaires précédents : « git checkout » (avec ou sans « -f ») sans autre info récupère le contenu de la position pointée par HEAD, donc la branche courante dans la plupart des cas, ou un commit particulier si tu es dans l'état détaché. Par défaut, le dépôt de référence (le bare) pointe le sommet de la branche « master »… jusqu'à ce qu'on lui fasse pointer autre chose ! En principe, c'est impossible parce que c'est justement avec « checkout » que l'on change de branche ou que l'on déplace HEAD en mode détaché, et que c'est impossible sans working directory. À partir du moment où on en précise un, il est possible de déplacer HEAD sur le serveur comme on le ferait dans son propre dépôt.

    Cela signifie qu'il peut être intéressant de préciser explicitement la branche à vérifier dans le script de ton hook.

    Merci pour le retour d'info et bon courage pour la suite.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. importer fichier pour travailler avec
    Par debutante en galere dans le forum Général Python
    Réponses: 26
    Dernier message: 06/01/2010, 22h48
  2. Selectionner plusieurs fichiers et travailler avec
    Par diude54 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/09/2009, 11h22
  3. Réponses: 5
    Dernier message: 18/07/2008, 16h03
  4. [XSLT]connaître le nom du fichier de travail
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 26/07/2006, 11h56
  5. Réponses: 15
    Dernier message: 01/09/2005, 10h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo