2017-10-12 6 views
2

J'ai un grand dépôt privé qui est maintenu sur un réseau local. J'aimerais pousser automatiquement une sous-arborescence de ce référentiel en dehors de ce réseau. J'ai besoin d'être simple:Git: existe-t-il un moyen de pousser automatiquement un sous-arbre?

* Tâche * quelqu'un pousse à dépôt distant local -> un sous-arbre est poussé automatiquement à un autre dépôt

Je ne sais pas si cela pourrait être atteint avec un serveur crochet latéral car AFAIK il n'y a rien de tel que pousser sous-arbres à partir de télécommandes nues. Je suis venu avec deux idées:

  • Je pourrais cloner la télécommande sur le serveur et diviser automatiquement le sous-arbre dans la télécommande clonée. Cela n'aide pas vraiment parce que je ne sais pas comment tirer automatiquement le sous-arbre (d'autres ont aussi this problem).
  • Une autre idée consiste à écrire un côté client personnalisé post-commit-hook et que chaque utilisateur l'installe, mais c'est terrible, n'est-ce pas? Le livre de Git indique spécifiquement que policies should be enforced on server side.

Existe-t-il un moyen simple de réaliser quelque chose comme ça? Ou est-ce impossible et c'est juste un abus git?

+0

Vous pouvez passer d'un point d'accès post-réception sur un référentiel distant nu à un autre référentiel distant, alors quel est le problème? – wrzasa

+0

@wrzasa hey, merci de demander. Peut-être n'ai-je pas suffisamment clarifié cette partie: pouvez-vous pousser * sous-arbres * depuis des télécommandes nues? J'ai pensé, puisqu'il n'y a pas d'arbre de travail sur une télécommande, vous ne pouvez pas vraiment spécifier un sous-arbre. E: J'ai édité la question pour la rendre claire. – jjj

+1

N'a pas utilisé de sous-arborescence, mais vous pouvez toujours dans votre hook récupérer votre repo dans un répertoire temporaire, puis faire ce dont vous avez besoin. – wrzasa

Répondre

0

Euh, je suis un peu gêné. Apparemment, c'était beaucoup plus facile que je ne le pensais. Voici une solution hâtive qui se fonde sur @wrzasa suggestion:

  1. cloner votre dépôt sur le serveur auquel vous poussent, comme celui-ci (dir.git est un repo nu):

    . 
    |- dir.git 
    |- dir 
    
  2. en dir faire: git remote add <remote-name> <remote-address>

  3. en dir.git/hooks/post-receive put:

    #! /bin/bash 
    unset GIT_DIR 
    cd ../dir 
    git pull ../dir.git 
    git subtree split --prefix=<subdir-in-dir> --branch=<branch-name> 
    git push <remote-name> <branch-name> 
    

    N'oubliez pas de créer post-receive exécutable. Voir this answer si vous voulez savoir pourquoi unset GIT_DIR est nécessaire.

C'est à peu près tout. Maintenant, chaque fois que quelqu'un pousse à dir distant (c'est-à-dire dir.git) sous-arbre lib sera poussé à <remote-name>.