Cách thực hành tốt nhất để đưa nhiều dự án vào kho git là gì? [đóng cửa]


188

Vì một số lý do, tôi chỉ có một kho lưu trữ để sử dụng.
Nhưng tôi có nhiều dự án bao gồm javacác dự án php scriptsAndroiddự án ứng dụng.

Bây giờ vấn đề của tôi là, tôi phải đặt chúng vào các thư mục con khác nhau bên trong kho lưu trữ
mà tôi sử dụng các IDE khác nhau, Bạn biết đấy, mỗi IDE có thể có một không gian làm việc của chính nó.

Ai có thể cho tôi biết một thực tiễn tốt nhất để giải quyết vấn đề?



2
Bạn không cô đơn. Tôi có trường hợp tương tự với các repos mà tôi sử dụng cho mục đích học tập (ví dụ: github.com/hopbit/java-sandbox ). Tôi không muốn tạo repo mới để thử các ví dụ cho mỗi cuốn sách / hướng dẫn mới mà tôi bắt đầu đọc ...
ukasz Siwiński

Một lý do bạn muốn làm điều này là nếu bạn có một dự án là mã sản phẩm mà bạn triển khai cho các môi trường thời gian chạy như thử nghiệm hoặc sản xuất. Dự án thứ hai là một ứng dụng kiểm tra hệ thống (ví dụ BDD) dự án đầu tiên. Có một mối quan hệ chặt chẽ giữa hai dự án này và bây giờ bạn có thể duy trì / tham khảo toàn bộ bằng cách sử dụng một url kho lưu trữ.
Lance Kind

Tóm tắt như dưới đây "Git không biết liệu đây là một phần của các dự án giống nhau hay khác nhau"
ahmednabil88

Câu trả lời:


198

Trong khi hầu hết mọi người sẽ bảo bạn chỉ sử dụng nhiều kho lưu trữ, tôi cảm thấy đáng nói là có những giải pháp khác.

Giải pháp 1

Một kho lưu trữ duy nhất có thể chứa nhiều nhánh độc lập , được gọi là nhánh mồ côi . Các nhánh mồ côi hoàn toàn tách biệt với nhau; họ không chia sẻ lịch sử.

git checkout --orphan BRANCHNAME

Điều này tạo ra một nhánh mới, không liên quan đến nhánh hiện tại của bạn. Mỗi dự án nên ở trong chi nhánh mồ côi của riêng mình.

Bây giờ vì lý do gì, git cần một chút dọn dẹp sau khi thanh toán mồ côi.

rm .git/index
rm -r *

Đảm bảo mọi thứ được cam kết trước khi xóa

Khi nhánh mồ côi sạch sẽ, bạn có thể sử dụng nó bình thường.

Giải pháp 2

Tránh tất cả những rắc rối của các chi nhánh mồ côi. Tạo hai kho lưu trữ độc lập và đẩy chúng vào cùng một điều khiển. Chỉ cần sử dụng tên chi nhánh khác nhau cho mỗi repo.

# repo 1
git push origin master:master-1

# repo 2
git push origin master:master-2

Cảm ơn rất nhiều, điều đó sẽ có thể giải quyết vấn đề của tôi. Trên thực tế, hai giải pháp sử dụng các chi nhánh để tổ chức các dự án khác nhau.
Stony

6
Tôi không chắc là tôi hiểu giải pháp 2. Bạn có nói rằng bạn cam kết tất cả các tệp .git vào một repo chính không? Có gì khác nhau giữa việc sử dụng nhiều nhánh mồ côi so với sử dụng nhiều nhánh?
Nate

13
@Nate Những gì anh ấy đang nói là: tạo hai kho lưu trữ cục bộ riêng biệt , sau đó đẩy cả hai vào cùng một kho lưu trữ từ xa trên GitHub.
Chàng trai với chiếc mũ

1
Cảm ơn @TheGuywithTheElfHat. Bây giờ tôi nhìn lại nó (9 tháng sau) nó có vẻ rõ ràng đối với tôi. Giải pháp 2 vẫn đang tạo ra các nhánh mồ côi nhưng tôi có thể thấy phương pháp này dễ đối phó hơn.
Nate

21
Giải pháp 2 cần giải thích thêm
eC Droid

19

Giải pháp 3

Điều này là để sử dụng một thư mục duy nhất cho nhiều dự án. Tôi sử dụng kỹ thuật này cho một số dự án liên quan chặt chẽ, nơi tôi thường cần phải thay đổi từ dự án này sang dự án khác. Nó tương tự như ý tưởng về các nhánh mồ côi nhưng các nhánh không cần phải mồ côi. Đơn giản chỉ cần bắt đầu tất cả các dự án từ cùng một trạng thái thư mục trống.

Bắt đầu tất cả các dự án từ một thư mục trống đã cam kết

Đừng mong đợi điều kỳ diệu từ giải pháp này. Như tôi thấy, bạn sẽ luôn gặp khó chịu với các tập tin không được theo dõi. Git không thực sự biết phải làm gì với chúng và vì vậy nếu có các tệp trung gian được tạo bởi trình biên dịch và bị bỏ qua bởi tệp .gitignore của bạn, có khả năng chúng sẽ bị treo trong một thời gian nếu bạn cố gắng trao đổi nhanh giữa - ví dụ - dự án phần mềm của bạn và dự án luận án PH.D.

Tuy nhiên đây là kế hoạch. Bắt đầu như bạn nên bắt đầu bất kỳ dự án git nào, bằng cách cam kết kho lưu trữ trống, và sau đó bắt đầu tất cả các dự án của bạn từ cùng một trạng thái thư mục trống. Bằng cách đó, bạn chắc chắn rằng hai lô tệp khá độc lập. Ngoài ra, cung cấp cho các chi nhánh của bạn một tên thích hợp và đừng lười biếng chỉ sử dụng "chủ". Các dự án của bạn cần phải riêng biệt để cung cấp cho họ tên thích hợp.

Git cam kết (và do đó thẻ và chi nhánh) về cơ bản lưu trữ trạng thái của một thư mục và các thư mục con của nó và Git không biết liệu đây là các phần của cùng một dự án hay khác nhau nên thực sự không có vấn đề gì khi git lưu trữ các dự án khác nhau trong cùng một kho lưu trữ. Vấn đề là sau đó bạn phải xóa các tệp không bị theo dõi khỏi một dự án khi sử dụng dự án khác hoặc tách các dự án sau đó.

Tạo một kho lưu trữ trống

cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY

Bắt đầu các dự án của bạn từ trống.

Làm việc trên một dự án.

git branch software EMPTY
git checkout software
echo "array board[8,8] of piece" > chess.prog

git add chess.prog 
git commit -m "chess program"

Bắt đầu một dự án khác

bất cứ khi nào bạn muốn.

git branch thesis EMPTY
git checkout thesis
echo "the meaning of meaning" > philosophy_doctorate.txt
git add philosophy_doctorate.txt 
git commit -m "Ph.D"

Chuyển đổi qua lại

Quay trở lại và chuyển tiếp giữa các dự án bất cứ khi nào bạn muốn. Ví dụ này quay trở lại dự án phần mềm cờ vua.

git checkout software
echo "while not end_of_game do make_move()" >> chess.prog
git add chess.prog 
git commit -m "improved chess program"

Các tập tin không bị theo dõi gây phiền nhiễu

Tuy nhiên, bạn sẽ khó chịu bởi các tệp không bị theo dõi khi hoán đổi giữa các dự án / chi nhánh.

touch untracked_software_file.prog
git checkout thesis 
ls
    philosophy_doctorate.txt  untracked_software_file.prog

Đó không phải là một vấn đề không thể vượt qua

Theo định nghĩa, git không thực sự biết phải làm gì với các tệp không bị theo dõi và tùy thuộc vào bạn để xử lý chúng. Bạn có thể ngăn chặn các tệp không bị theo dõi khỏi được mang từ chi nhánh này sang chi nhánh khác như sau.

git checkout EMPTY 
ls
    untracked_software_file.prog
rm -r *
    (directory is now really empty, apart from the repository stuff!)
git checkout thesis
ls
    philosophy_doctorate.txt

Bằng cách đảm bảo rằng thư mục trống trước khi kiểm tra dự án mới của chúng tôi, chúng tôi đảm bảo rằng không có các tệp bị treo không bị theo dõi từ dự án khác.

Một sàng lọc

$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty

Nếu cùng một ngày được chỉ định bất cứ khi nào cam kết một kho lưu trữ trống, thì các cam kết kho lưu trữ trống được tạo độc lập có thể có cùng mã SHA1. Điều này cho phép hai kho lưu trữ được tạo độc lập và sau đó được hợp nhất với nhau thành một cây duy nhất với một gốc chung trong một kho lưu trữ sau đó.

Thí dụ

# Create thesis repository. 
# Merge existing chess repository branch into it

mkdir single_repo_for_thesis_and_chess
cd single_repo_for_thesis_and_chess
git init
touch .gitignore
git add .gitignore
GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01:T01:01:01' git commit -m empty
git tag EMPTY
echo "the meaning of meaning" > thesis.txt
git add thesis.txt
git commit -m "Wrote my PH.D"
git branch -m master thesis

# It's as simple as this ...
git remote add chess ../chessrepository/.git
git fetch chess chess:chess

Kết quả

Sơ đồ kho lưu trữ hợp nhất

Sử dụng thư mục con cho mỗi dự án?

Nó cũng có thể hữu ích nếu bạn giữ các dự án của mình trong các thư mục con nếu có thể, ví dụ thay vì có các tệp

chess.prog
philosophy_doctorate.txt 

chess/chess.prog
thesis/philosophy_doctorate.txt 

Trong trường hợp này, tập tin phần mềm không bị theo dõi của bạn sẽ được chess/untracked_software_file.prog. Khi làm việc trong thesisthư mục, bạn không nên bị làm phiền bởi các tệp chương trình cờ không bị theo dõi và bạn có thể tìm thấy những dịp mà bạn có thể làm việc vui vẻ mà không xóa các tệp không bị theo dõi khỏi các dự án khác.

Ngoài ra, nếu bạn muốn xóa các tệp không bị theo dõi khỏi các dự án khác, sẽ nhanh hơn (và ít bị lỗi hơn) để xóa một thư mục không mong muốn hơn là xóa các tệp không mong muốn bằng cách chọn từng tệp.

Tên chi nhánh có thể bao gồm các ký tự '/'

Vì vậy, bạn có thể muốn đặt tên cho các chi nhánh của bạn như

project1/master
project1/featureABC
project2/master
project2/featureXYZ

9

Tôi sẽ sử dụng git submodules.

hãy xem kho lưu trữ Git trong kho Git

Theo tháng 2 năm 2014, tôi sẽ đề nghị Monorepos


5
"Tôi chỉ có một kho lưu trữ để sử dụng." Bạn có quan tâm để giải thích làm thế nào bạn sẽ lưu trữ một số mô hình con trong cùng một kho lưu trữ không?
Ivan

4
git submodule add [url to git repo]- git-scm.com/book/en/v2/Git-Tools-Submodules
prasanthv

3
Bạn có thể giải thích tại sao 'Monorepose'?
sophievda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.