Bagaimana cara mengubah submodul git agar mengarah ke subfolder?


101

Melihat -lihat tutorial SubModule , saya membuat submodule dari proyek boto . Kemudian, saya menemukan bahwa saya sebenarnya hanya membutuhkan sebagian dari proyek ini - khususnya, folder boto .

Saya ingin mengubah submodul saya agar mengarah ke folder ini. Saat saya melihat .gitmodules, saya mengerti

[submodule "backup/src/boto"]
    path = backup/src/boto
    url = https://github.com/boto/boto.git

URL apa yang harus saya gunakan selain https://github.com/boto/boto.git ? Setelah saya mengubah URL, haruskah saya menghapus folder boto secara lokal dan menarik kembali?


3
Ini tidak persis seperti yang Anda inginkan - bukan submodul - tetapi Anda mungkin bisa melihatnyagit subtree
Cascabel

1
Apa yang akhirnya saya lakukan adalah memiliki seluruh submodul, dan memberi tahu IntelliJ bahwa folder boto adalah 'folder sumber', sehingga ia dapat menemukan paket di dalamnya.
ripper234

15
Aku tidak percaya git tidak melakukan ini secara asli ... astaga.
rogerdpack

2
Menemukan pertanyaan serupa - stackoverflow.com/questions/1121227/…
sashoalm

Jawaban:


65

Sayangnya, URL untuk submodul selalu mengarah ke repositori - Anda tidak dapat menentukan bahwa Anda hanya menginginkan subfolder dari repositori, dengan cara yang sama seperti git tidak mendukung "klon sempit" secara umum.

Jika Anda tidak dapat hidup dengan memiliki seluruh repositori sebagai submodule, Anda selalu dapat membuat repositori baru yang dikloning dari boto dan kemudian menyiapkan tugas cron untuk:

  1. git fetch repositori itu ke dalam direktori
  2. Gunakan git filter-branchuntuk memperbarui cabang di mana subdirektori berada di tingkat teratas.
  3. Tambahkan cabang repositori itu sebagai submodul. Namun, itu semua agak rumit dan preferensi saya hanya akan hidup dengan memiliki seluruh repositori sebagai submodule.

24

Anda tidak dapat menggandakan hanya sebagian dari repositori. Ini karena git memperlakukan repositori sebagai objek keseluruhan: ketika Anda mendapatkannya, Anda mendapatkan semuanya .

Jadi, solusinya di sini adalah mengambil submodule di direktori lain, lalu menggunakan symlink untuk mencapai tujuan Anda.


Saya memiliki symlink di windows ... bekerja dengan baik juga. (itu karena msys saya ada di mesin saya, jadi saya bisa menggunakan ln -sseperti di linux)
kumarharsh

7
Vista dan & dilengkapi dengan MKLink. Saya menggunakan itu. howtogeek.com/howto/windows-vista/…
Angel S. Moreno

1
Anda dapat menggunakan tautan keras sebagai gantinya
KindDragon

15

Yang ingin Anda lakukan adalah membuat cabang di submodule dan memindahkan folder ke atas dan menghapus apa yang tidak Anda perlukan. Anda kemudian dapat mengelola cabang itu sebagai gantinya. Jika Anda ingin mendorong perubahan Anda, Anda harus dapat menggabungkan kembali terlebih dahulu. Git akan mengetahui bahwa Anda telah memindahkan berkas dan berhasil melakukan penggabungan.

Semoga ini membantu.


Apa yang dimaksud dengan "penggabungan kembali"? Bisakah Anda memberikan contoh?
Sukima

penggabungan yang berjalan "upstream" - dari cabang orde tinggi ke orde lebih rendah. Linus membenci itu. Mereka mengikat sejarah dari cabang lain yang mungkin telah digabungkan.
Adam Dymitruk

Bisakah Anda menambahkan beberapa contoh tentang "penggabungan kembali" dalam situasi ini?
Xiao

Biasanya itu terjadi ketika Anda mencoba dan menjaga cabang fitur Anda tetap terkini dengan menggabungkan hal-hal dari cabang jalur utama tempat setiap orang menggabungkan perubahan terbaru mereka. Ini buruk karena mengikat cabang Anda dengan pekerjaan orang lain. Jika produk memerlukan cabang Anda tetapi tidak salah satu dari yang lain sudah ada di cabang integrasi, itu tidak mungkin.
Adam Dymitruk

ide yang menarik, apakah ada yang mencoba ini? Saya akan segera mencoba, tetapi masih belum yakin bahwa "penggabungan kembali" dapat menjadi jelas dan otomatis ...
moudrick
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.