Pertahankan git repo di dalam repo git lain

125

Inilah yang saya suka:

REPO-A
  /.git
  /otherFiles
  /REPO-B
    /.git
    /moreFiles

Saya ingin dapat mendorong semua konten REPO-A ke REMOTE-A dan hanya REPO-B ke REMOTE-B.

Bisa jadi?

adamyonk
sumber

Jawaban:

104

Sepertinya Anda ingin menggunakan submodul Git .

Git mengatasi masalah ini menggunakan submodul. Submodul memungkinkan Anda menyimpan repositori Git sebagai subdirektori dari repositori Git lainnya. Ini memungkinkan Anda mengkloning repositori lain ke dalam proyek Anda dan menjaga komit Anda tetap terpisah.

mipadi
sumber
19
Tidak persis: itu tidak akan mendorong semua konten repoA: hanya A ditambah referensi ke B. Tapi saya tidak mengkritik jawaban Anda, saya terburu-buru menulis hampir sama ketika saya membaca kembali pertanyaan OP;)
VonC
1
Ini adalah kasus penggunaan untuk submodul. REPO-A dan REPO-B diperlakukan sebagai git repos dengan hak mereka sendiri, dengan komitmen, asal, sejarah, dll.
Damien Wilson
2
jadi jika saya membacanya dengan benar, dapatkah saya memeriksa sendiri repo submodule-d sepenuhnya di luar yang saya temukan? Bagaimana saya akan mengambil repo yang sudah ada dan mereferensikannya sebagai submodul di proyek lain?
JohnO
saya tidak mencari solusi yang persis sama dengan OP, dan saya rasa rata-rata ini mungkin jawaban yang lebih dicari untuk pertanyaan serupa: "apakah menempatkan git REPO-B dalam git REPO-A menyematkan referensi atau salinan lengkap dari git REPO-B? ".
jaya
64

Saya selalu menggunakan symlink untuk mempertahankan dua repo yang terpisah dan berbeda.

JohnO
sumber
8
untuk betapa membingungkannya submodul git dan sub-pohon git, ini adalah jawaban yang valid.
Trevor Hickey
Ini juga sangat berguna untuk merakit satu aplikasi dari beberapa repositori jarak jauh
GeraldScott
22
Untuk mempertahankan dua repo yang terpisah dan berbeda, bukankah boleh menyimpan repo B di repo A dan hanya menambahkan repo B ke repo A .gitignore?
Fabien Snauwaert
1
Saya berpikir untuk melakukan apa yang disarankan Fabien, apakah ada masalah dengan melakukannya dengan cara itu?
theonlygusti
1
Saya menyimpan repositori git terpisah dan menyalin perubahan yang dibuat ke REPO-B dalam salinan REPO-B (tanpa .git) yang bersarang di REPO-A. Saya melakukannya dengan rsync. Saya menjalankan rsync -avh --delete --exclude='.git' REPO-B/ REPO-A/REPO-B-copy/setelah ada perubahan pada REPO-B
Shai
29

Ya, Anda dapat melakukan apa yang Anda minta dengan hierarki file yang Anda gambar. Repo-B bersifat independen dan tidak memiliki pengetahuan tentang Repo-A. Repo-A akan melacak semua perubahan dalam file itu sendiri dan file Repo-B.

Namun, saya tidak akan merekomendasikan melakukan ini. Setiap kali Anda mengubah file dan berkomitmen dalam Repo-B, Anda harus berkomitmen dalam Repo-A. Percabangan di Repo-B akan mengacaukan Repo-A dan percabangan di Repo-A akan miring (kesulitan menghapus folder, dll.). Submodul jelas merupakan cara terbaik.

kubi
sumber
53
Tidak bisakah Anda menambahkan REPO-B ke /REPO-A/.gitignore?
mikkelbreum
2
@mikkelbreum Saya punya ide yang sama persis. Kami saat ini menggunakan subverion untuk proyek utama kami dan menggunakan repo git di salah satu subfolder. Dengan SVN saya baru saja menambahkan folder dengan git repo ke svn: ignore property dan saya bertanya pada diri sendiri apakah saya dapat melakukan hal yang sama dengan git.
2ndkauboy
3
Saya tidak mengerti mengapa menambahkan repo git bersarang ke daftar abaikan dari repo induk seharusnya tidak berfungsi .. Tetapi pada saat yang sama saya merasa pasti ada beberapa tangkapan yang belum saya pikirkan, karena pendekatan ini jarang terlihat disarankan, dan banyak orang mencegah git repo bersarang.
mikkelbreum
18
Saya baru saja menerapkan skenario yang tepat ini. Saya memiliki beberapa file CSS yang tidak terkompresi dalam subfolder yang tidak ingin saya masukkan ke repo jarak jauh, jadi ada di .gitignore saya. Tapi saya ingin melacak perubahan pada file ini secara lokal. Saya menyiapkan repo di dalam folder dengan file yang tidak dikompresi dan menambahkan semua file ke repo itu. Itu masih diabaikan oleh repo induk tetapi saya dapat melacak perubahan di dalam sub-repo. Direkomendasikan atau tidak, solusi ini adalah kunci untuk situasi tertentu seperti ini.
BrianVPS
1
Saya mengerti bahwa setiap kali Anda berpindah cabang dalam satu repositori, yang lain akan melihat banyak perubahan, tetapi mengapa "percabangan di Repo-A akan miring (kesulitan menghapus folder, dll.)."? Terima kasih!
pengguna2688151
2

Anda dapat mencapai apa yang Anda inginkan (repo REPO-A berisi semua file, termasuk yang ada di folder REPO-B, bukan hanya referensi) dengan menggunakan "git-subrepo":

https://github.com/ingydotnet/git-subrepo

Ini masih berfungsi jika beberapa kontributor Anda tidak menginstal perintah subrepo; mereka akan melihat struktur folder lengkap tetapi tidak dapat melakukan perubahan pada subrepos.

Lem
sumber