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?

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.


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.


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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.