Catatan: fallengamer melakukan beberapa tes pada 2011 (jadi mungkin sudah ketinggalan zaman), dan inilah temuannya :
Operasi
- File diubah baik dalam repositori lokal dan upstream
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.
- File dengan
assume-unchanged
flag: Git tidak akan menimpa file lokal. Sebaliknya itu akan menghasilkan konflik dan saran bagaimana menyelesaikannya
- File dengan
skip-worktree
flag: Git tidak akan menimpa file lokal. Sebaliknya itu akan menghasilkan konflik dan saran bagaimana menyelesaikannya
- File diubah baik dalam repositori lokal dan upstream, tetap mencoba untuk menarik.
Menggunakan hasil dalam beberapa pekerjaan manual tambahan, tetapi setidaknya Anda tidak akan kehilangan data apa pun jika Anda memiliki perubahan lokal.
git stash
git pull
skip-worktree
- File dengan
assume-unchanged
flag: Buang semua perubahan lokal tanpa ada kemungkinan untuk mengembalikannya. Efeknya seperti ' git reset --hard
'. ' git pull
' Panggilan akan berhasil
- File dengan
skip-worktree
flag: Stash tidak akan berfungsi pada skip-worktree
file. ' git pull
' akan gagal dengan kesalahan yang sama seperti di atas. Pengembang dipaksa untuk mengatur ulang skip-worktree
flag secara manual untuk dapat menyembunyikan dan menyelesaikan kegagalan pull
.
- Tidak ada perubahan lokal, file upstream berubah
Kedua flag tidak akan mencegah Anda mendapatkan perubahan upstream. Git mendeteksi bahwa Anda melanggar janji dan memilih untuk mencerminkan kenyataan dengan mengatur ulang bendera.
git pull
assume-unchanged
- File dengan
assume-unchanged
bendera: Konten diperbarui, bendera hilang.
' git ls-files -v
' akan menunjukkan bahwa bendera diubah ke H
(dari h
).
- File dengan
skip-worktree
bendera: Konten diperbarui, bendera dipertahankan.
' git ls-files -v
' akan menampilkan S
bendera yang sama seperti sebelum pull
.
- Dengan file lokal diubah,
Git tidak menyentuh file dan mencerminkan kenyataan (file yang dijanjikan tidak akan berubah sebenarnya telah diubah) untuk file.
git reset --hard
skip-worktree
assume-unchanged
- File dengan
assume-unchanged
flag: Konten file dikembalikan. Bendera diatur ulang ke H
(dari h
).
- File dengan
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 flag pull
.
Tetapi mengabaikan perintah ' reset --hard
' bisa menjadi kejutan buruk bagi pengembang.
Assume-unchanged
flag bisa hilang pada pull
operasi dan perubahan lokal di dalam file tersebut sepertinya tidak penting untuk git.
Lihat:
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 )
doc
: menghalangi pengguna untuk mencoba mengabaikan file yang dilacak
Ditandatangani oleh: Jeff King
Ditandatangani oleh: brian m. carlson
Sangat umum bagi pengguna untuk ingin mengabaikan perubahan pada file yang dilacak Git.
Skenario umum untuk kasus ini adalah pengaturan IDE dan file konfigurasi, yang umumnya tidak boleh dilacak dan mungkin dihasilkan dari file yang dilacak menggunakan mekanisme templating.
Namun, pengguna belajar tentang bit asumsi-tidak berubah dan lewati-worktree dan mencoba menggunakannya untuk melakukan hal ini.
Ini bermasalah, karena ketika bit-bit ini diatur, banyak operasi berperilaku seperti yang diharapkan pengguna, tetapi mereka biasanya tidak membantu ketika git checkout
perlu mengganti file.
Tidak ada perilaku yang masuk akal dalam kasus ini, karena kadang-kadang data berharga, seperti file konfigurasi tertentu, dan terkadang itu adalah data yang tidak relevan yang dengan senang hati akan dibuang oleh pengguna.
Karena ini bukan konfigurasi yang didukung dan pengguna cenderung menyalahgunakan fitur yang ada untuk tujuan yang tidak diinginkan, menyebabkan kesedihan dan kebingungan umum , mari mendokumentasikan perilaku yang ada dan perangkap dalam dokumentasi untuk git update-index
sehingga pengguna tahu mereka harus mencari solusi alternatif.
Selain itu, mari berikan solusi yang disarankan untuk menangani kasus umum file konfigurasi, karena ada pendekatan terkenal yang berhasil digunakan di banyak lingkungan.
The git update-index
halaman manual sekarang termasuk:
Pengguna sering mencoba menggunakan bit assume-unchanged
dan skip-worktree
memberi tahu Git untuk mengabaikan perubahan pada file yang dilacak. Ini tidak berfungsi seperti yang diharapkan, karena Git masih dapat memeriksa file pohon kerja terhadap indeks saat melakukan operasi tertentu. Secara umum, Git tidak menyediakan cara untuk mengabaikan perubahan pada file yang dilacak, sehingga solusi alternatif disarankan.
Sebagai contoh, jika file yang ingin Anda ubah adalah semacam file config, repositori dapat menyertakan contoh file config yang kemudian dapat disalin ke nama yang diabaikan dan diubah. Repositori bahkan dapat menyertakan skrip untuk memperlakukan file sampel sebagai templat, memodifikasi dan menyalinnya secara otomatis.
Bagian terakhir itulah yang saya jelaskan driver filter konten khas berdasarkan skrip smudge / clean .
.gitignore
untuk tujuan yang sama. Apakah solusi ini akan berhasil untuk Anda?