Bagaimana cara mengatur proyek git untuk menggunakan submodule repo eksternal?

213

Saya ingin membuat repo yang menarik repo jarak jauh.

Misalnya, katakanlah jQuery sebagai submodule:

git://github.com/jquery/jquery.git

Apa yang akan menjadi proses membuat repo dengan jQuery sebagai submodule dan menambahkan eksternal saya sendiri sebagai repo jarak jauh.

Juga setelah pengaturan ini, jika saya mendorong / menarik ke remote saya sendiri, akankah eksternal tetap utuh?

Tom
sumber
1
Ketika Anda mengatakan "tarik", apakah Anda mengatakan Anda ingin repo jQuery menjadi submodule dari repo Anda sendiri?
ezod
Ya persis, maaf jika itu tidak jelas. Saya ingin tahu bagaimana saya mengatur ini sebagai eksternal sambil mendorong dan menarik perubahan ke remote saya sendiri
Tom
Lihat Tutorial Submodule Git pada git wiki.
Greg Bacon

Jawaban:

343
  1. Anda memiliki proyek - sebut saja MyWebApp yang sudah memiliki repo github
  2. Anda ingin menggunakan repositori jquery di proyek Anda
  3. Anda ingin menarik repo jquery ke proyek Anda sebagai submodule .

Submodules sangat, sangat mudah untuk dirujuk dan digunakan. Dengan asumsi Anda sudah memiliki MyWebApp diatur sebagai repo, dari terminal mengeluarkan perintah ini:

cd MyWebApp
git submodule add git://github.com/jquery/jquery.git externals/jquery

Ini akan membuat direktori bernama externals/jquery* dan menautkannya ke gudang jquery github. Sekarang kita hanya perlu memasukkan submodule dan mengkloning kodenya:

git submodule update --init --recursive

Anda sekarang harus memiliki semua kode terbaru yang diklon ke submodule. Jika perubahan repo jquery dan Anda ingin menarik kode terbaru ke bawah, hanya mengeluarkan submodule updateperintah lagi. Harap dicatat: Saya biasanya memiliki sejumlah repositori eksternal dalam proyek saya, jadi saya selalu mengelompokkan repositori tersebut di bawah direktori "eksternal".

Pro Git Book online memiliki beberapa informasi bagus tentang submodula (dan git pada umumnya) yang disajikan dengan cara yang mudah dibaca. Bergantian, git help submodulejuga akan memberikan informasi yang baik. Atau lihat Tutorial Submodule Git di git wiki.

Saya perhatikan entri blog ini yang berbicara tentang submodula dan membandingkannya dengan svn: mekanisme eksternal Subversion: http://speirs.org/blog/2009/5/11/understanding-git-submodules.html

* Sebagai praktik terbaik, Anda harus selalu menempatkan submodul Anda di direktori mereka sendiri, seperti Eksternal. Jika tidak, direktori proyek root Anda bisa menjadi sangat berantakan dengan sangat cepat.

memmons
sumber
4
Penjelasan hebat! :) Juga, "git help submodules" membantu jika Anda ingin sedikit lebih detail, internal, dll.
WhyNotHugo
2
Terima kasih, persis apa yang saya butuhkan.
MikeSchinkel
1
@Chevi Tergantung pada kebutuhan Anda. Secara umum, menambahkan proyek git sebagai submodule ke proyek Anda adalah solusi yang baik untuk proyek yang sering berubah atau masih dalam pengembangan. Ini memungkinkan Anda untuk dengan mudah memastikan bahwa semua kode pihak ke-3 dalam proyek Anda mutakhir. Untuk kode pihak ketiga yang pada dasarnya statis - stabil, kode matang yang mungkin tidak akan banyak berubah dari versi ke versi - menggunakan submodule tidak memberikan banyak nilai.
memmons
2
maaf tapi dibandingkan dengan svn eksternal, itu tidak mudah
Keil
2
@ Keil Ini adalah dua perintah, git submodule adddan git submodule update... Saya tidak yakin seberapa mudah bisa didapat.
memmons
24

Sebagian besar yang perlu Anda ketahui sudah dijawab, jadi saya tidak akan repot mengatasinya, namun, saya telah menemukan sedikit informasi yang biasanya hilang.

Seperti yang Anda ketahui, "git pull" tidak akan memperbarui submodules, dan "git submodules update" juga tidak akan mengunduh HEAD terbaru dari submodules tersebut.

Untuk memperbarui semua submodul Anda ke revisi hulu terbaru, Anda dapat menggunakan

git submodule foreach git pull

Jika Anda sering mengubah submodules Anda, dan memiliki banyak, maka "git foreach" akan menjadi sangat berharga.

WhyNotHugo
sumber
0

Saya kira jawaban @Hugo bisa seperti yang Anda butuhkan dan berfungsi dengan baik. Jadi saya telah menemukan cara yang lebih mudah.

git submodule update --remote

Itu saja.

Jadi alur kerja yang lengkap bisa menjadi:

git clone project-with-submodules
git submodule init
git config -l
git submodule update --remote
Dapaldo
sumber