2016-06-28 19 views
8

私たちは、N個のフォルダーを持つgitリポジトリを持っています。gitサブモジュール、gitslave、gitサブツリー、またはより単純なソリューション

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

さまざまな共同作業者とは異なるフォルダを共有したいと考えています。各共同編集者は、許可されたフォルダのサブセットのみにアクセスする必要があります。 gitを使ってこれを達成する "良い"方法は何ですか?


答えはgit submodulesです。しかし、私がこの記事を読んだ後: https://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/ git submodulesを使用するときに問題がないようにするには、git(私たちの共同作業者の場合ではない)の優れた熟練が必要であると理解しました。

gitslavegit subtreeのようないくつかの可能な選択肢について読んでいます。 gitslaveは良い解決策に見えましたが、私の意見では依然として複雑な解決策でした。

は、ここに私のシンプルなソリューションであり、私はそれはいくつかの非常に悪い欠点が持つことができるかどうかを知りたい:各フォルダのためのシンプルなリポジトリとレポのリポジトリを-Having

を。次に、メイン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は自己完結型で、すべての履歴(Folder1、...、FolderNのリポジトリに問題が発生した場合)を含んでいます。

4 - 主な開発者が与えられた説明でコミットすると、変更なしのもの(--allow-empty)を含むすべてのフォルダリポジトリに対して、同じ記述を持つコミットが作成されます。完璧ではなく、主な開発者によって提出されたバージョンの追跡に役立ちます。

EDIT:

私はgit subrepoの知らなかった新しいコマンドがあるようです...

+0

私のスクリプトに類似したツールはありますか? –

+0

私の[gitslaveの非公式なフォーク](https://github.com/joelpurra/gitslave)を参照してください。元々2.0.2以降に活動していたほうがよかったです。 –

答えて

3

のgit-サブツリーが受賞ソリューションでしたし、実際にそれは私が私のスクリプトで何をしていたか行い、はるかに、より良い "git-native"のやり方で。

ここでは、私たちが環境を設定するのに従ったチュートリアルへのリンクがあります。

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