14

N 個のフォルダーを持つ git リポジトリがあります。

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
}

-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...

4

1 に答える 1

6

git-subtree は勝利のソリューションであり、実際、私がスクリプトで行っていたことや、より優れた "git-native" の方法でさらに多くのことを実行します。

これは、環境をセットアップするために従ったチュートリアルへのリンクです。

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

于 2016-06-28T08:54:22.327 に答える