2016-06-28 18 views
8

Chúng tôi có kho lưu trữ git với các thư mục N.git submodules, gitslave, git subtree hoặc một giải pháp đơn giản

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

Với các cộng tác viên khác nhau, chúng tôi muốn chia sẻ các thư mục khác nhau. Mỗi cộng tác viên chỉ nên có quyền truy cập vào tập hợp con của các thư mục được cho phép. Cách "tốt" để đạt được điều này bằng cách sử dụng git là gì?


Một câu trả lời là sử dụng git submodules. Nhưng sau khi tôi đọc bài viết này: https://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/ Tôi hiểu rằng bạn cần phải nắm vững git (không phải là trường hợp cộng tác viên của chúng tôi) để không gặp vấn đề khi sử dụng git submodules.

Tôi đã đọc về một số lựa chọn thay thế có thể có như gitslavegit subtree. gitslave dường như là một giải pháp tốt nhưng vẫn là một giải pháp phức tạp theo ý kiến ​​của tôi.

Đây là giải pháp đơn giản của tôi và tôi muốn biết nếu nó có thể có một số nhược điểm rất xấu:

-Having một kho lưu trữ đơn giản cho mỗi thư mục và một kho lưu trữ cho Repo. Sau đó thêm tất cả các tập tin trong Folder1, ..., FolderN trong Repo chính.

kịch bản -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 kịch bản:

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 
} 

Những lợi thế của giải pháp này là:

1 - giải pháp đơn giản mà ai cũng có thể hiểu được.

2 - Khả năng cấp quyền truy cập cho từng Thư mục một cách độc lập.

3 - Đối với các nhà phát triển chính (có quyền truy cập vào Repo) kho lưu trữ Repo là khép kín và chứa tất cả lịch sử (trong trường hợp xảy ra sự cố với kho lưu trữ của Folder1, ..., FolderN).

4 - khi nhà phát triển chính thực hiện cam kết với mô tả nhất định, cam kết có cùng mô tả sẽ được tạo cho tất cả các kho thư mục, ngay cả những người không sửa đổi (--allow-empty). không hoàn hảo nhưng giúp theo dõi các phiên bản được gửi bởi các nhà phát triển chính.

EDIT:

Dường như có một lệnh mới tôi đã không nhận thức được git subrepo ...

+0

Có công cụ nào tương tự với tập lệnh của tôi không? –

+0

Xem [fork không chính thức của gitslave] của tôi (https://github.com/joelpurra/gitslave), hy vọng hoạt động nhiều hơn bản gốc kể từ phiên bản 2.0.2. –

Trả lời

3

git-cây con là giải pháp chiến thắng và trên thực tế nó làm những gì tôi đã làm với các kịch bản của tôi và nhiều hơn nữa, theo cách "git-native" tốt hơn.

Đây là liên kết đến hướng dẫn mà chúng tôi đã theo dõi để thiết lập môi trường của chúng tôi.

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

Các vấn đề liên quan