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?

ripper234
sumber
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.
Mark Longair
sumber
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.

Artefak2
sumber
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.

Adam Dymitruk
sumber
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