2016-06-28 15 views
8

Wir haben ein Git-Repository mit N-Ordnern.git submodule, gitslave, git subtree oder eine einfachere Lösung

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

Mit verschiedenen Mitarbeitern möchten wir verschiedene Ordner teilen. Jeder Mitarbeiter sollte nur Zugriff auf seine erlaubte Teilmenge von Ordnern haben. Was ist der "gute" Weg, dies mit git zu erreichen?


Eine Antwort war, git submodules zu verwenden. Aber nachdem ich diesen Artikel gelesen habe: https://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/ Ich habe verstanden, dass Sie eine gute Beherrschung von Git haben müssen (was nicht der Fall unserer Mitarbeiter ist), um keine Probleme zu haben, wenn Sie git submodules verwenden.

Ich lese über einige mögliche Alternativen wie gitslave und git subtree. gitslave schien eine gute Lösung zu sein, aber immer noch eine komplexe Lösung meiner Meinung nach.

Hier ist meine einfache Lösung, und ich würde gerne wissen, ob es einige sehr schlechten Nachteile haben kann:

ein einfaches Repository für jeden Ordner und ein Repository für Repo -unter. Dann fügen Sie alle Dateien in Folder1, ..., FolderN im Haupt-Repo hinzu.

-globalpush Skript:

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 
} 

-globalpull Skript:

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 
} 

Die Vorteile dieser Lösung sind:

1 - einfache Lösung, die jeder verstehen kann.

2 - Möglichkeit, die Zugriffsrechte für jeden Ordner unabhängig zu geben.

3 - Für die Hauptentwickler (die Zugriff auf Repo haben) ist das Repository Repo eigenständig und enthält den gesamten Verlauf (falls etwas mit den Repositories von Folder1, ..., FolderN nicht funktioniert).

4 - Wenn ein Hauptentwickler einen Commit mit einer gegebenen Beschreibung vornimmt, wird ein Commit mit der gleichen Beschreibung für alle Ordner-Repositories erstellt, auch für solche ohne eine Modifikation (--allow-empty), was natürlich isn ist Es ist zwar perfekt, hilft aber beim Nachverfolgen von Versionen, die von den Hauptentwicklern eingereicht wurden.

EDIT:

Es scheint einen neuen Befehl zu sein, die ich nicht bewusst war git subrepo ...

+0

Gibt es ein Tool, das so etwas wie meine Skripte tut? –

+0

Siehe meine [inoffizielle Gabel von Gitslave] (https://github.com/joelpurra/gitslave), hoffentlich aktiver als das Original seit 2.0.2. –

Antwort

3

git-Unterbaum war die überzeugende Lösung und in der Tat tut es das, was ich mit meiner Skripte tat und viel mehr, auf eine bessere "git-native" Weise.

Hier ist ein Link zu dem Tutorial, das wir zum Einrichten unserer Umgebung verwendet haben.

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