Saya telah membuat versi standar dari file yang termasuk dalam repositori git. Sangat penting bahwa ketika seseorang mengkloning repositori, mereka mendapatkan salinan file ini. Namun, saya ingin mengatur git sehingga mengabaikan perubahan pada file ini nanti. .gitignore
hanya berfungsi pada file yang tidak dilacak.
Motivasi saya adalah bahwa file ini berisi informasi spesifik mesin. Saya ingin memberikan nilai-nilai default, sementara memungkinkan orang untuk membuat perubahan lokal yang tidak akan didorong kembali ke repositori asal, menciptakan konflik gabungan ketika kita menarik perubahan baru.
Kami umumnya cukup malas dan git add .
banyak menggunakan , jadi saya cukup yakin jika saya tidak dapat memberitahu git untuk mengabaikan file ini, perubahan pada file tersebut akan berakhir dengan komitmen dan dorongan.
Untuk meringkas,
- Saya ingin membuat file, sebut saja
default_values.txt
yang ditambahkan ke repositori git saya dan disertakan ketika seseorang mengkloning repositori itu. git add .
seharusnya tidak menambahdefault_values.txt
komit.- Perilaku ini harus diteruskan ke klon repositori mana pun.
sumber
Jawaban:
Seperti yang banyak orang lain katakan, solusi modern yang baik adalah:
Itu akan mengabaikan perubahan pada file itu, baik lokal maupun upstream, hingga Anda memutuskan untuk mengizinkannya lagi dengan:
Anda bisa mendapatkan daftar file yang ditandai dilewati dengan:
Perhatikan bahwa tidak seperti itu
--skip-worktree
,--assume-unchanged
status akan hilang setelah perubahan hulu ditarik.sumber
--no-skip-worktree
untuk menambahkan perubahan mereka.--skip-worktree
status file sebelum Anda dapat beralih cabang, jika file yang sama dilacak di cabang lain.git status
, tetapi ketika saya mencoba untuk checkout ke cabang yang berbeda, saya punyaerror: Your local changes to the following files would be overwritten by checkout:
, bahkan -f tidak membantuerror: Entry 'wix-stores-merchant-app/demo/credentials.js' not uptodate. Cannot merge.
git ignore
dangit unignore
.Apa yang Anda cari adalah
git update-index --assume-unchanged default_values.txt
.Lihat dokumen untuk detail lebih lanjut: http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html
sumber
skip-worktree
alih-alihassume-unchanged
lebih banyak info stackoverflow.com/questions/13630849/…Pendekatan yang saya lihat pada umumnya adalah membuat file dengan nama yang berbeda, misalnya: default_values_template.txt dan meletakkan default_values.txt di .gitignore Anda. Instruksikan orang untuk menyalin default_values_template.txt ke default_values.txt di ruang kerja lokal mereka dan buat perubahan seperlunya.
sumber
.sample
akhiran. Jadi dalam kasus Andadefault_values.txt.sample
Lihatlah skrip smudge / clean. Dengan cara ini Anda dapat mengontrol versi file tetapi ketika diperiksa, Anda akan "noda" dengan mengganti data generik / tempat-pemegang dengan data spesifik mesin dalam file.
Saat Anda mengkomitnya, Anda akan "membersihkannya" dengan mengganti informasi spesifik mesin dengan informasi umum atau tempat-dudukan.
Naskah noda / bersih harus bersifat deterministik karena menerapkannya berkali-kali, dalam urutan yang berbeda akan sama dengan hanya menjalankan yang terakhir dalam urutan.
Hal yang sama dapat diterapkan dengan kata sandi jika Anda perlu mengekspos repositori Anda tetapi isinya mungkin berisi informasi sensitif.
sumber
user.json
yang perlu ditimpa dengan setiap pengembang kredit, tetapi saya tidak ingin dev secara tidak sengaja memeriksa kredit mereka.Saya telah memecahkan ini dengan mendefinisikan filter "bersih" untuk hanya menyimpan isi file dalam indeks.
git show :path/to/myfile
seharusnya hanya mencetak isi indeks untuk file yang ditentukan, jadi kita bisa menggunakannya dalam skrip untuk mengganti copy pekerjaan dengan salinan yang tidak tersentuh dalam indeks:Tetapkan itu sebagai filter "bersih" untuk file yang bersangkutan (dengan asumsi Anda telah memasukkannya ke "discard_changes"):
Sayangnya saya tidak dapat menemukan cara untuk membuat generalisasi ini ke banyak file, karena tidak ada cara untuk mengetahui file mana yang kami proses dari dalam skrip bersih. Tentu saja, tidak ada yang menghentikan Anda untuk menambahkan aturan filter yang berbeda untuk setiap file, tetapi ini agak tidak jelas.
sumber
Saya menemukan solusi yang berfungsi untuk tim saya. Kami membagikan githook kami melalui symlink dan setelah menambahkan file template ke git, saya menambahkan hook pre-commit yang memeriksa apakah file template telah dimodifikasi dan jika demikian saya
git reset -- templatefile.txt
. Jika itu satu-satunya file yang diubah saya juga membatalkan komit.sumber
Saya sarankan melihat submodules. Jika Anda menempatkan file spesifik mesin dalam submodule, git add harus mengabaikannya.
sumber