Подмодули 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" виде.
Вот ссылка на учебник, которому мы следовали, чтобы настроить нашу среду.