git submodules , gitslave, git subtree 或更简单的解决方案
git submodules , gitslave, git subtree or a simpler solution
我们有一个包含 N 个文件夹的 git 存储库。
Repo
|-Folder1
|-Folder2
|- ...
|-FolderN
我们希望与不同的协作者共享不同的文件夹。每个协作者都应该只能访问他允许的文件夹子集。使用 git 实现此目的的 "good" 方法是什么?
答案是使用 git submodules
。但是看完这篇文章后:
https://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/
我了解到您需要很好地掌握 git(我们的合作者并非如此)才能在使用 git submodules
.
时不会出现问题
我阅读了一些可能的替代方案,例如 gitslave
和 git subtree
。 gitslave
似乎是一个很好的解决方案,但在我看来仍然是一个复杂的解决方案。
这是我的简单解决方案,我想知道它是否有一些非常糟糕的缺点:
-每个文件夹都有一个简单的存储库,还有一个用于 Repo 的存储库。然后在主 Repo 中添加 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 - 对于主要开发人员(有权访问 Repo),存储库 Repo 是独立的,包含所有历史记录(以防 Folder1、...、FolderN 的存储库出现问题)。
4 - 当主要开发人员使用给定描述进行提交时,将为所有文件夹存储库创建具有相同描述的提交,即使是那些没有修改(--allow-empty)的存储库,当然并不完美,但有助于跟踪主要开发人员提交的版本。
编辑:
似乎有一个我不知道的新命令git subrepo
...
git-subtree 是获胜的解决方案,事实上它以更好的 "git-native" 方式完成了我用我的脚本所做的事情等等。
这是我们用来设置环境的教程的link。
我们有一个包含 N 个文件夹的 git 存储库。
Repo
|-Folder1
|-Folder2
|- ...
|-FolderN
我们希望与不同的协作者共享不同的文件夹。每个协作者都应该只能访问他允许的文件夹子集。使用 git 实现此目的的 "good" 方法是什么?
答案是使用 git submodules
。但是看完这篇文章后:
https://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/
我了解到您需要很好地掌握 git(我们的合作者并非如此)才能在使用 git submodules
.
我阅读了一些可能的替代方案,例如 gitslave
和 git subtree
。 gitslave
似乎是一个很好的解决方案,但在我看来仍然是一个复杂的解决方案。
这是我的简单解决方案,我想知道它是否有一些非常糟糕的缺点:
-每个文件夹都有一个简单的存储库,还有一个用于 Repo 的存储库。然后在主 Repo 中添加 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 - 对于主要开发人员(有权访问 Repo),存储库 Repo 是独立的,包含所有历史记录(以防 Folder1、...、FolderN 的存储库出现问题)。
4 - 当主要开发人员使用给定描述进行提交时,将为所有文件夹存储库创建具有相同描述的提交,即使是那些没有修改(--allow-empty)的存储库,当然并不完美,但有助于跟踪主要开发人员提交的版本。
编辑:
似乎有一个我不知道的新命令git subrepo
...
git-subtree 是获胜的解决方案,事实上它以更好的 "git-native" 方式完成了我用我的脚本所做的事情等等。
这是我们用来设置环境的教程的link。