подмодули git, gitslave, поддерево git или более простое решение

у нас есть репозиторий git с N папками.

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

С различными сотрудниками мы хотели бы поделиться различными папками. Каждый сотрудник должен иметь доступ только к своему разрешенному подмножеству папок. Каков "хороший" способ достичь этого с помощью git?


ответ был использовать git submodules. Но после того как я прочитал эту статью: https://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/ Я понял что вам нужно иметь хорошее мастерство git (что не относится к нашим сотрудникам), чтобы не иметь проблем при использовании git submodules.

Я читал о некоторых возможных альтернативах, таких как gitslave и git subtree. gitslave казалось хорошим решением, но все же сложным решением, на мой взгляд.

вот мое простое решение и я хотел бы знать, если это может иметь очень плохие недостатки :

- наличие простого репозитория для каждой папки и репозиторий для РЕПО. Затем добавьте все файлы в Folder1,..., FolderN в главном РЕПО.

-сценарий 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
}

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

преимущества этого решения являются следующими:

1 - Простое решение, которое каждый может понять.

2-возможность предоставления прав доступа для каждой папки самостоятельно.

3 - для основных разработчиков (имеющих доступ к РЕПО) репозиторий РЕПО является автономным и содержит всю историю (в случае, если что-то пойдет не так с репозиториями Folder1,..., FolderN).

4 - Когда основной разработчик делает фиксацию с заданным описанием, фиксация с тем же описанием будет создана для всех репозиториев папок, даже без изменений (--allow-empty), что, конечно, не идеально, но помогает отслеживать версии, представленные основными разработчиками.

изменить :

кажется, есть новая команда, о которой я не знал git subrepo ...

1 ответов


git-subtree было выигрышным решением, и на самом деле он делает то, что я делал с моими скриптами и многое другое, лучше "git-native".

вот ссылка на учебник, который мы следовали, чтобы настроить нашу среду.

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