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
...
C'è qualche strumento che fa qualcosa di simile ai miei script? –
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. –