2016-06-28 28 views
8

Abbiamo un repository git con N cartelle.git submodules, gitslave, git subtree o una soluzione più semplice

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

Con diversi collaboratori vorremmo condividere cartelle diverse. Ogni collaboratore dovrebbe avere accesso solo al suo sottoinsieme di cartelle consentito. Qual è il modo "buono" per ottenere questo usando git?


Una risposta era utilizzare git submodules. Ma dopo aver letto questo articolo: https://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/ Ho capito che è necessario avere una buona padronanza di git (che non è il caso dei nostri collaboratori) al fine di non avere problemi quando si utilizza git submodules.

Ho letto su alcune possibili alternative come gitslave e git subtree. gitslave sembra essere una buona soluzione, ma a mio parere è ancora una soluzione complessa.

Qui è la mia soluzione semplice e vorrei sapere se si può avere degli svantaggi molto male:

-Avere un semplice repository per ogni cartella e un repository per Repo. Quindi aggiungere tutti i file in Cartella1, ..., CartellaN nel Repo principale.

sceneggiatura -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 
} 

sceneggiatura -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 
} 

I vantaggi di questa soluzione sono:

1 - soluzione semplice che tutti possono capire.

2 - Possibilità di assegnare i diritti di accesso per ciascuna cartella in modo indipendente.

3 - Per gli sviluppatori principali (che hanno accesso a Repo) il repository Repo è autonomo e contiene tutta la cronologia (nel caso qualcosa vada storto con i repository di Folder1, ..., FolderN).

4 - quando uno sviluppatore principale effettua un commit con una descrizione data, verrà creato un commit con la stessa descrizione per tutti i repository di cartelle, anche quelli senza una modifica (--allow-empty), che ovviamente non è perfetto ma aiuta a tenere traccia delle versioni inviate dagli sviluppatori principali.

EDIT:

Sembra che ci sia un nuovo comando non ero a conoscenza di git subrepo ...

+0

C'è qualche strumento che fa qualcosa di simile ai miei script? –

+0

Vedi il mio [fork non ufficiale di gitslave] (https://github.com/joelpurra/gitslave), si spera che più attivo rispetto all'originale sia stato dal 2.0.2. –

risposta

3

git-sottostruttura è stata la soluzione vincente e in effetti fa quello che stavo facendo con i miei script e molto di più, in un modo migliore "git-nativo".

Ecco un collegamento al tutorial che abbiamo seguito per configurare il nostro ambiente.

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