2016-06-28 1 views
8

Nous avons un dépôt git avec N dossiers.git submodules, gitslave, git subtree ou une solution plus simple

Repo 
|-Folder1 
|-Folder2 
|- ... 
|-FolderN 

Avec différents collaborateurs, nous aimerions partager différents dossiers. Chaque collaborateur doit avoir accès uniquement à son sous-ensemble de dossiers autorisé. Quel est le "bon" moyen d'y parvenir en utilisant git?


Une réponse a été d'utiliser git submodules. Mais après avoir lu cet article: https://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/ J'ai compris que vous devez avoir une bonne maîtrise de git (ce qui n'est pas le cas de nos collaborateurs) afin de ne pas avoir de problèmes lors de l'utilisation git submodules. J'ai lu environ quelques alternatives possibles comme gitslave et git subtree. gitslave semblait être une bonne solution mais toujours une solution complexe à mon avis.

Voici ma solution simple et je voudrais savoir si elle peut avoir des inconvénients très mauvais:

-ayant un référentiel simple pour chaque dossier et un référentiel pour Repo. Ensuite, ajoutez tous les fichiers dans Folder1, ..., FolderN dans le Repo principal.

scénario -globalpush:

function globalpush(){ 
REPOS="$HOME/Repo/ 
     $HOME/Repo/Folder1 
     $HOME/Repo/Folder2 
     $HOME/Repo/Folder3 
     # ... 
     $HOME/Repo/FolderN" 

#do not show untracked files 
git config status.showuntrackedfiles no 

read -p "Commit description: " description 

for repo in ${REPOS} 
do 
    # if the repo folder exists 
    if [ -d $repo ] 
    then 
     # Go inside the repo 
     cd $repo 
     echo "-----PUSHING REPO : "$repo"-----" 

     #add all modified all deleted TRACKED files 
     git add -u . 

     git commit --allow-empty -m "$description" 
     git push     
    else 
     echo "-----COULD NOT FIND : "$repo"-----" 
    fi 
done 

#show untracked files again 
git config status.showuntrackedfiles normal 
} 

scénario -globalpull:

function globalpull(){ 
REPOS="$HOME/Repo/ 
     $HOME/Repo/Folder1 
     $HOME/Repo/Folder2 
     $HOME/Repo/Folder3 
     # ... 
     $HOME/Repo/FolderN"   

for repo in ${REPOS} 
do 
    # if the repo folder exists 
    if [ -d $repo ] 
    then 
     # Go inside the repo 
     cd $repo 
     # pull the modifs. 
     echo "-----PULLING REPO : "$repo"-----" 
     git pull       
    else 
     echo "-----COULD NOT FIND : "$repo"-----" 
    fi 
done 
} 

Les avantages de cette solution sont:

1 - Une solution simple que tout le monde peut comprendre.

2 - Possibilité de donner les droits d'accès pour chaque dossier indépendamment.

3 - Pour les développeurs principaux (qui ont accès à Repo) le référentiel Repo est autonome, et contient tout l'historique (en cas de problème avec les dépôts de Folder1, ..., FolderN). - quand un développeur principal fait un commit avec une description donnée, un commit avec la même description sera créé pour tous les dépôts Folders, même ceux sans modification (--allow-empty), ce qui bien sûr est n'est pas parfait mais permet de suivre les versions qui sont soumises par les principaux développeurs.

EDIT:

Il semble y avoir une nouvelle commande que je ne connaissais pas git subrepo ...

+0

est-il un outil qui fait quelque chose de similaire à mes scripts? –

+0

Voir mon [fourche non officiel de gitslave] (https://github.com/joelpurra/gitslave), espérons plus actif que l'original a été depuis 2.0.2. –

Répondre

3

-git était la sous-arbre solution gagnante et en fait, il fait ce que je faisais avec mes scripts et beaucoup plus, d'une meilleure manière "git-native".

Voici un lien vers le didacticiel que nous avons suivi pour configurer notre environnement.

https://hpc.uni.lu/blog/2014/understanding-git-subtree/