git子模块,gitslave,git子树或更简单的解决方案

Iss*_* T. 10 git git-submodules git-subtree git-slave git-subrepo

我们有一个包含N个文件夹的git存储库.

Repo
|-Folder1
|-Folder2
|- ...
|-FolderN
Run Code Online (Sandbox Code Playgroud)

我们希望与不同的合作者共享不同的文件夹.每个协作者只能访问其允许的文件夹子集.使用git实现这一目标的"好"方法是什么?


答案是使用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
}
Run Code Online (Sandbox Code Playgroud)

-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
}
Run Code Online (Sandbox Code Playgroud)

该解决方案的优点是:

1 - 每个人都能理解的简单解决方案.

2 - 可以单独为每个文件夹授予访问权限.

3 - 对于主要开发人员(可以访问Repo),存储库Repo是自包含的,包含所有历史记录(如果Folder1,...,FolderN的存储库出现问题).

4 - 当主开发人员使用给定描述进行提交时,将为所有文件夹存储库创建具有相同描述的提交,即使是那些没有修改的文件夹( - allow-empty),这当然不是完美的但是帮助跟踪主要开发人员提交的版本.

编辑:

似乎有一个我不知道的新命令git subrepo......

Iss*_* T. 5

git-subtree 是获胜的解决方案,实际上它以更好的“git-native”方式完成了我在脚本中所做的事情等等。

这是我们用来设置环境的教程的链接。

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