Подмодули 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
}

-глобальный сценарий:

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 - Для основных разработчиков (у которых есть доступ к Repo) репозиторий Repo является автономным и содержит всю историю (на случай, если что-то пойдет не так с репозиториями Folder1,..., FolderN).

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

РЕДАКТИРОВАТЬ:

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам