Bài viết này đề cập đến vấn đề này tương đối tốt:
https://github.com/rrrene/gitscm-next/blob/master/app/views/blog/progit/2010-04-11-enosystem.markdown
Về cơ bản, nếu bạn đang làm việc từ dòng lệnh, điều này đơn giản hơn bạn có thể đoán. Giả sử bạn muốn có 2 git repo:
.gitone
.gittwo
Bạn có thể thiết lập chúng như vậy:
git init .
mv .git .gitone
git init .
mv .git .gittwo
Bạn có thể thêm một tệp và cam kết chỉ một tệp như vậy:
git --git-dir=.gitone add test.txt
git --git-dir=.gitone commit -m "Test"
Vì vậy, các tùy chọn cho git xuất hiện đầu tiên, sau đó là lệnh, sau đó là các tùy chọn của lệnh git. Bạn có thể dễ dàng có đủ bí danh một lệnh git như:
#!/bin/sh
alias gitone='git --git-dir=.gitone'
alias gittwo='git --git-dir=.gittwo'
Vì vậy, bạn có thể cam kết với cái này hay cái kia với một chút gõ ít hơn, chẳng hạn như gitone commit -m "blah"
.
Những gì dường như trở nên phức tạp hơn là bỏ qua. Vì .gitignore thường nằm trong thư mục gốc của dự án, bạn cần phải tìm cách chuyển đổi nó mà không cần chuyển đổi toàn bộ thư mục gốc. Hoặc, bạn có thể sử dụng .git / info /lude, nhưng tất cả các thao tác bỏ qua bạn thực hiện sau đó sẽ không được cam kết hoặc đẩy - điều này có thể gây khó khăn cho người dùng khác. Những người khác sử dụng một trong hai repo có thể đẩy một .gitignore, điều này có thể gây ra xung đột. Tôi không rõ cách tốt nhất để giải quyết những vấn đề này.
Nếu bạn thích các công cụ GUI như TortoiseGit, bạn cũng sẽ gặp một số thách thức. Bạn có thể viết một đoạn script nhỏ đổi tên .gitone hoặc .gittwo thành .git tạm thời để đáp ứng các giả định của công cụ này.
git subtree
sẽ hoàn thành công việc.