Apakah Anda mengabaikan submodul git di .gitignore Anda atau memasukkannya ke repo Anda?

94

Saya telah menambahkan submodule ke proyek saya project_dir/vendor/submodule_onesekarang setiap kali saya menjalankan git statussaya dapatkan modified: vendor/submodule_one (new commits).

Pertanyaan saya adalah apa cara terbaik untuk mengatasi ini? Apakah saya menambahkan vendor/submodule_one-folder ke my .gitignorekarena project utama saya tidak perlu mengetahui tentang spesifikasi submodul saya?

Atau ketika saya mengubah dan melakukan perubahan pada submodul saya, apakah saya juga perlu membuat komitmen di proyek utama saya?

Baru saja memulai dengan submodul dan sepertinya tidak dapat menemukan banyak info selain menyiapkannya.

sprysoft
sumber

Jawaban:

81

Tidak, Anda tidak perlu menambahkan submodul Anda .gitignore: apa yang akan dilihat orang tua dari submodul Anda adalah gitlink ( entri khusus,mode 160000 ).

Artinya: setiap perubahan yang langsung dibuat di submodule harus diikuti dengan komit di direktori induk.
Dengan begitu, direktori induk akan merekam komit yang tepat untuk status submodule: Komit tersebut adalah "gitlink" yang disebutkan di atas;

Anda dapat membaca lebih lanjut tentang kebijakan itu di " git submodule update (sifat sebenarnya dari submodule) ".
Ide utama di balik submodul adalah pendekatan berbasis komponen , di mana Anda mereferensikan repo lain pada komit tertentu. Tetapi jika Anda mengubah apa pun di submodul tersebut, Anda juga perlu memperbarui referensi tersebut di repo induk.


Perhatikan bahwa dengan Git 2.13 (Q2 2017), meskipun tidak mengabaikan gitlink, Anda masih dapat mengabaikan submodul dengan:

git config submodule.<name>.active false

Lihat selengkapnya di " Abaikan komit baru untuk submodul git ".


Catatan: dengan Git 2.15.x / 2.16 (Q1 2018), mengabaikan submodul lebih tepat.
" git status --ignored --untracked" tidak berhenti di pohon kerja dari proyek terpisah yang disematkan dalam direktori yang diabaikan dan file yang terdaftar di proyek lain itu, alih-alih hanya menampilkan direktori itu sendiri sebagai diabaikan.

Lihat commit fadb482 (25 Okt 2017) oleh Johannes Schindelin ( dscho) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit da7996a , 06 Nov 2017)

status: jangan bingung dengan submodul di direktori yang dikecualikan

Kami dengan cermat meneruskan excludebendera ke treat_directory()fungsi tersebut sehingga kami dapat menunjukkan bahwa file di dalamnya dikecualikan daripada tidak terlacak saat berulang.

Tapi kami belum memperlakukan submodul dengan cara yang sama.

Karena itu, git status --ignored --untrackeddengan submodul submoduledi gitignored tracked/akan menampilkan submodul di bagian " Untracked files", mis.

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

Sebagai gantinya, kami ingin menampilkan submodul di bagian " Ignored files":

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/
VonC
sumber
1
Terima kasih VonC, sangat masuk akal jika Anda mengatakannya seperti itu.
sprysoft
8
Jawaban ini membingungkan karena judul Pertanyaan menanyakan apakah akan mengabaikan folder submodule atau tidak, dan Anda menjawab dengan ya untuk pertanyaan terpisah nanti di badan pertanyaan.
SgtPooki
1
Saya pikir itu jauh lebih masuk akal sekarang, dan memberikan beberapa informasi mendalam yang sangat berguna. Luar biasa, terima kasih telah memperbarui :)
SgtPooki
Argumen untuk .gitignore: Mengapa check-in file .gitsubmodules ketika url yang terkandung di dalamnya mungkin berisi url git khusus pengguna dengan parameter nama pengguna?
djangofan
1
@djangofan pertanyaannya (dan jawaban saya) adalah tentang mengabaikan folder submodul itu sendiri (yang diwakili oleh gitlink). Bukan tentang mengabaikan .gitmodulesfile. Memang benar bahwa file yang satu ini .gitmodulesmungkin menyertakan kredensial, tetapi jika digunakan hanya untuk mengkloning repo publik, file tidak harus menyertakannya. Selain itu, mereka tetap dapat di-cache, bahkan di Windows, dengan pembantu kredensial seperti "Git Credential Manager untuk Windows" ( github.com/Microsoft/Git-Credential-Manager-for-Windows/… ). Jadi memiliki kredensial .gitmodulesbukanlah sebuah kematian.
VonC
8

Untuk beberapa alasan submodule.module-name.active tidak berfungsi untuk saya.

Itu sebabnya saya menggunakan submodule.module-name.ignore

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules - di sini Anda dapat menemukan deskripsi nilai yang mungkin untuk parameter

Berfungsi untuk saya untuk pesan (komit baru) dan (konten yang dimodifikasi).

Vladimir
sumber
1

Untuk menambah jawaban yang diterima, saya telah menemukan bahwa menambahkan folder submodul Git ke .gitignore sebenarnya menyebabkan masalah - terutama ketika mencoba membuat tiruan baru dari proyek tersebut. Secara khusus, menjalankan perintah klon submodul normal mengakibatkan folder submodul menjadi kosong:

git submodule init
git submodule update
git pull --recurse-submodules

Hanya dengan mencoba menjalankan kembali

git submodule add <Git repo> <submodule folder>

jelas apa masalahnya, berdasarkan output:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

Alih-alih menambahkan -f, saya menghapus folder submodul Git dari .gitignore dan menjalankan kembali perintah klon submodul - yang sekarang berhasil membuat folder tersebut. Saya pikir mungkin ada bug di salah satu perintah klon submodule menghormati .gitignore tetapi tidak memperingatkan bahwa itu melewatkan submodul yang sesuai.

Woodz
sumber