Saya memiliki perubahan lokal pada file yang tidak ingin saya komit ke repositori saya. Ini adalah file konfigurasi untuk membangun aplikasi pada server, tetapi saya ingin membangun secara lokal dengan pengaturan yang berbeda. Secara alami, file selalu muncul ketika saya melakukan 'git status' sebagai sesuatu yang akan dipentaskan. Saya ingin menyembunyikan perubahan khusus ini dan tidak melakukan itu. Saya tidak akan membuat perubahan lain pada file.
Setelah beberapa penggalian di sekitar, saya melihat 2 opsi: 'menganggap-tidak berubah' dan 'lewati-worktree'. Pertanyaan sebelumnya di sini berbicara tentang mereka tetapi tidak benar-benar menjelaskan perbedaan mereka. Pertanyaan saya adalah ini: bagaimana dua perintah itu berbeda? Mengapa seseorang menggunakan yang satu atau yang lain?
.gitignore
untuk tujuan yang sama. Apakah solusi ini akan berhasil untuk Anda?Jawaban:
Kamu ingin
skip-worktree
.assume-unchanged
dirancang untuk kasus-kasus di mana mahal untuk memeriksa apakah sekelompok file telah dimodifikasi; ketika Anda mengatur bit,git
(tentu saja) mengasumsikan file yang sesuai dengan bagian indeks itu belum dimodifikasi dalam copy pekerjaan. Jadi itu menghindari kekacauanstat
panggilan. Bit ini hilang setiap kali entri file dalam indeks berubah (jadi, ketika file diubah hulu).skip-worktree
lebih dari itu: bahkan ketikagit
tahu bahwa file telah dimodifikasi (atau perlu diubah olehreset --hard
atau sejenisnya), itu akan berpura-pura belum, menggunakan versi dari indeks sebagai gantinya. Ini berlanjut sampai indeks dibuang.Ada ringkasan yang baik dari konsekuensi perbedaan ini dan kasus penggunaan khas di sini: http://fallengamer.livejournal.com/93321.html .
Dari artikel itu:
--assume-unchanged
mengasumsikan bahwa pengembang tidak boleh mengubah file. Bendera ini dimaksudkan untuk meningkatkan kinerja untuk folder yang tidak berubah seperti SDK.--skip-worktree
berguna ketika Anda menginstruksikan git untuk tidak menyentuh file tertentu karena pengembang harus mengubahnya. Sebagai contoh, jika repositori utama hulu meng-host beberapa file konfigurasi siap-produksi dan Anda tidak ingin secara tidak sengaja melakukan perubahan pada file-file itu,--skip-worktree
persis seperti yang Anda inginkan.sumber
--skip-worktree
efek dan menghapus tanda bendera ada--no-skip-worktree
opsi. Cara kerjanya persis sama. Ini berguna jika ada yang tergelincir dan file yang salah ditandai, atau jika keadaan telah berubah dan file yang sebelumnya dilewati tidak boleh diabaikan lagi.--skip-worktree
dan.git/info/exclude
file adalah bahwa yang pertama akan bekerja bahkan untuk file yang saat ini dilacak..git/info/exclude
, seperti.gitignore
, hanya akan mencegah secara tidak sengaja menambahkan file yang tidak terlacak ke indeks, tetapi tidak membuat perubahan pada file yang sudah dilacak.git update-index --skip-worktree <file_name>
Catatan: fallengamer melakukan beberapa tes pada 2011 (jadi mungkin sudah ketinggalan zaman), dan inilah temuannya :
Operasi
git pull
:Git tetap mempertahankan perubahan lokal.
Dengan demikian Anda tidak akan kehilangan data apa pun yang ditandai dengan salah satu bendera secara tidak sengaja.
assume-unchanged
flag: Git tidak akan menimpa file lokal. Sebaliknya itu akan menghasilkan konflik dan saran bagaimana menyelesaikannyaskip-worktree
flag: Git tidak akan menimpa file lokal. Sebaliknya itu akan menghasilkan konflik dan saran bagaimana menyelesaikannyagit stash
git pull
skip-worktree
assume-unchanged
flag: Buang semua perubahan lokal tanpa ada kemungkinan untuk mengembalikannya. Efeknya seperti 'git reset --hard
'. 'git pull
' Panggilan akan berhasilskip-worktree
flag: Stash tidak akan berfungsi padaskip-worktree
file. 'git pull
' akan gagal dengan kesalahan yang sama seperti di atas. Pengembang dipaksa untuk mengatur ulangskip-worktree
flag secara manual untuk dapat menyembunyikan dan menyelesaikan kegagalanpull
.git pull
assume-unchanged
assume-unchanged
bendera: Konten diperbarui, bendera hilang.'
git ls-files -v
' akan menunjukkan bahwa bendera diubah keH
(darih
).skip-worktree
bendera: Konten diperbarui, bendera dipertahankan.'
git ls-files -v
' akan menampilkanS
bendera yang sama seperti sebelumpull
.git reset --hard
skip-worktree
assume-unchanged
assume-unchanged
flag: Konten file dikembalikan. Bendera diatur ulang keH
(darih
).skip-worktree
flag: Konten file utuh. Bendera tetap sama.Dia menambahkan analisis berikut:
Sepertinya
skip-worktree
sedang berusaha sangat keras untuk mempertahankan data lokal Anda . Tapi itu tidak mencegah Anda untuk mendapatkan perubahan di hulu jika itu aman. Plus git tidak menyetel ulang flagpull
.Tetapi mengabaikan perintah '
reset --hard
' bisa menjadi kejutan buruk bagi pengembang.Assume-unchanged
flag bisa hilang padapull
operasi dan perubahan lokal di dalam file tersebut sepertinya tidak penting untuk git.Lihat:
Komentar Junio (pengelola git saat ini) mengenai maksud
assume-unchanged
,Secara khusus, Junio menunjukkan bahwa perubahan pada
assume-unchanged
file dapat secara tidak sengaja dilakukan: "jika Git dapat menentukan jalur yang ditandaiassume-unchanged
telah berubah tanpa menimbulkan biaya lstat tambahan (2), ia berhak melaporkan bahwa jalur tersebut telah dimodifikasi ( sebagai hasilnya,git commit -a
bebas untuk melakukan perubahan itu). "perbedaan antara
assume-unchanged
danskip-worktree
sebagaimana dibahas dalam milis git setelah penambahanskip-worktree
tambalan .Dia menyimpulkan:
Sebenarnya tak satu pun dari bendera itu cukup intuitif .
assume-unchanged
mengasumsikan bahwa pengembang tidak boleh mengubah file. Jika file diubah - maka perubahan itu tidak penting. Bendera ini dimaksudkan untuk meningkatkan kinerja untuk folder yang tidak berubah seperti SDK.Tetapi jika janji itu rusak dan sebuah file benar-benar diubah, git mengembalikan bendera untuk mencerminkan kenyataan. Mungkin boleh saja memiliki beberapa flag yang tidak konsisten di folder yang pada umumnya tidak dimaksudkan untuk diubah.
Di sisi lain
skip-worktree
berguna ketika Anda menginstruksikan git untuk tidak menyentuh file tertentu. Itu berguna untuk file konfigurasi yang sudah dilacak.Repositori utama hulu meng-host beberapa konfigurasi siap-produksi tetapi Anda ingin mengubah beberapa pengaturan dalam konfigurasi untuk dapat melakukan beberapa pengujian lokal. Dan Anda tidak ingin secara tidak sengaja memeriksa perubahan pada file tersebut untuk memengaruhi konfigurasi produksi. Dalam hal itu
skip-worktree
membuat adegan yang sempurna.Dengan Git 2.25.1 (Februari 2020), "Sebenarnya tidak satu pun dari bendera yang cukup intuitif" yang disebutkan di atas lebih lanjut diklarifikasi:
Lihat komit 7a2dc95 , komit 1b13e90 (22 Jan 2020) oleh brian m. carlson (
bk2204
) .(Digabung oleh Junio C Hamano -
gitster
- dalam komit 53a8329 , 30 Jan 2020)( Daftar Mailing Git )
The
git update-index
halaman manual sekarang termasuk:Bagian terakhir itulah yang saya jelaskan driver filter konten khas berdasarkan skrip smudge / clean .
sumber